Joomla! Discussion Forums



It is currently Thu Nov 26, 2009 11:15 pm (All times are UTC )

 





Post new topic Reply to topic  [ 2 posts ] 
Author Message
Posted: Mon Apr 20, 2009 4:26 pm 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Sun Apr 20, 2008 9:44 pm
Posts: 39
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.


Top
  E-mail  
 
Posted: Mon Aug 03, 2009 10:17 am 
Joomla! Apprentice
Joomla! Apprentice
Offline

Joined: Sat May 19, 2007 11:33 am
Posts: 12
Location: Madrid
Hola merill, gracias por los dos tutoriales, ya he creado mi primer componente para Joomla 1.5, un chat (bueno, me queda la administración).

Quería preguntarte si podías decirme como funcionan las clases JModel, cuál se carga según la url, y si se deben usar en el controler o en el view.<format>.<ext>

Por ejemplo, uso ajax para recoger mensajes nuevos, utilizo la url:

index.php?option=com_xxx&task=get_msgs&no_html=1

Con el controler.php, funcion get_msgs() me meto en la base de datos, y hago un die() de los mensajes nuevos, pero me gustaría ahora mostrar los datos con xml usando una vista, por ejemplo:

index.php?option=com_xxx&view=ajax&task=get_msgs&no_html=1

y en el default.php de la vista mostrar con un foreach ($this->msgs) los datos, el "problema" es que la propiedad msgs debería "cargarla" en el view.html.php de ajax, entonces me gustaría usar un modelo para poner directamente:

$this->assignRef('msgs', modelo::get_msgs());

O como se llamara a la función del modelo.

Ahora no uso ninguna clase hija de JModel, las clases las tengo en una carpeta llamada helpers ^^

Muchas gracias ;)

_________________
JoniJnm.es


Top
   
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

Quick reply

 



Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group