Archive for the ‘recetas’ Category

Accediendo a XML con XPath y PHP5

septiembre 23, 2007

Bien, hasta ahora vimos como acceder al documento XML con PHP 5 accediendo a los nodos directamente e iterando colecciones.

Pero qué pasa si queremos acceder a un nodo en particular, sin tener que recorrer el documento.

Esto se puede hacer mediante XPath. XPath es un lenguaje de expresiones para acceder a partes de un documento XML. También permite hacer cálculos.

La base es considerar al documento como un arbol de directorios de unix donde cada nodo es un directorio. De esta manera si queremos acceder al título de un documento XHTML basta con consultar el elemento: “/html/head/title”. Si queremos acceder todas las entradas de un feed RSS. la consulta será a “entry”. Esto devolverá un array con todos los nodos de tipo entry donde cada elemento del array será un nodo.

También podemos acceder por los atributos. Supongamos que tenemos un documento XML en donde guardamos contactos. Cada nodo “contacto” tiene un atributo que se llama “tipo” y entre sus valores posibles están “Personales”, “Negocios”, etc. Si queremos listar todos los contactos de tipo “Personales”:

$xml = simplexml_load_file('contactos.xml');
$res = $xml->xpath("contacto[@tipo=Personales]");

foreach ($res as $contacto)
{
  //hacer algo con los contactos...
}

Es decir invocamos al método xpath de la clase SimpleXML pasándole por parámetro nuestra consulta XPath. Como queremos filtrar por atributos ponemos entre corchetes el atributo precedido por una @ e igualamos al valor que queremos filtrar. En el ej:[@tipo=Personales].

Esto es solo la punta del iceberg, ya que se pueden hacer cálculos, consultas complejas acceder a nodos relativos, por ejemplo, el nodo padre de los nodos que tengan cierto valor en cierto atributo.

Cualquier duda o comentario, pregunten. Saludos!

SPIP y las palabras clave

septiembre 20, 2007

SPIP tiene un mecanismo muy poderoso de categorizar contenidos por palabras clave.

Por un lado propone las secciones para cargar artículos asociados a una temática. Un ejemplo sería una comunidad en particular que quiere publicar noticias y opiniones, cada uno con su formato particular.

De golpe en el contexto ocurre un evento, por ejemplo: la comunidad es una comunidad de jugadores de rugby y a su vez está ocurriendo el Mundial de Rugby de Francia. Este mundial genera noticias (resultados, fixtures, etc) y por otra parte opiniones (comentarios de partidos, amistosas sugerencia, etc)

Si quisieramos armar una página especial por el mundial de Rugby podríamos armar una sección nueva y cargar todos las noticias y las opiniones ahí. Pero surgiría el problema del formato. Además, ¿que pasaría si yo quisiera que las noticias del mundial salgan con las noticias de la comunidad, lo mismo que las opiniones?

Las palabras clave vienen al rescate. SPIP permite definir grupos de palabras clave a los cuales se les asocian diversas palabras clave. En nuestro ejemplo podríamos definir un Grupo de Palabras Clave que se llama Torneos y en ese grupo una palabra clave concreta: “Mundial de Rugby Francia 2007”. Podríamos crear otras palabras Clave: “Campeonato de la URBA”, “Gira a Nueva Zelanda” y así las que queramos.

Bastará con crear un esqueleto con el contenido estático y el recorrido de las palabras clave que estemos usando.

Podríamos incluso abrir un canal RSS dedicado solo al evento mediante el mismo uso de la palabras clave.

Como se puede ver tiene muchas posibilidades. Espero que haya sido útil. Nos vemos y vamo’ lo’ puma’!

Leyendo xml con PHP 5

septiembre 12, 2007

Estoy necesitando parsear XML con PHP. La idea es ir armando una maqueta para un sitio que muestra artículos que obtiene de unos archivos XML.

Parsear XML en PHP4 era lento y poco práctico, razón por la cual siempre traté de evitarlo. Si hacía falta sacar algo de un archivo XML lo recorría como un archivo plano y extraía los datos con expresiones regulares.

Por otra parte entre las novedades PHP 5, el soporte para XML fue optimizado. Esto se basa en una nueva clase que envuelve la funcionalidad de una biblioteca que llama libxml: SimpleXML.

¿Por donde empezar?

