Está en la página 1de 19

Trabajas con SJON desde PHP http://www.desarrolloweb.com/manuales/php-json.

html

Informacin sobre las distintas libreras y opciones para utilizar la notacin de objetos Javascript JSON en programas realizados con el lenguaje PHP.
Por Miguel Angel Alvarez JSON es una notacin Javascript para escribir objetos que se ha hecho bastante popular en el mundo del desarrollo de webs y que se utiliza en diversos lenguajes de programacin, componentes (habitualmente Ajax), etc. Su xito se debe a que es una excelente forma para almacenar informacin que deseamos compartir entre distintos componentes o lenguajes de las aplicaciones web. Si trabajamos con Ajax y alguno de los frameworks Javascript existentes, ya habremos notado esta posibilidad y posiblemente ya estemos utilizando JSON o una notacin similar. JSON, cuyas siglas significan JavaScript Object Notation (en espaol Notacin de Objetos de JavaScript), es un formato ligero, fcil de escribir o codificar, as como tambin es fcil de leer por los seres humanos. Desde Javascript podemos procesar directamente cualquier objeto JSON y existen libreras para la mayora de los lenguajes de programacin que tienen funciones para interpretar este formato. Por ello se ha adoptado universalmente. Para ms informacin podemos visitar el sitio web de JSON en http://www.json.org/. Esto quiere decir que con JSON podemos comunicar datos fcilmente entre scripts Javascript y scripts PHP. Por ejemplo, pensemos en una validacin de formulario que se desea hacer con Ajax. Los datos del formulario se pueden enviar a PHP por medio de POST y luego podramos desde PHP enviar a Javascript el resultado de validar esos datos en el servidor. Como la validacin puede ser positiva o negativa, as como puede tener ms o menos cdigos de error y acciones a realizar dependiendo de la informacin procesada, el script PHP tiene que mandar una respuesta ms o menos elaborada al script Javascript y una posibilidad es enviar esos datos desde PHP utilizando la notacin JSON.

Disponibilidad de las funciones JSON en PHP

PHP dispone de varias funciones para hacer distintos tratamientos con notacin de objetos JSON, que permite convertir un objeto PHP, o cualquier otro tipo de variable, a un string con notacin JSON, as como crear un objeto PHP a partir de un string codificado con JSON. En PHP, como decamos, es posible producir y consumir datos cargados con notacin JSON, por medio de unas funciones de las que dispone el lenguaje, que existen de manera predeterminada en los servidores modernos de PHP y que se pueden utilizar tambin en instalaciones antiguas de PHP, aunque con algn trabajo de instalacin adicional. A partir de PHP 5.2 las funciones JSON estn disponibles siempre, pero si utilizamos por ejemplo PHP 4 tendramos que instalarlas manualmente. Para ello existen varios paquetes de libreras, que provienen de diversas fuentes, que tienen funciones para tratar con JSON desde PHP. - Paquete JSON de PECL Este paquete, del repositorio de libreras PHP PECL, es compatible con PHP 4.3.0 o superior. En versiones superiores a PHP 5.2 est disponible por defecto. En versiones anteriores del lenguaje se tendra que instalar de manera separada. - Librera JSON-PHP Es una librera de funciones que se conoce tambin con el nombre de "Services_JSON". Originariamente escrita por Michal Migurski, en la actualidad se encuentra disponible dentro del framework PHP PEAR:http://pear.php.net/package/Services_JSON - JSON Lib en Zend Framework Es una librera de funciones para tratamiento con JSON que forma parte del framework PHP Zend. - XML-RPC para PHP Por medio de una extensin para la librera php-xmlrpc, tambin se puede tratar con notacin de objetos JSON. Las particularidades de cada sistema son ligeramente distintas. Cabe decir que la ms interesante sera la primera, que forma parte de PECL, puesto que est escrita en C y por tanto ser ms rpida de ejecutarse, al formar parte de los componentes nativos de PHP. Como decimos slo podremos disponer de ella a partir de PHP 5.2, pero en servidores antiguos tendramos que instalarla aparte, lo que a menudo ser complicado, o incluso imposible para sitios web en produccin y en un alojamiento compartido.

