Ya tenemos nuestro formulario enviando comentarios vía Ajax, y sin chistar. En esta parte solo nos falta visualizar los últimos comentarios del artículo debajo del formulario para comentar. ¡Manos a la obra!.
Espero que hayan agregado las cadenas de texto que hablamos en el final del segundo tutorial, recuerden que las mismas van dentro del archivo de idioma del componente, aunque pudiéramos ponerlas dentro del plugin, pero para mantener la centralización, pues las colocamos en el componente, que de paso tiene más lógica ponerlas aquí.
Recuerden que en GITHUB tenemos nuestro repositorio, en el cual pueden ir encontrando el paquete hasta donde lo hayamos dejado. No duden en seguirlo, ya que este es nuestro espacio para almacenar todo lo que vayamos creando a lo largo de este grandioso proyecto que Manuales Joomla trae para ustedes.
Desarrollo de la lógica para el modelo del listado de comentarios
Entonces, nos toca mostrar una lista de comentarios del artículo. Ya más o menos deben irse figurando por donde va la cosa. Necesitamos mostrar una lista con los últimos comentarios del artículo. Por lo que necesitamos acceder a la tabla de la base de datos, recopilar todos los comentarios de un artículo determinado (filtrando por el ID del mismo), hacer alguna comprobación en caso de que sea necesario, y devolver esa lista a una vista para que la muestre. En otras palabras, necesitamos un modelo para el trabajo de la recopilación en la base de datos, y un layout en el plugin para mostrar lo recopilado. Empezamos por el modelo.
Lo primero a implementar es la función que nos va a obtener el listado de los comentarios de un determinado artículo. Para ello, creamos una archivo llamado “formlist.php” dentro de la carpeta “models” el cual va a ser el modelo para todo el trabajo de recopilación de comentarios. Abrimos el archivo y lo editamos, quedándonos de esta forma:
Lo primero que hemos escrito aquí, es la declaración de la clase a utilizar. Recuerden que el nombre de la clase es siguiendo la nomenclatura que Joomla establece. Pero esta vez, hemos heredado nuestra clase, de una clase padre diferente. En el otro modelo la clase padre es “JModelForm” ya que ella implementa funciones referentes a la creación y validación de formularios. Esta vez, la clase padre es “JModelList” (libraries\legacy\model\list.php). Esta clase sus funciones están dedicadas a la obtención de una lista de “items” en nuestro caso de comentarios, a la cual se le puede aplicar paginación, orden, dirección, etc.
Nuestra primera función en esta clase se llama “getComments”. Esta función es propia de nosotros y no aparece dentro de la clase “JModelList”, pero es derivada (casi igual) de la función “getItems” de esta clase. La única diferencia, es que la función “getComments” recibe un argumento que es el ID del artículo para el cual debemos obtener la lista de comentarios en caso de que tenga comentarios claro está. Este argumento nos lo pasa el plugin, cuando desde allá, llamemos a esta función. Luego, en la línea 25 pueden ver como se establece una especie de filtro, el cual toma el ID del artículo pasado como argumento en la función. Estos filtros son una genialidad. Gracias a estos filtros, podemos por ejemplo desde la implementación de un módulo establecer valores diferentes para estos filtro en una determinada consulta que queramos hacer a la base de datos, sin necesidad de hacer en el módulo una función que haga lo mismo. Sencillamente, utilizamos la misma función del componente, cambiamos algunas variables (filtros) obteniendo un resultado determinado. Y con esto, seguimos asegurando nuestra centralización. Esto lo verán con más claridad más adelante en este ciclo.
Luego, en la línea 28, aparece la función “getStoreId”. Esta función pertenece a la clase padre. Su objetivo es obtener los valores establecidos para cada filtro que utilicemos en nuestro modelo. En la función de la clase padre, verán que ya hay 4 filtros establecidos. Uno (list.start), especificando el comienzo de la lista, por ejemplo, si queremos que la lista de comentarios que obtenemos de un artículo, empiece en el tercer comentario dejando de mostrar el primero y el segundo. Otro (list.limit), especificando el límite de la lista, es decir, el número máximo de comentarios que se van a mostrar. Otro (list.ordering), especificando en qué orden se va a mostrar la lista, por ejemplo, por fecha de creación del comentario (esto por supuesto tenemos que definirlo antes). Otro (list.direction), especificando la dirección en que se va a mostrar la lista, por ejemplo, de forma descendente.
Por supuesto, los valores para estos filtros los asignamos en nuestro modelo. Aquí solo están definiendo 4 filtros que son básicos en cualquier lista de “items”.
Línea 31, el modelo padre de nuestra clase implementa un almacenamiento interno evitando repetir consultas innecesarias.
Línea 37, aquí llamamos a otra función de la clase padre. Siguiendo lo del almacenamiento interno, esta nos asegura que la consulta se construya una sola vez para un determinado estado del modelo. Es decir, que no va a construir una consulta igual una y otra vez, sino que, si ya la consulta fue creada en un determinado estado del modelo se devolverá esa consulta y no la creación de una nueva.
Luego en la línea 41, llamamos a la función “_getList” de la clase “JModelLegacy”. Nuestra clase padre “JModelList” hereda a su vez de otra clase padre llamada “JModelLegacy” que es la clase base para todos los tipos de modelos “JModelForm”, “JModelList”, “JModelItem”. Entonces, la función lo que hace es ejecutar la consulta creada previamente, devolviendonos un array indexado de objetos PHP a partir de los registros de la tabla devueltos por la consulta.
Como pudieron darse cuenta, no es tan difícil lo que acabamos de hacer, teniendo en cuenta que Joomla nos hace más de la mitad del trabajo. Pero nuestra función la podemos optimizar aún más. Si se fijan, como bien decíamos antes, nuestra función “getItems” es casi igual a la función de la clase padre “JModelList”, y exactamente a partir de la línea 28. Por lo que si en ese punto llamamos a la función de la clase padre, ¿no creen que funcionaria de la misma manera?
Otra cosa que pudiéramos mejorar, autodocumentado al mismo tiempo nuestra extensión, es ponerle un nombre que referencie lo que estamos haciendo aquí, ya que “getComments” es muy general. Por ejemplo, podemos llamarle “getCommentsArticle”. De esta forma nos referimos a la obtención de los comentarios de un artículo.
Aplicando estos cambios nos quedaría todo de esta forma:
¡Gracias a CComment! por facilitar los comentarios en ManualesJoomla.es!