La biblioteca es muy cómoda de utilizar. Acepta iteradores y permite acceder a los nodos hijos como atributos del nodo/objeto padre.


$archivo = 'entrada.xml';

//Caso 1: Directamente trayendo el archivo
$xml = simplexml_load_file($entrada);

$cadena = file_get_contents($entrada);

//Caso 2: Teniendo el contenido de texto
$xml = simplexml_load_string($cadena);

//Caso 3: O como instancia de la Clase SimpleXML
$xml = new SimpleXML($cadena);

En cualquiera de los 3 casos voy a tener un objeto $xml que representa al nodo raíz.

Supongamos que queremos mostrar links a los posts más recientes de un blog mediante feeds RSS. Mediante CURL o file_get_contents obtuvimos los datos en la variable $cadena.

$xml = new SimpleXML($cadena);

echo "Fuente :<a href=\\"".
$xml->channel->link ."\\">".
$xml->channel->title."</a>
\\n";

echo "
<ul>";
foreach ($xml->channel->item as $item)
{
echo "
	<li><a href=\\""
.$item->link ."\\">"
.$item->title."</a></li>
\\n";
}
echo "</ul>
";

Así de fácil podemos recorrer el RSS. Hay que tener encuenta que el objeto $xml es el elemento raíz de la cadena pasada (<rss> en este caso).

La próxima vez vamos a hablar de XPath, y de como acceder a los hijos y a los atributos del documento xml.

Montar iso en XP

septiembre 10, 2007

Encontré cómo montar archivos iso en Windows XP sin tener que usar ni Alcohol, ni Nero Imagedrive.

Es cuestión de copiar un archivo al directorio %systemroot%\system32\drivers y usar un programita cliente.

Chapeau!

JsCalendar Helper para CakePHP

agosto 26, 2007

Necesitaba incluir el JsCalendar y me puse a buscar si estaba implementado el Helper, pero no. Lo más parecido era un controlador que se puede ver en este link.

No está nada mal, pero me resultaba un poco molesto tener que usarlo como controlador. Además el propio Pierpaolo invita a que lo mejoremos.

Yo decidí encararlo como Helper y que a la hora de imprimir el calendario en la vista sea lo más general posible.

El primer problema que se me presentó fue el de incluir los archivos .js y .css. Como estoy trabajando con 1.1.16.5421 necesitaba incluirlos en el layout. Googleando encontré que alguien ya había hecho algo para resolver este problema aquí. Hay que tocar el layout pero esto provee un Helper bastante bonito para lo que necesitaba.

Resuelto esto ya podía armar el Helper.

Tomé la clase PHP que viene con la distribución del JsCalendar. adapté el constructor al esquema de CakePHP. Desde el constructor se selecciona el look, el idioma, el directorio relativo a js, css e img de CakePHP. A su vez se setean otras opciones por defecto. Además tuve que agregar dos parámetros. Uno ‘align’=>”, porque con MSIE salía por cualquier lado. El otro es ‘width’=>’240px’ porque el ancho iba hasta el borde derecho de la pantalla.

El método de carga de los scripts fue modificado para trabajar con HeadHelper.

Por último modifiqué “make_input_field” para que funcione con un input, una image y un link del HtmlHelper. También valida que no se haya invocado el método de carga mediante una variable de instancia. Con eso ya tenía el calendario funcionando como un helper.

¿Cómo lo uso? Cargo el helper en el controlador con la variable $helpers.