As que, si nuestro servidor PHP no dispone de las funciones JSON por estar poco actualizado, nos costar mucho menos esfuerzo y dolores de cabeza utilizar otra librera distinta a la bsica de PECL. En este caso, por la facilidad de instalacin, se recomendara la utilizacin de la librera que viene en PEAR, que se puede descargar del propio sitio de PEAR, en la URL http://pear.php.net/package/Services_JSON
Nota: Hemos publicado en DesarrolloWeb.com en pasados artculos algunas referencias tiles para instalar PEAR y utilizar algunos componentes de este framework PHP.este framework PHP.

Existe un artculo muy interesante, aunque en ingls, que compara las diversas libreras existentes para usar JSON desde PHP, que contiene diversas informaciones tcnicas, requisitos y un anlisis del desempeo de cada una. En el prximo artculo explicaremos cmo utilizar las funciones JSON en PHP por medio de las funciones nativas del lenguaje.

Mostramos el modo de producir una cadena con notacin JSON a partir de variables y objetos de PHP con la funcin json_encode().
Por Miguel Angel Alvarez En este artculo vamos a mostrar cmo crear un JSON desde PHP con las funciones nativas del lenguaje de programacin del lado del servidor. Adems veremos varias particularidades de la creacin de cadenas de texto con notacin JSON desde PHP, que son importantes de conocer para no caer en problemas comunes de este tipo de operaciones. Como ya comentamos en el artculo anterior, en el que presentamos las libreras ms fundamentales hacer JSON desde PHP, existen diversas formas para implementar funcionalidades de procesamiento de archivos JSON desde PHP. En concreto en este artculo vamos a ver las funciones nativas de PHP que sirven para este tema, que se encuentran disponibles desde la versin de PHP 5.2. Cabe recordar, no obstante, que estas mismas funciones nativas se pueden instalar por separado, si es que no las tenemos y que existen otras libreras que tambin ofrecen posibilidades similares. Veremos entonces cmo producir cadenas con notacin JSON a partir de variables simples, arrays y objetos PHP.

Crear un JSON desde PHP

Para crear una cadena para expresar un objeto u otro tipo de variable con JSON en PHP se dispone de una funcin llamada json_encode(), que recibe lo que deseamos convertir en notacin JSON y devuelve una cadena de texto con el JSON producido. Podemos convertir en JSON cualquier cosa que necesitemos, como una cadena, una variable numrica, un array -normal o asociativo- y objetos con todo tipo de datos dentro. Veremos varios ejemplos que ilustrarn este proceso.

$mivariable = "hola"; print_r(json_encode($mivariable));

Esto devuelve:

"hola"

Ahora convertimos un array normal:

$miArray = array(1,4,6,8,3,34.8,9,43); print_r(json_encode($miArray));

Que devuelve:

[1,4,6,8,3,34.8,9,43]

Estos ejemplos anteriores son sin duda quizs demasiado simples, pero la cosa empieza a tener sentido cuando se convierte un array asociativo en JSON, como se puede ver a continuacin.

$miArray = array("manzana"=>"verde", "uva"=>"Morada", "fresa"=>"roja"); print_r(json_encode($miArray));

{"manzana":"verde","uva":"Morada","fresa":"roja"}

Este resultado ya tiene una forma parecida a lo que estamos acostumbrados a ver en JSON. Podramos fijarnos que la cadena que devuelve no tiene saltos de lnea e identacin de los elementos, con lo que la lectura se dificulta un poco por seres humanos. No obstante, podramos utilizar esa cadena para crear una variable Javascript y por supuesto podremos acceder a cualquier valor del JSON, de una manera parecida a esta:

<script> JSONFrutas = eval(<?php echo json_encode($miArray);?>); alert(JSONFrutas.manzana); </script>

