En cualquier caso hace tanto tiempo que escribi el mensaje que ya no recordaba los detalles y lo que dije en mi mensaje anterior (
http://forum.joomla.org/viewtopic.php?f=93&t=293167) no es del todo correcto. En el tutorial en inglés digo alguna cosa más que en el de castellano.
Como creía que el tutorial no tenía interés no me he preocupado acerca de ello pero, en vista de que parece que hay personas que lo leen y lo consideran como válido, voy a proceder a corregir esas deficiencias en esta nueva entrega.
Voy a hacerla como un mensaje nuevo y no como una corrección del existente para que todos puedan apreciar lo que es nuevo. Bueno, al grano...
Como se dijo anteriormente (ver primer mensaje de este hilo), se pueden tener otros formatos aparte de html y J! no aplicará sobre ellos la plantilla seleccionada de nuestro site. Puedes tener un formato 'pdf' para entregar tus datos como documento pdf o incluso un formato 'ajax' para entregar fácilmente respuestas a peticiones ajax con datos en formato JSON o el que se desee. Sólo tienes que construir tu URL como
Code:
http://my.site.com/index.php?option=com_<name>&view=<mivista>&format=ajax
para hacer que el entorno de Joomla! busque y carge un archivo llamado mivista.ajax.php situado en <site root dir>/components/<name>/views/<mivista>/ desde donde puedes enviar al cliente cualquier cosa que desees. Es así de fácil.
De cualquier forma, para conseguir esta meta necesitamos algún código dentro del archivo view.<formato>.php. Ya tenemos el fichero, ahora necesitamos la clase. Y, afortunadamente, sólo tenemos que extender la clase JView siguiendo las estrictas reglas que hemos comentado anteriormente que debemos seguir. En este caso *DEBEMOS* construir nuestra clase concatenando el nombre del componente con la palabra 'View' y con el nombre de la vista. De esta forma el nombre de nuestra clase será un camelizado <componente>View<mivista>. Si nuestro componente se llama 'Viajes' y la vista se llama 'detalle' (URL ...?option=com_viajes&view=detalle) la clase debe ser la siguiente:
Code:
class ViajesViewDetalle extends JView
{
function display($tpl=null)
{
echo 'blah, blah';
}
}
Dentro de esta clase sólo tenemos generar los datos que deseamos presentar con nuestro componente en este caso específico. Puedes hacer esto generando el código [x]HTML directamente, o a través de llamadas a 'echo' dentro del código php, o ser más sutil y usar una presentación (un 'layout' -más sobre esto luego-).
Puedes tener otras funciones aparte de 'display'? No lo se. Esto es algo que los gurus deben responder. De dónde viene la función 'display'?. De nuevo, no lo se. Espero que alguien pueda arrojar alguna luz sobre este punto.
Pero podemos ir un poco más lejos todavía. Hasta este momento tenemos un entorno distribuido que disecciona nuestra petición de tal forma que nos permite crear archivos muy pequeños y específicos que reaccionan sólo a determinados tipos de solicitudes. De esta forma los archivos que se procesan en cada petición son muy cortos y ajustados a lo que se solicita de tal forma que la respuesta global del sistema es rápida en base a no cargar cantidad de código que no resulta útil para el caso actual (como pasaba en Joomla! 1.x).
Habiendo llegado a este punto podemos diseccionar el sistema algo más y añadir otro nivel de detalle: la presentación final que desamos para los datos que entregamos.
Una presentación es una forma de representar los datos para la vista activa. Los mismos datos pueden ser presentados bajo diferentes aspectos visuales de tal manera que el código que usamos para generarlos (dentro de la función 'display' de nuestra clase 'view') no cambia aunque presentemos esos datos de formas diferentes. Nosotros 'inyectamos' los datos de la vista en la plantilla de presentación y usamos el código de la plantilla para
formatearlo visualmente antes de enviarselo al usuario (piensa en el orden de las columnas, el orden de los datos y cosas así).
Como antes, si no especificamos una presentación estaremos usando la prsentación por defecto (el 'default' layout). Con el objeto de usar presentaciones necesitamos crear una nueva carpeta dentro de la vista asociada llamada 'tmpl' y crear un archivo llamado <milayout>.php, ni más ni menos. Si estamos usando la presentación por defecto este fichero se llama 'default.php'.
La presentación deseada se especifica en la URL mediante el parámetro 'layout=<milayout>' o puede ser inyectada localmente en la función si nos las ingeniamos para obtener la presentación que deseamos usar a partir de otras fuentes.
Para inyectar una presentación, nuestra clase en la vista debe llamar a 'parent::display()' y pasar el nombre de la plantilla de presentación deseada como parámetro. Así nuestra clase debiera ser algo como:
Code:
class <Name>View<Viewname> extends JView
{
function display($tpl=null)
{
// Prepare the data
$data1 = ....
$data2 = ....
$moredata[] = array....
// Inject the data
$this->assignRef('variablename', $data1);
$this->assignRef('variablename2', $data2);
$this->assignRef('variablename3', $moredata);
// Inject the layout if not using the request
$this->setLayout('mylayout'); // Local layout injection
parent:display($tpl);
}
}
De esta manera Joomla! buscará un archivo llamado 'mylayout.php' en la carpeta 'tmpl' de la vista asociada. Dentro de este fichero tienes un objeto '$this' que tiene acceso a las variables que hemos inyectado (por medio de la función assignRef) sólo con referenciarlas ('$this->variablename', '$this->variablename1', etc) y que pueden ser usadas para construir la respuesta [x]HTML *FINAL* que entregar al usuario.
También podemos usar lo que podríamos llamar 'plantillas de presentación' ('layout templates'). El archivo que Joomla! buscará en la carpeta de presentaciones (tmpl) esta compuesto por el nombre de la presentación concatenado mediante un guión bajo (underscore) con el valor de la variable $tpl. Si $tpl es 'null' como en el ejemplo anterior el nombre final es simplemente mylayout.php pero, si $tpl vale plantilla1 por ejemplo, entonces el nombre final será mylayout_plantilla1.php siendo posible de esta manera ajustar de forma más fina el grado de precisión en la entrega de los datos solicitados mediante archivos más simples, pequeños y específicos.
Y hasta aquí esta extensión que iguala a lo redactado en la versión inglesa y que completa lo que se de la parte de vistas del model MVC.
Un saludo a todos.