<?php
echo $jsCalendar->make_input_field( 'Proyecto/inicio', #tagName del input
array(), #opciones del calendario(*)
array(
'name'=>'data[Proyecto][inicio]', #campo
'value'=>$html->tagValue('Proyecto/inicio' ) #valor inicial
); ?>

(*) se puede ver la documentación del jsCalendar.

No hace falta usar tantas líneas, la idea es usarlo como cualquier otro widget de Html.

Los scripts js del calendario se deben poner en webroot/js/calendar/. Los css en webroot/css/calendar/ y las imágenes en webroot/img/calendar/. En caso de usar Skins deben estar los archivos distribuidos en los directorios de los css y las imágenes.

Se puede descargar el helper con el esquema de directorios.

Bueno, espero que sea útil como me resultó a mí y si quieren mejorarlo, bienvenidos sean.

Problema con acentos, ñs y CakePHP

agosto 17, 2007

Haciendo pruebas con una aplicación que tengo para proyectos, encontré que cuando cargo acentos, ñs u otros caracteres latinos CakePHP me cortaba las cadenas a partir de la primer ocurrencia del caracter “malo”.

¡Oh no! ¡Problemas de charset! Como estoy con la versión 1.1.16.x no tengo soporte de internacionalización, ni nada.

Googlear fue inútil. No encontré nada. La cuestión es que me fije la codificación del navegador y era la fatídica “Europa Occidental (Windows)”.

CakePHP usa utf-8 para comunicarse con la base de datos. A su vez presupone que se le pasan datos utf-8. Cuando el navegador mandaba los datos los mandaba en latin-1, CakePHP los procesaba como si fueran utf-8 y ahí venía el problema.

Esto pasa porque el servidor está andando sobre Windows y por defecto envía las páginas como iso-8859-1. Basta con corregir esto para que vuelva a funcionar.

¿Cómo eludir el problema sin tener que modificar el código del núcleo ni la configuración del servidor (recordar que esto no siempre está al alcance de uno)?

Agregando en el <head> de la aplicación (dir_aplicacion)/views/layouts/defaults.thtml el siguiente tag:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

Con eso se arregló y ya tengo mis acentos!

Saludos, y hasta la próxima.

CakePHP: Bake y ACL

julio 7, 2007

Siguiendo con CakePHP me encontré con una serie de tutorials muy interesantes que se pueden seguir acá registrándote o bien por acá si no querés registrarte en otro sitio más. El último link es a un sitio llamado scribd que merece de por sí solo un post. De entrada podemos decir que se propone ser la biblioteca abierta de documentos más grande del mundo.

Habiendo corregido el tema de scaffold, pude seguir haciendo pruebas y cada vez me gusta más. Pero como bien indica la documentación, el scaffold (andamios) no son más que eso, andamios. Son una base para ir haciendo algo y después ir extendiendo uno y dándole a la aplicación el uso original para el que estaba diseñada. Sin embargo es un buen andamiaje para la obra.

Es posible “exportar” el código del sacffold mediante una herramienta de línea de comandos llamada Bake. Esta se encuentra en cake/scripts/bake.php. Se pueden exportar los modelos, las vistas y el controlador. De esta manera ya tenemos el esqueleto de la aplicación con su index (listado) y un abm. Ahí podemos modificar las views al estilo y funcionalidad que queramos. Hay que tener cuidado de no sobreescribir el trabajo que hayamos hecho en los controladores, por eso es recomenrable hacer primero esta exportación y después trabajar sobre los controladores particulares de nuestra aplicación.

Contento ya con esto, vi otra funcionalidad: las Access Control Lists (ACL o listas de control de acceso) que nos ofrecen un modelo de control de acceso a objetos. La idea es sencilla: por un lado tenemos objetos (usuarios y grupos de acceso) que quieren acceder a otros objetos(artículos, productos, cualquier cosa que queremos regular su acceso). A estos que quieren acceder se los llama ARO u Access Request Objects. Es posible también definir una estructura de arbol que nos permite crear grupos de acceso. A los objetos a los que se quiere acceder se los llama ACO u Access Control Objects. Con estas dos entidades podemos definir un sistema de control de acceso asociando los ARO con los ACO. Esta es una relación muchos a muchos y permite hasta agregar niveles de acceso a determinadas funciones (read, update, create y delete) .

Para el que siga el tutorial de IBM, con la versión 1.1.15.5144 tuve los siguientes problemas:

  • En el código del form de registro de usuarios el tutorial usa para verificar que se haya envíado el form un if y la condición es : (!empty($this->params[‘form’])) y también intenta grabar el objeto con $this->params[‘form’]. Eso no me anduvo. Reemplazando en todos los casos eso por $this->data la cosa sale como trompada de loco.
  • Cuando quise dar de alta los ARO con la herramienta de línea de comandophp acl.php create aro 1 null Users

    sale un error. Esto se corrige reemplazando el null por 0. No es lo más elegante pero funciona. Ya que no debería haber referencia a un item 0.

    php acl.php create aro 1 0 Users

Bueno, con esas dos salvedades, el tutorial es muy recomendable. Hasta la próxima.