Como se ha visto, para almacenar el JSON en una variable Javascript, sin almacenar la propia cadena, sino el objeto que representa, tenemos que utilizar la funcin Javascript eval(). Luego podemos acceder a los componentes del JSON como lo hacemos con cualquier objeto, variable, operador punto y luego el nombre de la propiedad a acceder.

Crear un objeto con PHP y convertirlo en JSON

Como deca, lo bonito es que desde PHP podemos convertir cualquier objeto que tengamos, para generar el JSON del mismo y poder enviarlo a Javascript o cualquier otro lenguaje o componente que necesitemos que lo procese. El mecanismo es exactamente igual, con la salvedad que primero tenemos que crear una clase, instanciar un objeto y luego convertirlo a JSON con json_encode(). As crearamos una clase e instaciaramos ojetos con ella.

//creo una clase arbol class NodoArbolDHTML{ var $nombre; var $url; var $hijos;

function __construct($nombre,$url){ $this->nombre = $nombre; $this->url = $url; }

function anadirHijo($nodoHijo, $nombre){ if (!isset($this->hijos)){ $this->hijos = array(); } $this->hijos[$nombre] = $nodoHijo; } }

//aadir un hijo

Como se ha visto, se ha implementado una clase NodoArbolDHTML, con la que podramos crear una estructura de rbol. El rbol tiene distintos nodos y cada uno a su vez tiene un nombre, una URL y un conjunto que hijos, que tambin son nodos del rbol. Ahora, podramos instanciar objetos tipo nodo, para crear el rbol, de la siguiente manera.

$raiz = new NodoArbolDHTML("Raiz", "http://www.loquesea.com"); $miNodo = new NodoArbolDHTML("Mi arbolito", "http://www.oi.com"); $raiz->anadirHijo($miNodo, "loquesea"); $miNodo2 = new NodoArbolDHTML("Mi otro nodo", "http://www.as.com"); $raiz->anadirHijo($miNodo, "otro");

Con esto ya tenemos la mayor parte del trabajo creado, porque para producir el JSON simplemente tenemos que llamar a la funcin json_encode(), que ya hemos visto repetidas veces:

print_r(json_encode($raiz));

Con esto mostraramos en la pgina la cadena:

{"nombre":"Raiz","url":"http://www.loquesea.com","hijos":{"loqesea":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null},"otro":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null}}}

Nota: Las barras de "http://" estn bien escritas, aunque aparezcan como "http://", lo que pasa es que PHP se les coloca una contrabarra como caracter de escape.

De nuevo la forma como se muestra la cadena no tiene muy fcil lectura, por la falta de saltos de lnea y los identados. Pero bueno, eso no es problema para Javascript, como podremos ver en el cdigo siguiente, que ilustra la manera en que podemos utilizar ese JSON para crear objetos en el cliente.

<?php $arbol_php = json_encode($raiz); ?> <script> var arbolJavascript = eval(<?php echo $arbol_php;?>); alert(arbolJavascript.hijos.loquesea.nombre); alert(arbolJavascript.hijos.otro.url); </script>

Escapar caracteres especiales en cadenas JSON

En la notacin JSON se utiliza Unicode como juego de caracteres, por su universalidad. Por tanto, en Unicode hay determinados caracteres, como pueden ser la ee, letras con acentos, etc, que tienen que convertirse en sus correspondientes cdigos de escape para que todo funcione correctamente. Por ejemplo, la letra "" tiene el cdigo "u00f1". En las cadenas que utilizamos en la notacin JSON se deben colocar entonces caracteres Unicode, excepto las comillas dobles (que se utilizan para delimitar la cadena y por tanto se debe escapar) y la barra invertida, que es el carcter de escape. Afortunadamente, la funcin PHP json_encode() hace la conversin de las cadenas a Unicode automticamente, por lo que no nos deberamos preocuparnos por este detalle, sin embargo, PHP toma de manera predeterminada que la cadena de origen est en UTF-8, por lo que, si trabajamos con archivos en ISO-8859-1, tendremos que convertirlos antes a UTF-8. Por ejemplo, en mi ejemplo PHP, que tengo en mi ordenador guardado con ISO-8859-1, si intento crear un JSON de esta manera:

