Compartir presentaciones a través de vistas o extensiones con JLayout
From Joomla! Documentation
Es común que partes de las páginas se repliquen a través de varias vistas dentro de una extensión o incluso a través de varias extensiones. Algunos ejemplos podrían ser:
- una extensión comparte algunas visualización de diseños entre vistas del Lado Cliente y del Lado Servidor, o con uno o más módulos.
- extensiones del Lado Servidor tienen algunas configuraciones comunes y por lo tanto tiene que replicar las visualizaciones de diseños comunes para permitir cambios a los usuarios
Hasta Joomla! 3.0, la carga (y sobrescritura de plantilla) de archivos de diseño se limita a una determinada vista. La interfaz JLayout y un conjunto de clases fueron añadidas a Joomla! 3.0 para ayudar a resolver este gran problema. Encapsula un diseño y los datos necesarios a mostrar, de modo que pueden ser reutilizados a través de vistas y extensiones. En el momento de la escritura, JLayout es utilizado por la clase JHtmlSidebar para mostrar el submenú y filtros que se encuentran en la mayoría de las páginas de extensiones del Lado Servidor.
JLayout consiste en una interfaz y 2 clases:
- La interfaz JLayout define el escape y métodos de procesamiento, como la clase JView de la plataforma Joomla!
- JLayoutBase implementa una clase de diseño básico, donde el diseño puede ser codificado en la propia clase, por ejemplo
- JLayoutFile, las clases más utilizadas, conteniene y representar un diseño almacenado en un archivo, verificando que se reemplaza en la plantilla antes de hacerlo.
Aquí hay un sencillo ejemplo de uso de JLayoutFile:
// Create a layout object and ask it to render the sidebar
$layout = new JLayoutFile('joomla.sidebars.submenu', $basePath = null);
$sidebarHtml = $layout->render($data);
La ejecución de este código crea un objeto JLayoutFile, conteniendo al diseño en un archivo y pasando la estructura $data que puedan ser necesarios para la propia visualización.
El primer parámetro, 'joomla.sidebars.submenu' es el identificador del archivo. La última parte ('submenu') es el nombre del archivo, todo antes de ('joomla.sidebars') es la ruta de acceso relativa. Un opcional parámetro $basePath puede ser antepuesto a la ruta de acceso relativa. Si $basePath falta, los archivos de diseño se buscarán dentro del directorio /layouts.
Nuestro ejemplo:
new JLayoutFile('joomla.sidebars.submenu', $basePath = null)
el resultado será el archivo de diseño 'submenu.php' cargado desde el directorio '/layouts/joomla/sidebars '.
El paso de una ruta base no-vacía permite el acceso y el almacenamiento de archivos de diseño de cualquier parte de la estructura de directorios del sitio, por ejemplo:
$layout = new JLayoutFile('my_layout', JPATH_ROOT .'/components/com_something/layouts');
$html = $layout->render($data);
carga y genera el archivo de diseño 'my_layout.php' que se encuentra en el directorio JPATH_ROOT .'/components/com_something/layouts'.
Establecer el parámetro del cliente como tercer parámetro permite cargar archivos de diseño desde el directorio del lado cliente así como del lado servidor también, por ejemplo:
$layout = new JLayoutFile('my_layout', NULL, array('client' => 0));
$html = $layout->render($data);
cargará y renderizará el archivo de diseño 'my_layout.php' que se encuentra en el directorio JPATH_ROOT. '/components/com_something/layouts' pero aún podría ser sobrescrito en la plantilla.
Sobrescribir plantillas
Cuando se ejecuta el método render(), que es en realidad la carga del archivo de diseño, JLayoutFile comprueba la existencia de una modificación en la plantilla seleccionada actualmente, dentro de un directorio 'layouts'. Mirando hacia atrás en nuestro primer ejemplo, si deseas reemplazar el diseño de la barra lateral de todas la extensiones del Lado Servidor de Joomla!, debes colocar un archivo 'submenu.php' en: /administrator/templates/{plantilla_actualmente_seleccionada}/html/layouts/joomla/sidebars/
Nota: JLayoutFile revisará la plantilla seleccionada actualmente para los reemplazos. Como los diseños pueden ser compartidos entre ambos (Lado Cliente y Lado Servidor), si necesitas reemplazar un archivo de diseño en ambos casos, tendrás que poner un archivo de reemplazo tanto en Lado Servidor como en el Lado Cliente de la plantilla.
Almacenamiento de diseños:
Los archivos de diseño, básicamente, se puede almacenarse en cualquier lugar, como una completa base de la ruta de acceso puede ser especificada cuando se usan (y además permite sobrescribir la plantilla ). Sin embargo, para garantizar la coherencia y evitar conflictos de nombres, te recomendamos lo siguiente:
- de forma predeterminada almacena los archivos de diseño en tu propia carpeta de administración de la extensión. Por ejemplo: /administrator/components/com_ejemplo/layouts
- si la extensión no tiene una carpeta en administración (sólo es un componente del Lado Cliente, módulo, plugin), entonces, utiliza una carpeta de diseños tales como:
- /components/com_ejemplo/layouts
- /plugins/content/ejemplo/layouts
- /modules/mod_ejemplo/layouts
Además, ten en cuenta que la carpeta DEBE llamarse layouts.
El uso de la carpeta raíz /layouts normalmente está reservado para Joomla! solamente y posiblemente otras aplicaciones "oficiales" en el futuro, tales como el instalador, por ejemplo.
Por último, aunque no es obligatorio, te aconsejo que pongas todos tus archivos de diseño bajo una sub-carpeta adicional "com_ejemplo" o "mod_ejemplo" dentro de la principal de la carpeta principal "layouts". Esto no sirve para la extensión, sin embargo, si una plantilla reemplaza diseños para varias extensiones, esto permitiría evitar posibles colisiones de nombres.
Por ejemplo, si 2 extensiones usan JLayout "filters.search_all", luego una plantilla no puede proporcionar un reemplazo, por separado, para cada una. Un solo reemplazo debe ser utilizado tanto para la extensión, lo cual puede no ser deseable.
El uso de "com_ejemplo_1.filters.search_all" y "com_ejemplo_2.filters.search_all" permite a las plantillas proporcionar reemplazos a los diseños, incluso si tienen el mismo id.
Ejemplos:
Aquí hay un ejemplo muy simple.
Crea un archivo /layouts/joomla/content/helloworld.php:
<?php
defined('JPATH_BASE') or die;
?>
<div id="helloworld">
<h1>Hello World!</h1>
</div>
Entonces en cualquier archivo de diseño, tales como components/com_content/views/article/tmpl/default.php agrega:
<?php
$layout = new JLayoutFile('joomla.content.helloworld');
echo $layout->render();
?>
Mira un artículo en el Lado Cliente y verás Hola Mundo!. Por supuesto, a menudo se le quiere pasar algunos datos a través del método render().
Un ejemplo simple de esto podría ser:
<?php
defined('JPATH_BASE') or die;
?>
<div id="helloworld">
<h1>Hello <?php echo $displayData['name']; ?>!</h1>
</div>
(Ten en cuenta que la variable que se pasa para al diseño se llama $displayData)
Con el correspondiente PHP
<?php
$layout = new JLayoutFile('joomla.content.helloworld');
$data = array('name' => 'Bob');
echo $layout->render($data);
?>
Ahora al ver tu artículo debes ver: Hola Bob!.
Para obtener información adicional, también puedes leer este artículo en Joomla! Community Magazine™: JLayout Mejoras para Joomla! 3.2 por Roberto Segura.