Trabajando con Ext Js y servicios web en php, tenemos el eterno problema de la codificación. Después de mucho probar y casi volverme loco, he conseguido que las cosas funciones como deben. Voy a dar unos consejos a seguir para tratar de ayudaros, si bien en ese tiempo dedicado al rastreo por internet he comprobado que cada uno tiene un caso distinto y lo que le funciona a unos no lo sirve a otros.

Consejos:

 

1.- Prestar atención a la codificación del fichero php que genera las salidas json. En eclipse, aptana y demás derivados del primero, sobre todo si trabajamos en un mac, es posible que el fichero este codificado en MacRoman que es la codificación por defecto. Para cambiarlo nos vamos al explorador de proyectos que suele estar en el lado izquierdo, marcamos el fichero y con el botón derecho del ratón pulsamos en properties (propiedades). En la parte inferior seleccionamos Other:UTF-8.

 

2.- Cuando Ext Js envía información al servidor tenemos que tratarla antes de enviarla a una base de datos. Lo haríamos así:

 

 

$texto_a_insertar= "'".utf8_decode( mysqli_real_escape_string( $Objeto_Conexion,$texto_a_insertar))."'";

 

 

Con esta linea salvamos las comillas simples que puedan venir dentro del texto a través de mysqli_real_escape_string, para los casos de O'braian y cosas así, y por otro lado decodificamos las palabrás con acentos o ñ, tales como Víctor, éxito, etc. Estas palabras llegan de la siguiente forma : “\u00e9xito", y con utf_decode las convertimos a un formato entendible por MYSQL y PHP, de lo contrario la insertará tal como viene. Ver otras funciones como htmlentities, addsplash, interesantes para el tema de la injección de código.

 

3.- Cuando tengamos que envíar un listado en formato JSON recorremos el bucle de la siguiente manera:

$result=array(); //esta es la matriz donde almacenamos toda la información a enviar

$row_arr=array();

$result['total']=$resultdb->num_rows;

if ($resultdb){

while ($record=$resultdb->fetch_assoc()) {

array_push($row_arr,array_map('utf8_encode',$record));

 }//cierre del bucle

}//cierre del if

Fijaros como usamos la función array_map y le aplicamos a todos los elementos del array $record que representa al registro la función utf8_encode.

 

Por último añadimos el array $row_arr con todos los registros parseados al array $result['data']:

$result['data']=$row_arr;

$result['msg']='Satisfactorio';

 

Finalmente enviamos la información:

echo json_encode($result);

Le aplicamos la función json_encode a todo el array $result

 

4.- Cuando queramos mandar un simple mensaje por JSON del tipo “El registro se ha insertado satisfactoriamente”, hacemos lo siguiente:

Preparamos la cabecera de la respuesta, para estas cosas se suele crear una clase con todas las funciones de utilería:

 

class Util{

public static function sendMsg($texto, $status=0, $header_text=''){

$status_header = 'HTTP/1.1 200 '. (isset($header_text))?$header_text:'Servicio Web Internetia';

header($status_header);

header('Content-Type: application/json;charset: utf-8');

$result=array();

$result['success']=($status==0)?false:true;

$result['msg']=$texto;

$result['task']=$_REQUEST['task'];

echo json_encode($result);

exit();

 }

}

 

Llamamos a la función Util::sendMsg("Registros insertados con éxito",1);

Si observáis no hemos aplicado útf8_encode en ningún momento.Pero para ello es importante tener en cuenta los pasos previos, es decir, que el documento .php este en formato utf. La cadena que se envía es la siguiente:

 

{"success":true,"msg":"Registros insertados con \u00e9xito","task":"add"}

 

Por último llega el momento de recogerlo con ExtJs. En el listener del store lo recogemos y aplicamos la función Ext.JSON.decode(texto_respuesta), del siguiente modo.

 

 

this.listen({

store: {

'#nombre_store': {

write:  function (store, operation, options){

res=Ext.JSON.decode(operation.response.responseText);

Ext.Msg.alert('Satisfactorio!', res.msg );

store.reload();

}

}

}

});

 

En este ejemplo aquellos que estéis familiarizados con el MVC de Ext Js, sabréis que estamos interceptando el evento write del store desde el controlador, no obstante lo importante ahora es la función, en ella a través del objeto operation accedemos a la respuesta del servidor, le aplicamos la función Ext.JSON.decode y mostramos la propiedad msg del objeto response.

Espero que os ayude y os ahorre tiempo.

 

 

Escribir un comentario


Código de seguridad
Refescar

Newsletters





Joomla Extensions powered by Joobi
Scroll to top

Este sitio usa cookies propias y de terceros para realizar el análisis de navegación de los usuarios. Si continua navegando, consideramos que acepta su uso. Ver política de cookies