$miArray = array("Pars"=>"Francia", "Madrid"=>"Espaa"); print_r(json_encode($miArray));

Obtengo la siguiente cadena:

{null:"Francia","Madrid":null}

Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen caracteres distintos del alfabeto ingls.

<?php $miArray = array(utf8_encode("Pars")=>"Francia", "Madrid"=>utf8_encode("Espaa")); print_r(json_encode($miArray)); ?>

Con lo que obtengo la siguiente cadena codificada con JSON:

{"Paru00eds":"Francia","Madrid":"Espau00f1a"}

Con este artculo de desarrolloweb .com ya hemos visto cmo podemos producir cadenas con notacin JSON a partir de variables, arrays u objetos. Esperamos que haya sido instructivo y os citamos para el prximo artculo, en el que veremos cmo crear variables u objetos PHP a partir del contenido de cadenas JSON.

Veremos cmo crear objetos o variables PHP a partir de una cadena de texto con notacin JSON.
Por Miguel Angel Alvarez PHP puede interpretar datos provenientes de una cadena con notacin JSON, de modo que se puedan guardar en variables y luego utilizarlas en los scripts del lado del servidor. En este articulo veremos cmo hacerlo y adems destacaremos una serie de consejos para que los JSON estn bien formados y consigamos una correcta interpretacin. Recordemos que existen diversas libreras para que podamos trabajar con cadenas en notacin JSON, que vimos en el artculo de libreras disponibles en PHP para JSON. Nosotros estamos utilizando para estos artculos de desarrolloweb.com las funciones nativas de PHP para JSON, que estn disponibles por defecto desde PHP 5.2. Primero vamos a mostrar un objeto definido con JSON mediante Javascript, para hacer unas comprobaciones y saber si est bien construido.

<script> var objJson = { elemento1: "valor1", elemento2: 22, elemento3: null, masCosas: { voy: "ya", vengo: "despues" } } alert(objJson.elemento1) alert(objJson.masCosas.vengo) </script>

Este script Javascript, ejecutado en un navegador, nos mostrara dos mensajes de alerta con valores que se han colocado en el objeto definido con notacin JSON. Esto no tiene nada que ver con lo que vamos a ver sobre PHP, pero al menos tenemos claro que nuestro JSON es correcto.

Ahora vamos a crear una variable PHP con la cadena para hacer este objeto y lo cargaremos en una variable PHP interpretando el JSON. Para ello PHP dispone de una funcin llamada json_decode() que recibe la cadena con notacin JSON y devuelve un objeto, o cualquier otro tipo de variable, que estuviera representada en el JSON.

<?php $str_obj_json = '{ "elemento1": "valor1", "elemento2": 22, "elemento3": null, "masCosas": { "voy": "ahora", "vengo": "ya" } }'; $obj_php = json_decode($str_obj_json); ?>

Ahora podramos mostrar el contenido de esa variable con la funcin de PHP print_r(), que muestra el contenido de variables de manera que se pueda entender por un humano.

stdClass Object ( [elemento1] => valor1 [elemento2] => 22 [elemento3] => [masCosas] => stdClass Object ( [voy] => ahora [vengo] => ya ) )

Por ltimo podemos intentar acceder a una de las propiedades de este objeto, de esta manera:

echo "Una propiedad cualquiera:" . $obj_php->elemento1;

Consejos para hacer un JSON que se pueda interpretar correctamente

