Transformaciones XSL en Symfony

Ya hemos visto cómo realizar transformaciones XSL con PHP 5, pero ¿cómo aplicamos esto en Symfony?

Lo que podemos hacer es que las vistas generen XML y después en el layout transformamos este XML en XHTML mediante nuestra hoja de estilos XSL.

Vamos a utilizar el mismo ejemplo que en el post anterior. Lo primero que haremos es crear una carpeta xsl dentro del directorio web. Ahora metemos ahí los archivos de ejemplo (collection.xsl y collection.xml). En el layout, en el lugar que queramos (total, es sólo para probar) incrustamos el código de ejemplo:

<?php
   $xslDoc = new DOMDocument();
   $xslDoc->load("xsl/collection.xsl");

   $xmlDoc = new DOMDocument();
   $xmlDoc->load("xsl/collection.xml");

   $proc = new XSLTProcessor();
   $proc->importStylesheet($xslDoc);
   echo $proc->transformToXML($xmlDoc);
?>

Si ahora ejecutamos nuestro proyecto veremos que la transformación se realiza correctamente. Pero esto no es lo que queríamos, ya que estamos cargando el XML de ejemplo directamente desde un archivo y lo que queremos es cogerlo de una vista. Bien, creemos entonces un nuevo módulo y en el indexSuccess.php metamos el XML de ejemplo. Ahora sólo tenemos que cambiar el código de ejemplo del layout y utilizar la función loadXML y la variable $sf_content:

<?php
   $xslDoc = new DOMDocument();
   $xslDoc->load("xsl/collection.xsl");

   $xmlDoc = new DOMDocument();
   $xmlDoc->loadXML($sf_content);

   $proc = new XSLTProcessor();
   $proc->importStylesheet($xslDoc);
   echo $proc->transformToXML($xmlDoc);
?>

Con esto ya hemos conseguido lo que queríamos, aunque es un poco engorroso poner todo ese trozo de código en el layout, así que podemos crear un helper que nos ayude a simplificar la tarea. Para ello, dentro de la carpeta lib (por ejemplo, dentro de la aplicación frontend) creamos un nuevo directorio helper y dentro de él nuestro helper XSLHelper.php que contendrá el siguiente código:

<?php
function XSLTransform($xmlString)
{
    $xslDoc = new DOMDocument();
    $xslDoc->load("xsl/collection.xsl");

    $xmlDoc = new DOMDocument();
    $xmlDoc->loadXML($xmlString);

    $proc = new XSLTProcessor();
    $proc->importStylesheet($xslDoc);

    return $proc->transformToXML($xmlDoc);
}
?>

Ahora en nuestro layout sólo tenemos que poner el siguiente código:

<?php
    <?php use_helper('XSL') ?>
    <?php echo XSLTransform($sf_content) ?>
?>

Y si queremos simplificar aún más, podemos hacer que nuestro nuevo helper se cargue por defecto y así no tener que incluirlo manualmente. Para ello, en el archivo settings.yml dentro de la carpeta config de nuestra aplicación frontend lo incluimos en una lista de helpers por defecto:

all:
  .settings:
    standard_helpers: [XSL]

Así, en nuestro layout ya sólo tendremos que escribir:

<?php
    <?php echo XSLTransform($sf_content) ?>
?>

Bien, ahora sólo nos quedaría solucionar un pequeño problema de la forma más elegante que se nos ocurra, y es que la hoja de estilos XSL con la que realizaremos las transformaciones la hemos puesto directamente en la función de nuestro helper. Podríamos incluir un nuevo parámetro en nuestra función para especificar la hoja de estilos, pero esto no sería muy ágil si hacemos muchas llamadas al helper y en un futuro cambiamos de nombre o de ruta la hoja de estilos, así que lo mejor sería que pudiésemos obtener este dato de un archivo de configuración, por ejemplo del settings.yml. Lo que tenemos que hacer es definir una constante en ese archivo:

all:
  xsl_doc:    xsl/collection.xsl

Y después utilizar la clase sfConfig de Symfony para recuperar el valor en nuestro helper:

<?php
function XSLTransform($xmlString)
{
    $xslDoc = new DOMDocument();
    $xslDoc->load(sfConfig::get('sf_xsl_doc'));

    $xmlDoc = new DOMDocument();
    $xmlDoc->loadXML($xmlString);

    $proc = new XSLTProcessor();
    $proc->importStylesheet($xslDoc);

    return $proc->transformToXML($xmlDoc);
}
?>
Categoría: Programación  Etiquetas: ,
Puedes seguir los comentarios de esta entrada a través del feed RSS 2.0. Puedes dejar un comentario, o un trackback hacia tu propio sitio web.
Deja un comentario

XHTML: Puedes usar los siguientes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Better Tag Cloud