La funcin json_decode() de PHP requiere unas normas un poco ms estrictas a la hora de construir un JSON. Si no atendemos esas reglas no obtendremos un mensaje de error, sino que la funcin devolver un valor nulo: null. Por tanto, algo que Javascript puede interpretar correctamente puede que no sea as por PHP, as que hay que prestar especial atencin sobre una serie de puntos. 1) En la cadena JSON, tanto el nombre de una propiedad como el valor deben estar entre comillas, menos los valores numricos, o palabras como null, que pueden estar sin comillas. Incorrecto:
$json = json_decode('{nombre: "cualquier valor"}');

Correcto:
$json = json_decode('{"nombre": "cualquier valor"}');

2) Se tienen que utilizar comillas dobles. No se permiten comillas simples para los nombres de variables y sus valores. Incorrecto:
$json = json_decode("{'frutas': ['pera', 'uva']}");

Correcto:
$json = json_decode('{"frutas": ["pera", "uva"]}');

3) No podemos dejarnos una coma que despus no tenga nada, as como un corchete o llave de ms o de menos. Incorrecto:
$json = json_decode('{"nombre": "valor", }');

Correcto:
$json = json_decode('{"nombre": "valor"}');

4) Tenemos que enviar los datos a json_decode() en UTF-8. Si estamos trabajando en iso8859-1, habra que codificar la cadena en UTF-8 previamente: Incorrecto:
$json = json_decode('{"maana": "mircoles"}');

Correcto:
$json = json_decode(utf8_encode('{"maana": "mircoles"}'));

Ejercicio prctico sobre el consumo de un archivo JSON desde una pgina PHP y de trabajo con el API de Panoramio.
Por Miguel Angel Alvarez JSON es un formato utilizado para el intercambio de informacin entre sistemas. Utiliza Javascript como lenguaje y sintaxis para la definicin de objetos, en archivos de texto que son transferidos fcilmente por Internet. Poco a poco se ha ido incorporando al uso habitual en el desarrollo web por su facilidad de uso y su integracin en lenguajes de programacin habituales, como PHP. En este artculo vamos a presentar una prctica con JSON en PHP basada en el uso del API de Panoramio. Panoramio es un popular servicio de Google, como probablemente sabremos, que permite subir imgenes localizadas geogrficamente en los mapas de Google. Panoramio dispone de un API para la integracin de las fotografas de su base de datos en otras aplicaciones web, de manera que cualquier persona puede presentar fotos de lugares del mundo subidas por los usuarios de Panoramio, en su propio sitio web. El API de Panoramio utiliza JSON como formato de intercambio de la informacin de las fotos. Por medio de este API podemos construir URL, que solicitadas al sitio de Panoramio, nos devuelven un JSON con los datos de las fotografas, es decir, su ttulo, autor, URL del archivo grfico, etc. Gracias a la integracin de JSON en la mayora de los lenguajes de programacin de aplicaciones web, desde casi todas las plataformas de programacin para el desarrollo, se pueden obtener fcilmente las fotos y presentarlas en un sitio web. Como venimos explicando en el Manual de Trabajo con JSON en PHP, este lenguaje de programacin dispone de varias funciones que sirven para consumir archivos JSON y convertirlos en objetos PHP con los que podemos trabajar. Podemos ver como es de prctico el JSON al utilizar el API de Panoramio y cmo en pocas lneas de cdigo podemos acceder a Panoramio y consultar su base de datos de fotografas y mostrarlas en nuestra pgina web.
Referencia: En DesarrolloWeb.com hemos publicado anteriormente un artculo para aprender a consumir JSON del API de Panoramio con el lenguaje de programacin del lado del cliente JSON: API Panoramio + ejemplo de JSON con Mootools .

Pasos del script PHP para consultar el API de Panoramio

Para crear un programa en PHP que consulte el API de Panoramio tenemos que realizar varios pasos: 1. Conectar con una URL de Panoramio, enviando los datos sobre la localizacin desde donde queremos obtener fotos, para recibir un JSON con los datos de dichas fotos. 2. Procesar el JSON, para obtener un objeto PHP con los datos de las fotografas. 3. Hacer un bucle para recorrer las fotografas del objeto, para mostrar las fotografas obtenidas en nuestra pgina. Todos estos pasos son sencillos, pero necesitaremos alguna idea sobre distintas partes de PHP, pero afortunadamente en Desarrollo web .com tenemos artculos para obtener la base de conocimientos necesaria para realizar cualquiera de estos pasos.

Conectar con una URL de Panoramio:

Esto lo tenemos que hacer con las funciones de trabajo con archivos de texto que dispone PHP, pues la lectura de ficheros se hace con las mismas funciones que la lectura de URLs, tal como explicamos en el artculo Leer ficheros con PHP. Primero tenemos que crear una URL para la consulta en el API de Panoramio, que tendr una forma como esta:

http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=full&from=0&to=5&min x=-0.35&miny=39.44&maxx=-0.34&maxy=39.46&size=medium

Esto nos devolvera fotos:

por orden de popularidad, desde la foto encontrada en posicin 0 hasta la posicin 5 de ese ranking por popularidad, entre unas coordenadas (minx, miny) y (maxx, maxy), o lo que es lo mismo (mnima longitud y latitud) y (mxima longitud y latitud), de tamao medio

Las fotos estn indicadas, como se deca, en texto con cdigo Javascript en formato JSON. As pues, si accedemos a esa URL obtendremos el JSON de respuesta. Para obtener el texto que devuelve Panoramio al acceder a esa URL tenemos que leerlo con las funciones de archivos. Utilizaremos una funcin ya explicada en el artculo Leer ficheros con PHP

function leer_contenido_completo($url){ $fichero_url = fopen ($url, "r"); $texto = ""; while ($trozo = fgets($fichero_url, 1024)){ $texto .= $trozo; } return $texto; }

As pues, con una llamada a esta funcin, enviando la URL que deseamos consultar, podramos obtener el JSON con las fotos.

$URL_API_PANORAMIO = "http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=full&from=0&to=5&mi nx=-0.35&miny=39.44&maxx=-0.34&maxy=39.46&size=medium";

$contenido_url = leer_contenido_completo($URL_API_PANORAMIO);

Procesar el JSON:

Como ya vimos en el artculo Consumir un JSON desde PHP, PHP dispone de la funcin json_decode() que devuelve un objeto PHP resultante de procesar el JSON enviado como un string por parmetro. En nuestro ejemplo podramos hacer lo siguiente:

$JSON_PANORAMIO_PHP = json_decode($contenido_url);

En la variable $JSON_PANORAMIO_PHP tendremos el objeto PHP resultante de la decodificacin del JSON recibido en el contenido de la URL.

Hacer un bucle para recorrer las fotografas del objeto

Ahora nos queda el paso ms sencillo para los que ya tienen cierta experiencia con PHP, hacer un recorrido de todas las fotos que hayamos recibido. Ese recorrido deber tener en cuenta el formato del objeto que se recibe en el JSON. Ese objeto tiene los siguientes atributos:

count (con el nmero de fotos encontradas en todo panoramio entre las coordenadas dadas, que no tiene por qu corresponder con el subconjunto de fotos recibidas. photos (que es un array con todas las fotos recibidas. Cada foto es otro objeto, que tiene los datos de esa foto en particular)

has_more (con un boleano que indica si hay o no otras fotos disponibles para este punto)

Nota: En realidad podemos obtener la informacin completa sobre el formato de este objeto en la propiadocumentacin del API de Panoramio.

Entonces nuestro bucle PHP tiene que hacer un recorrido al array de fotografas que hay en el atributo "photos" del objeto PHP. Podra tener esta forma:

for ($i=0; $i<count($JSON_PANORAMIO_PHP->photos); $i++){ $foto_actual = $JSON_PANORAMIO_PHP->photos[$i]; echo "<p>"; echo "<img src='" . $foto_actual->photo_file_url . "' width='" . $foto_actual->width . "' height='" . $foto_actual->height . "'>"; echo "<br>"; echo "<small>" . $foto_actual->photo_title . ", por " . $foto_actual->owner_name . "</small>"; echo "</p>"; }

Este recorrido se podra haber hecho de otra forma, pero nos sirve perfectamente un bucle for. Adems, quizs vosotros colocarais las fotos con otro estilo, para adaptarlas al diseo de vuestra pgina. Si se desea, podemos ver las fotos de Panoramio que hay en esa localizacin, que corresponde con la Ciudad de las Ciencias y las Artes de Valencia.

10

Cdigo PHP completo

A continuacin para una referencia ms completa, podemos ver el cdigo completo de la pgina PHP que hemos creado para hacer este ejemplo de trabajo con JSON en PHP.

<html> <head> <title>Consumir JSON del API de Panoramio desde PHP</title> </head>

<body>

<?

function leer_contenido_completo($url){ $fichero_url = fopen ($url, "r"); $texto = ""; while ($trozo = fgets($fichero_url, 1024)){ $texto .= $trozo; } return $texto; } $URL_API_PANORAMIO = "http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=full&from=0&to=5&mi nx=-0.35&miny=39.44&maxx=-0.34&maxy=39.46&size=medium";

$contenido_url = leer_contenido_completo($URL_API_PANORAMIO);

echo $contenido_url;

$JSON_PANORAMIO_PHP = json_decode($contenido_url);

echo "<hr>";

//echo $JSON_PANORAMIO_PHP->count; //esto muestra el nmero de fotos totales que existen en Panoramio en esa localizacin for ($i=0; $i<count($JSON_PANORAMIO_PHP->photos); $i++){ $foto_actual = $JSON_PANORAMIO_PHP->photos[$i]; echo "<p>"; echo "<img src='" . $foto_actual->photo_file_url . "' width='" . $foto_actual->width . "' height='" . $foto_actual->height . "'>"; echo "<br>"; echo "<small>" . $foto_actual->photo_title . ", por " . $foto_actual->owner_name . "</small>"; echo "</p>"; } ?> </body> </html>

Podemos ver el script en marcha en una pgina aparte.

Cmo generar una respuesta en notacin JSON para definir las sugerencias para autocompletar, extradas de una base de datos MySQL, que se envan al plugin autocomplete de jQuery UI.
Por Miguel Angel Alvarez En esta prctica de generar un JSON desde PHP vamos a aprender a trabajar de manera avanzada con un campo de autocompletado de texto. Es uno de esos campos de texto que habris visto en muchas webs de programacin avanzada, que sugieren diversas posibilidades segn se escribe texto en el campo, para que el visitante no tenga que escribir un texto completo. Realmente ya explicamos qu es un campo de tipo autocompletar y cmo generarlo fcilmente utilizando las libreras jQuery UI. Adems, vimos tambin en otro artculo cmo utilizar un script remoto para generar las sugerencias de autocompletado. En el presente texto iremos un paso ms adelante, mostrando una posibilidad de creacin del archivo en notacin JSON que debemos devolverle al campo de autocompletar, extrayendo las distintas posibilidades a travs de una base de datos MySQL. En el artculo enfrentaremos este problema en dos pasos. En el primero mostraremos cmo generar un JSON a partir de un array de objetos y luego veremos cmo poblar ese array a travs de una consulta con la base de datos. No obstante, antes de comenzar, podemos ver cmo es el campo autocompletar que vamos a construir.
Nota: el inicio de esta prctica, con toda la parte de generacin de este componente web con jQuery UI se puede ver en el artculo Campo de autocompletado en jQuery UI con carga remota de opciones.

11

Cdigo PHP para generar un JSON para autocompletar

Como primer paso en este artculo vamos a ver cmo generar un JSON a partir de un array de objetos. Este JSON tendr siempre los mismos valores, es decir, es slo una prueba para intentar generar el JSON con el formato que requiere el plugin autocomplete de jQuery UI. Ms adelante mostraremos cmo generarlo a travs de una bsqueda en una base de datos.

Para obtener nuestros objetivos vamos a crear primero una clase y luego generar un array de objetos de esa clase, que luego convertiremos a JSON con las funciones nativas de PHP.

//defino una clase para los elementos del campo autocompletar class ElementoAutocompletar { //propiedades de los elementos var $value; var $label;

//constructor que recibe los datos para inicializar los elementos function __construct($label, $value){ $this->label = $label; $this->value = $value; } }

//defino un array con varios elementos objetos de la clase anterior $ArrayElementos = array( new new new new ); ElementoAutocompletar("Elemento 1", "valor 1"), ElementoAutocompletar("Elemento 2", "valor 2"), ElementoAutocompletar("La vida dura", "Es la vida"), ElementoAutocompletar("Elemento Lo que sea", "otro valor cualquiera")

//imprimo en la pgina la conversin a JSON del array anterior print_r(json_encode($ArrayElementos));

Al ejecutar este cdigo PHP obtendremos el JSON con el formato que est esperando el plugin autocomplete de jQuery UI.

12 MySQL

Generar los elementos del JSON a partir de una bsqueda en una tabla

Ahora veremos un paso ms relacionado con el propio acceso a la base de datos que con la dificultad de trabajar con JSON. Es decir, si hemos entendido la anterior generacin del JSON, en este paso slo le agregaremos la dificultad de trabajo con la base de datos MySQL. En nuestro caso vamos a buscar dentro de una tabla que contiene entradas de la wiki de desarrollo de pginas web.

Adems, tenemos que saber que a este script PHP se le llamar desde jQuery y recibir por GET el texto que se haya escrito en el campo de autocompletado, a travs de la variable $_GET["term"].

//defino una clase que voy a utilizar para generar los elementos sugeridos en autocompletar class ElementoAutocompletar { var $value; var $label;

function __construct($label, $value){ $this->label = $label; $this->value = $value; } }

//recibo el dato que deseo buscar sugerencias $datoBuscar = $_GET["term"];

//conecto con una base de datos $conexion = mysql_connect("localhost", "root", ""); mysql_select_db("mibasededatos");

//busco un valor aproximado al dato escrito $ssql = "select id_entrada, nombre_entrada from entrada where nombre_entrada like '%" . $datoBuscar . "%'"; $rs = mysql_query($ssql);

//creo el array de los elementos sugeridos $arrayElementos = array();

//bucle para meter todas las sugerencias de autocompletar en el array while ($fila = mysql_fetch_array($rs)){ array_push($arrayElementos, new ElementoAutocompletar(utf8_encode($fila["nombre_entrada"]), $fila["id_entrada"])); }

print_r(json_encode($arrayElementos));

El cdigo anterior est comentado, por lo que estamos seguros que se podr entender bien. No obstante, quiero llamar la atencin para un tema importante. La notacin JSON requiere que los textos que se escriban estn en UNICODE y la propia funcin json_encode() de PHP hace esa conversin a UNICODE por nosotros. Pero eso s, nosotros tenemos que asegurarnos que los textos que insertemos en aquello que queremos convertir a JSON estn en UTF-8. Este asunto fue explicado con ms detalle en el artculo Producir JSON desde PHP. Por ello, al hacer el objeto de la clase ElementoAutocompletar, el nombre de la entrada, que podra tener acentos y otros caracteres especiales que se deban escapar, se convierte a UTF8:

utf8_encode($fila["nombre_entrada"])

Nota: el campo id_entrada, $fila["id_entrada"], no lo convertimos porque slo va a contener nmeros enteros y por ello no hace falta pasarlo a UTF-8.

Con todo esto ya hemos visto cmo generar un JSON para consumir desde el plugin autocomplete de jQuery UI. Estoy seguro que con muy poco esfuerzo cualquier persona podr adaptar ese cdigo para hacer su propio campo de autocompletar, trayendo los datos de cualquier entidad de su base de datos.

También podría gustarte