Manuales Joomla

Sistema de comentarios - Tutorial 2, Envío de comentarios vía Ajax

(Lo puedes leer en: 15 - 30 minutos)

por .

En el primer tutorial de este ciclo, luego de una extensa explicación, logramos  visualizar el tan deseado formulario. Ahora nos toca hacer funcionar el envío de estos comentarios, así como mostrar la lista de los últimos comentarios del artículo. ¡Manos a la obra!.

Desarrollo de la acción de envío de un comentario (vía Ajax).

Como bien adelantamos, nos toca hacer funcionar el envío de comentarios a través del formulario de comentarios del artículo. Como aderezo, haremos este envío vía Ajax, lo cual lo hace más picante sin duda.

Nota: Recuerden que el repositorio lo pueden encontrar en GITHUB.

Pero antes, en el tutorial pasado dejamos pendiente algo que sería conveniente dejarlo solucionado. El problema es, que el formulario se muestra correctamente, pero las cadenas de texto traducibles están en su forma menos vistosa, a pesar que tenemos asignado un valor para cada una de ellas desde nuestro componente. Y precisamente esto, es nuestro problema. Los valores los tenemos asignados allá en el componente no aquí en el plugin, y como el que está corriendo es el plugin, pues Joomla no reconoce los valores para estas cadenas de texto traducibles. Para solucionar esto, tenemos 2 vías. La primera es copiar las cadenas de texto desde el archivo de idioma del componente para el archivo de idioma del plugin. La segunda, es cargar directamente en el plugin, los archivos de idioma del componente. Cualquiera de las 2 vías son correctas. En nuestro caso, escogeré la segunda para mantener así la idea de centralizar todo.

Para hacer lo que queremos, usaremos la función “load” de la clase “JLanguage”. (Línea 721 - 771 => libraries\joomla\language). Para más información, pueden leer estos artículos (Uno,Dos) de la documentación de Joomla. Por tanto, abrimos el punto de entrada del plugin para editarlo, añadiendo lo siguiente:

  1. // Add the language file of the component
  2. $lang = JFactory::getLanguage();
  3. $lang->load('com_mjcomments'
Source code

Añadiendo archivos de idioma del componente en el plugin

Con esto estamos diciendo que cargue el archivo del idioma español del componente “com_mjcomments” para que de esta forma las cadenas de texto traducibles del formulario tomen sus valores. Pero si se detienen un poco en el código de la función “load”, esta hace una llamada a otra función llamada “getLanguagePath” que obtiene el camino o la ruta hacia los archivos de idiomas. Pero aquí está el detalle. Esta función busca dentro de una carpeta “language” a partir de una ruta que se le pasa. En este caso, le estamos pasando a la función “load” la ruta de la constante JPATH_SITE por lo que está buscando dentro de la carpeta “language” de la raíz de nuestro sitio, por ende, si actualizamos el paquete verán que no surge efecto este cambio, ya que dentro de esa carpeta no tenemos ningún archivo de idioma perteneciente al componente.

Tenemos nuevamente 2 soluciones posibles. La primera es editar el archivo manifiesto del componente y añadir una etiqueta “language” para que instale los archivos de idioma dentro de la carpeta “language” de la raíz del sitio. La segunda variante es sencillamente pasarle la ruta hacía la carpeta del componente y que de ahí lea los archivos de idioma. Yo usare la segunda variante, pero ambas son válidas.

Volvemos a editar el punto de entrada del plugin añadiendo la ruta física hasta los archivos de idioma del componente. Esto quedaría de esta forma:

  1. // Add the language file of the component
  2. '/components/com_mjcomments';
  3. $lang->load('com_mjcomments'
Source code

Añadiendo archivos de idioma del componente al plugin

Y con esto hecho, actualizamos el paquete en nuestro sitio y verán que ya las cadenas de texto traducibles, están en su versión mejorada.

Vista del formulario para comentar

Ya se ve mejor ¿verdad?.

Entrando en materia de lo que nos corresponde en este segundo tutorial, ahora que tenemos la vista del formulario, nos corresponde hacerlo funcionar. Si se fijan ya hay algo que funciona, no se puede dejar ningún campo vacío para poder enviar un comentario:

Vista del formulario para comentar

Esto es gracia a que desde HTML5 en cada campo de un formulario html, se le puede incorporar un atributo llamado “required” el cual comprueba que el campo no esté vacío antes de enviarlo. Por supuesto, cada salida de estos mensajes de alerta son diferentes en cada navegador, y hay algunos que aún no implementan esta funcionalidad de HTML5. Por lo que una recomendación sería manejar esto desde el propio plugin con ayuda de jQuery. Pero bueno, esto es tarea para la casa.

Cuando alguien de clic en el botón de enviar, según el flujo que hemos planteado desde el principio, el formulario debe mandar los valores entrados hacia el componente para su validación y su inserción en la base de datos. Por lo que primero nos ocuparemos del envío de los valores.

Como el envío es a través de Ajax, necesitamos crear un archivo javascript en el plugin. Para ello crearemos la carpeta “media” con el archivo “plg_mjformcomment.js” y lo declararemos en el manifiesto del plugin. Nos quedaría todo de esta forma:

  1. <media folder="media" destination="pkg_mjcommentsystem">
  2. <folder>plg_content_mjformcomment</folder>
  3. </media>
Source code

Archivo manifiesto del plugin

En la próxima actualización del paquete, se creará dentro de la carpeta “media” en la raíz del sitio, una carpeta llamada “pkg_mjcommentsystem”. Dentro, tendrá otra carpeta llamada “plg_content_mjformcomment” con la carpeta “js” más el archivo “plg_mjformcomment.js”.

Ahora abrimos el archivo “plg_mjformcomment.js” para editarlo.

  1. span style="color: #009900; font-style: italic;">/* Send a comment */
  2. $("#mjformcomments #comments-form"
Source code

Archivo javascript del plugin

Lo primero que hicimos es cancelar la acción de envío del formulario, ya que esto lo vamos a tramitar vía Ajax. Luego llamamos a la función “doAjax” pasándole como argumento el objeto del formulario. Vamos a crear ahora el cuerpo de esta función:

  1. /* Obtain data to be processed. Instantiating the Ajax*/"action""#article_id""#jform_visitor_name""#jform_visitor_email""#jform_visitor_comments").val();
  2.  
  3. // Always set content_id as last value
  4. /*Pass the values to the AJAX request*/
  5. /*'ajax' is the jqXHR object*/"#jform_visitor_comments").val('''green''red''Not connect: Verify Network.', 'red''Requested page not found [404]', 'red''Internal Server Error [500].', 'red''parsererror''Requested JSON parse failed.', 'red''timeout''Time out error.', 'red''abort''Ajax request aborted.', 'red''Uncaught Error: ' + jqXHR.responseText, 'red');
  6. }
  7. });
  8. }
Source code

Archivo javascript del plugin

Archivo javascript del plugin

Aquí todo es jQuery, por lo que no será necesario entrar en detalles, pero sí resaltaremos algunas cosas. Primero, obtenemos los valores de los campos de nuestro formulario. Estos campos están identificados como ustedes pueden ver, por el atributo ID de cada campo. Pero por ejemplo, este ID “jform_visitor_name” nosotros nunca lo hemos declarado en el layout del formulario. Y es que Joomla genera estos ID para cada campo. Es decir, le pone un prefijo “jform” seguido del nombre del campo “visitor_name”. Esto lo pueden ver en el sitio, inspeccionando el código del formulario con el navegador.

Otra cosa a destacar, es que estamos capturando la URL a donde tiene que enviar los datos (línea 13) y el ID (identificador de la tabla de artículos “com_content”) del artículo. Ambos valores no se encuentran actualmente en el layout del formulario, por lo que tendremos luego que editarlo para incluirlos.

A partir de la línea 24, llamamos a la función “theAjax” (tenemos que crearla) la cual es la que nos va a procesar la petición Ajax. Dentro de la función “.done” del objeto “jqXHR” en la línea 27, vaciamos el “textarea” del comentario una vez se envíe, de esta forma el usuario no puede enviar una y otra vez haciendo clic continuamente sobre el botón “Enviar”, obligándolo a escribir nuevamente otro comentario. Estos formas de seguridad, que podemos aplicar a los formulario. Por ejemplo, podemos hacer que una vez se envíe el comentario, el botón de enviar el comentario permanesca deshabilitado X cantidad de segundos. Otra medida de seguridad por ejemplo, es incluir el reCAPTCHA de google. Ya hablaremos de esto en otro momento.

También notaran que hacemos en varias ocasiones una llamada a la función “mjNotification()” pasandole un texto y un color como argumentos. Esta función nos va a servir para mostrar una notificación de envío, de esta forma el usuario sabe si se envio correctamente su comentario o no.

Prosigamos con lo que nos falta en este archivo. Vamos a crear el cuerpo de la función “theAjax” quedándonos de esta forma:

  1. /*Returns the jqXHR object*/'post',
  2. dataType: 'json'
Source code

Archivo javascript del plugin

Como bien decíamos, esta función se encarga de la petición ajax. Por último, creamos las funciones que van a llevar a cabo las notificaciones para el usuario. Tenemos que crear dos. Una para crear la estructura HTML de la notificación para luego mostrarla y otra para quitar o eliminar la estructura HTML. La que crea la estructura, sería de esta forma:

  1. /* Comment notification system */"",
  2. html,
  3. time = '5000''body''#mjNotification''#mjNotification'"<i class='" + icon + "'></i> ""<i class='fa fa-info-circle'></i> ";
  4. }
  5.  
  6. // Generate the HTML
  7. html = $('<div class="mjalert mjalert-' + color + '"><p>' + icon_markup + text + '</p></div>''fast');
  8.  
  9. // Append the label to the container
  10. // Remove the notification on click
  11. html.on('click'// After 'time' seconds, the animation fades out
  12. '.mjalert').first());
  13. }, time);
  14. }
Source code

Archivo javascript del plugin

De aquí resaltar 2 cosas. La estructura HTML de la notificación se inserta por defecto al final del “body” del documento HTML. Por supuesto tenemos que insertarla con una propiedad de “position: absolute” para poder moverlo por todo el body y ajustar en que parte de la pantalla queremos que salga. Esto lo haremos luego con CSS. La otra cosa que quería destacar, es que se utiliza dentro de la estructura HTML de la notificación, un icono de Font Awesome. En nuestro caso usaremos esta herramienta para los iconos, pero ustedes pueden usar la de su preferencia, como si quieren usar una imagen que represente el icono de su gusto.

Como pueden ver, existe otra función llamada “mjNotificationX” y es la que llamamos para eliminar la notificación.

  1. span style="color: #009900; font-style: italic;">// Called without argument, the function removes all alerts
  2. // element must be a jQuery object
  3. "undefined") {
  4. element.fadeOut('fast''.mjalert').fadeOut('fast'
Source code

Archivo javascript del plugin

De todas forma, tengan presente que se comentó lo más posible cada línea para su mejor entendimiento y para seguir las buenas prácticas de la programación. Recuerden que el código lo tienen disponible desde GITHUB.

Ahora solo nos queda completar los valores que nos faltaban para el envío de los datos, como bien resaltamos más arriba. El valor de hacia dónde tiene que mandar todo los valores recogidos y el ID del artículo en el cual se hizo el comentario. Para esto iremos al layout del formulario y lo editaremos. Abrimos el archivo “default_form.php” de la carpeta “layouts” del plugin:

  1. span style="color: #ff0000;">'behavior.formvalidator');
Source code


  1. span style="color: #ff0000;">"comments-form" action="<?php echo $data['formReturn']; ?>" method="post""form-validate" enctype="multipart/form-data">"
Source code


  1. <button type="submit" class="btn btn-primary btn-block validate">Enviar</button>
Source code


  1. <input type="hidden" id="article_id" name="article_id" value="<?php echo $data['content_id']; ?>" />
Source code

Layout del formulario

Aquí hemos modificado o añadido varias líneas. El siguiente material de la documentación de Joomla, le explicara algunos cambios que hemos realizado en este archivo, como son la línea 12 y la línea 46. Estamos haciendo estas modificaciones ahora, porque estamos en el proceso de envío de un comentario, por lo que hay que tomar todas las precauciones posibles para que los datos sean enviados de forma correcta.

Como pueden ver en la línea 26 de nuestro layout, hemos modificado el atributo “action” del formulario. Le estamos pasando una supuesta url de hacia dónde debe enviar los datos. Digo supuesta, porque en nuestro array “$data” no tenemos aún ningún índice con el nombre “formReturn”. Luego añadimos en la línea 47 otro campo “input” el cual tendrá el ID del artículo que se está visualizando. Pero al igual que el anterior, no tenemos aún ningún índice llamado “content_id”.

Entonces, si seguimos la cadena, ahora toca añadir al array “$data” los dos índice que nos faltan. Ahora editaremos el archivo de entrada de nuestro plugin. Abrimos el archivo “mjformcomment.php”:

  1. // Assign value to the layout variables
  2. 'index.php?option=com_mjcomments&amp;task=comment.send&amp;format=json';
Source code

Punto de entrada del plugin

De aquí solo destacar la url hacia dónde van los valores introducidos en un comentario. Como pueden ver, es una url la cual cita a nuestro componente y una tarea (task) a llevar a cabo. Pero esto ya vendrá después.

Con esto ya completamos el proceso del envío de un comentario vía ajax. Por supuesto, nadamas hemos hecho el envío, faltaría la recepción por de estos datos por parte del componente. Pero primero, probemos a ver que hace todo esto que hemos hecho. Actualicemos el paquete. Si escribimos un comentario y lo enviamos, la pantalla se queda en blanco. Esto es señal de que algo no está corriendo bien. Está claro que no debe pasar nada, porque no hemos recepcionado los valores del comentario, pero lo que si no puede pasar, es que la pantalla se ponga en blanco y que en nuestra barra de dirección del navegador aparezca, la url localhost/manualesjoomla/index.php/index.php?option=com_mjcomments&task=comment.send&format=json. ¿Porque no puede pasar? bueno, porque desde el archivo javascript del plugin, nosotros cancelamos la acción de envío del formulario. Por lo que al menos, se debería de quedar todo en la misma página del artículo y no dirigirnos a una pantalla en blanco. Y precisamente esto es lo que pasa, creamos el archivo javascript, pero no lo incluimos en el documento, por lo que no está siendo cargado en la página. Para hacerlo editaremos una vez más el punto de entrada del plugin. Abrimos el archivo “mjformcomment.php”:

  1. // Add media file
  2. 'jquery.framework''media/pkg_mjcommentsystem/plg_content_mjformcomment/js/plg_mjformcomment.js'
Source code

Punto de entrada del plugin

Una vez más, Joomla nos ahorra mucho trabajo, y le brinda flexibilidad a nuestro desarrollo. La documentación de estas líneas pueden encontrarlas aquíaquí.

Si volvemos actualizar el paquete con este cambio, verán que cuando le damos en el botón de enviar comentario, se va a quedar en la misma página como si nada funcionara. Esto es bueno, aunque no funcione porque ya nuestro script tomó el control. Si inspeccionan la página con el navegador y le dan al botón enviar, verán un error en la consola del navegador diciendo “Uncaught TypeError: Cannot read property 'success' of null”. Y precisamente, como nadie está devolviendo una respuesta al envío de los valores, el objeto “response” toma null. Ayudemos entonces un poco a este objeto, y hagamos que alguien le responda su petición.

Como bien vimos más arriba, la url a donde es enviado los datos del formulario, es al componente y específicamente hacia una tarea llamada “task=comment.send”. Joomla implementa en su modelo MVC, un controlador maestro y una serie de subcontroladores para el trabajo perteneciente al CRUD. Pueden apoyarse en estos documentos (1, 2), para un mejor entendimiento. Entonces, debemos crear nuestro controlador maestro en el componente y un subcontrolador que es el que se va a encargar del procesamiento de los valores enviados y de devolver una respuesta a la petición Ajax.

Empecemos por el subcontrolador. Todos los subcontroladores van dentro de una carpeta llamada “controllers”. Como este trabajo se va a llevar en la parte pública del componente, crearemos esta carpeta dentro de la carpeta “site”. Dentro de la carpeta, crearemos un archivo llamado, “comment.json.php”. Este será el subcontrolador encargado del procesamiento de los datos. Recuerden que este nombre que le dimos no es a priori. Le pusimos “comment” porque en la variable “task” de la url, este es el nombre. Y “json” porque hemos pasado en la url una variable “format=json”, quedándonos entonces con el nombre “comment.json”, de esta forma Joomla sabe que componente y que subcontrolador va a ejecutar la tarea asignada.

Editemos “comment.json.php”:

  1. span style="color: #808080; font-style: italic;">/**
  2.  * @package MJ.Component
  3.  * @subpackage mjcomments
  4.  *
  5.  * @copyright Copyright (C) 2015 Carlos Rodriguez. All rights reserved.
  6.  * @license License http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
  7.  */'_JEXEC'/**
  8.  * Form controller class.
  9.  *
  10.  *//**
  11.   * Method to check the form data.
  12.   *
  13.   * @return boolean True on success, false on failure.
  14.   *
  15.   */'Formcomment', 'MjcommentsModel'// Get the comment data
  16. $<span style="font-family: 'courier new', courier, monospace; line-height: 15.6000003814697px;"'jform', '', 'raw');
  17.  
  18. // Get the form
  19. // Check for validation errors
  20. 'COM_MJCOMMENTS_CONTROLLERS_COMMENT_VALIDATE_FORM_DATA'// Validate the posted data
  21. // Check for validation errors
  22. 'COM_MJCOMMENTS_CONTROLLERS_COMMENT_VALIDATE_FORM_DATA'// Save the data in the session
  23. 'com_mjcomments.formcomment.data'// Attempt to save the data
  24. // Check for errors
  25. 'COM_MJCOMMENTS_CONTROLLERS_COMMENT_SAVE_FORM_DATA'// Save the data in the session
  26. 'com_mjcomments.formcomment.data'// Flush the data from the session.
  27. 'com_mjcomments.formcomment.data'
Source code

Subcontrolador cooment.json
Subcontrolador cooment.json

Lo primero que hicimos fue crear una funciön para la validación y comprobación del formulario y sus valores enviados. La llamamos “checkFormData”, y pueden apreciar que no es nada del otro mundo.

La obtención de los valores enviados, se realiza en las líneas 31 y 32. Pueden ver la documentación de esta parte.

Se utiliza la clase “JText” (libraries\joomla\language\text.php) para la salida de las cadenas de texto traducibles. Pueden ver como otras funcionalidades de esta clase aquí.

Para la validación de los datos entrados, se utiliza la función “validate” (línea 47) de la clase “JModelForm”. Esto Joomla lo hace por nosotros, tan solo es llamar a la función con sus dos argumentos.

Otra función que utilizamos es “setUserState”. Esto nos permite almacenar valores en la sesión, muy útil para por ejemplo, que el usuario no tenga que entrar los mismos valores nuevamente en caso de algún error. Vean su documentación.

En la línea 62, llamamos a la función “comment” del modelo. Esta función no está implementada en ningún lado, ya que es la función que vamos a usar para insertar los valores entrados en la base de datos. Por supuesto, esta función la desarrollaremos dentro del modelo “formcomment”. Pero no ahora, lo dejamos para después, terminemos con el subcontrolador.

Como pudieron ver, esta función “checkFormData”, es solo una función para el chequeo de los valores entrados. Por lo que ahora crearemos la función que hemos especificado en la url del atributo “action” del formulario, que es la que Joomla llama para que atienda la petición de envío de un comentario. En la url pusimos “task=comment.send”, donde coomment es el subcontrolador y “send” es la función llamada. Por lo tanto, la creamos en nuestro archivo:

  1. /**
  2.  * Method to proccess the ajax request
  3.  *
  4.  */'COM_MJCOMMENTS_CONTROLLERS_COMMENT_SEND_SUCCESS'
Source code

Subcontrolador comment.json.php

A resaltar aquí, solo la función “JResponseJson”, la cual es la que se encarga de preparar la respuesta a la petición Ajax y entregarsela a nuestro amigo “response” allá en el archivo javascript del plugin ¿se acuerdan?. Pueden ver su documentación.

Ahora le toca el turno al controlador maestro. Creamos un archivo llamado “controller.php” en la raíz de la carpeta “site” del componente, el cual va a tener las siguientes líneas:

  1. span style="color: #808080; font-style: italic;">/**
  2.  * @package MJ.Component
  3.  * @subpackage mjcomments
  4.  *
  5.  * @copyright Copyright (C) 2015 Carlos Rodriguez. All rights reserved.
  6.  * @license License http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
  7.  */'_JEXEC'/**
  8.  * Base controller class.
  9.  *
  10.  */
Source code

Controlador maestro

¿La clase está vacía? Será la pregunta que se hagan. Y por el momento, no necesitamos más nada. Todo lo que hace falta hacer, ya se hace por defecto en la clase padre “JControllerLegacy” (libraries\legacy\controller\legacy.php). No hay vista que mostrar, no hay página a la cual redirigir al usuario, tan solo definir el controlador.

Teniendo todos los controladores listo, tan solo nos queda modificar el punto de entrada del componente en la parte pública del mismo (carpeta “site”) para que se ocupe de asignar el controlador que se va a encargar de la tarea que se pide. Es decir, tenemos un subcontrolador, el cual tiene como encomienda, obtener los datos que se enviaron desde el formulario, procesar los valores, insertarlos en la base de datos (algo que tenemos pendiente aún), y enviar una respuesta satisfactoria en caso de que la tarea se haya cumplido con éxito, o una respuesta negativa en caso contrario. Luego creamos un controlador maestro, que es el que va a dirigir toda la orquesta. El es quien manda a ejecutar determinada tarea. Y esto es precisamente lo que nos queda hacer. Editando entonces el archivo “mjcomments.php” nos queda:

  1. span style="color: #808080; font-style: italic;">/**
  2.  * @package MJ.Component
  3.  * @subpackage mjcomments
  4.  *
  5.  * @copyright Copyright (C) 2015 Carlos Rodriguez. All rights reserved.
  6.  * @license License http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
  7.  */'_JEXEC''Mjcomments''task'));
Source code

Punto de entrada del componente en la parte pública

Con esto listo, sin duda nos entran muchos deseos de una pequeña prueba, a pesar de que nos de error porque aún no hemos creado la función en el modelo para que inserte los datos recibidos. Pero hagamos una prueba, sin duda será reconfortante ver un mensaje de error. Pero antes, recuerden actualizar el manifiesto del componente, añadiendo a la parte pública la carpeta “controllers” y el archivo “controller.php”.

El mensaje de error se va a mostrar a través del bloque de notificación que hemos creado desde el plugin. Ahí definimos la estructura HTML, pero no definimos ningún estilo CSS para el mismo. Así como definimos la inserción del archivo javascript en el plugin, definiremos uno pero esta vez para un css.

Editamos nuevamente el punto de entrada del plugin, y añadimos lo siguiente:

  1. span style="color: #ff0000;">'media/pkg_mjcommentsystem/plg_content_mjformcomment/css/plg_mjformcomment.css'
Source code

Punto de entrada del plugin

Luego creamos la estructura de carpetas necesarias en conjunto con el archivo “plg_mjformcomment.css” dentro de la carpeta “media” del plugin. Los estilos que nos hacen falta son los siguientes:

  1. /* GLOBAL
  2. -------------------------------------------------- */
Source code

Archivo css del plugin

En este caso, estos estilos son, asumiendo que nosotros manualmente insertamos un contenedor div con esta forma “<div id="mjNotification"></div>” en alguna parte de la plantilla del sitio dentro del body del documento, ya que este será el sitio en donde va a salir el bloque de notificación. Sin duda esto es algo que se puede optimizar, y hacerlo más automatizado, pero lo dejaremos así por el momento. Recuerden, tenemos que insertar un conmtenedor div con esta forma “<div id="mjNotification"></div>” en la plantilla que estamos utilizando.

Ahora sí, probemos a ver que tal funciona todo. Actualizamos el paquete y enviamos un comentario desde el sitio:

Vista del formulario

¡Un error muy bonito de ver! Recuerden que este error es porque no hay respuesta desde el componente, debido a que allá se está produciendo un error, porque no hemos definido la función que nos falta en el modelo.

El último paso para que todo funcione sería crear esta función dentro del modelo del componente. Por tanto, editamos el archivo “formcomment.php”:

  1. /**
  2.  * Method to save the form data.
  3.  *
  4.  * @param array $temp The form data.
  5.  *
  6.  * @return boolean True on success, false on failure.
  7.  *
  8.  */// Merge in the comment data.
  9. 'state'] = 1;
  10. $data['content_id'] = (int) $data['content_id'];
  11. $data['visitor_email''visitor_email']);
  12. $data['visitor_comments''visitor_comments'])));
  13. $data['created'// Get a level row instance.
Source code

Modelo del componente

Como bien definimos en el subcontrolador, la función que utilizamos para la inserción de los valores del comentario en la base de datos es, “comment”.

En esta función, insertamos dentro del array “$data”, los valores que nos va a devolver la función “getData” (línea 50 - 56), la cual va a manejar valores almacenados en la sesión.

Luego tomamos los valores y le hacemos uno que otro cambio, para su posterior inserción en la base de datos (línea 58 - 62). Observen como hemos puesto para el campo “state” un número 1. Esto significa que el comentario se publicará automáticamente. Por supuesto, este comportamiento luego lo cambiaremos, y definiremos por ejemplo, en los parámetros del plugin uno nuevo que indique si los comentarios van a ser moderados o no, y en dependencia de este parámetro, asignaremos un número 1 o un número 0, o algo parecido ya veremos cuando llegue el momento.

Por último obtenemos el objeto “$table”, para guardar los valores en la tabla de la base de datos (línea 65 - 70). Observen que aquí hacemos uso de otra función llamada “getTable” la cual debemos definir.

Saldemos las deudas entonces, y empecemos definiendo la función “getData”. Volvemos a editar el archivo “formcomment.php” y añadimos lo siguiente:

  1. /**
  2.  * @var object The client form data.
  3.  */
  4. protected $data;
  5.  
  6. /**
  7.  * Method to get the form data.
  8.  *
  9.  * @return mixed Data object on success, false on failure.
  10.  *
  11.  */// Override the base client data with any data in the session.
  12. 'com_mjcomments.formcomment.data'
Source code

Modelo del componente

Ha resaltar aquí, es que creamos una variable “$data” global la cual usaremos para el manejo de los valores enviados. Aquí trabajamos como pueden ver en la línea 37 con valores almacenados en la sesión.

Por último, creamos la función “getTable”:

  1. /**
  2.  * Get database table
  3.  *
  4.  * @param string $name Instance name of the table to load
  5.  *
  6.  * @return JTable
  7.  */'Mjcomments', $prefix = 'MjcommentsTable'
Source code

Modelo del componente

Esta función nos devuelve una instancia de la clase “JTable”, la cual no hemos creado por ningún lado. Así que al parecer el último eslabón de la cadena va a ser este. 

Para hacer lo que al parecer es nuestra última tarea, tenemos que ir a la carpeta “admin” de nuestro componente y crear una carpeta llamada “tables” y dentro un archivo php con el nombre de la tabla de la base de datos, en este caso “mjcomments”. Esto lo define así Joomla, no es a priori, ya que es esta la ruta donde busca cuando instanciamos la clase “JTable”.

  1. span style="color: #808080; font-style: italic;">/**
  2.  * @package MJ.Component
  3.  * @subpackage mjcomments
  4.  *
  5.  * @copyright Copyright (C) 2015 Carlos Rodriguez. All rights reserved.
  6.  * @license License http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
  7.  */'_JEXEC'/**
  8.  * Comments Table.
  9.  *
  10.  *//**
  11.   * @var integer
  12.   *//**
  13.   * @var integer
  14.   *//**
  15.   * @var string
  16.   *//**
  17.   * @var string
  18.   *//**
  19.   * @var string
  20.   *//**
  21.   * @var datetime
  22.   *//**
  23.   * @var integer
  24.   *//**
  25.   * Constructor
  26.   *
  27.   * @param JDatabaseDriver &amp;$db Database connector object
  28.   *
  29.   * @since 1.0
  30.   */'#__mjcomments', 'id', $db);
  31. }
  32. }
Source code
 

Instancia de la tabla de la base de datos
Instancia de la tabla, de la base de datos

Como pueden ver, es bien sencillo esto. Tan solo declarar cada campo de la tabla de la base de datos, como variables globales en la clase, y luego llamar al constructor de la clase padre.

Bueno, al parecer hemos resuelto todo los pendientes. Debería de funcionar todo ahora, así que a probar. Pero primero, recuerden incluir la nueva carpeta “tables” dentro del manifiesto del componente. Actualizamos el paquete y:

Vista del formulario

¡Epale! todo ha salido tal cual. Tenemos una notificación en verde y si nos fijamos en la tabla de la base de datos, ya está insertado el primer registro de un comentario. Ahora nos toca asignar valores a esas cadenas de texto traducibles de laa notificaciones para que todo quede bien bonito. Estoy seguro que ya para esto no necesitan guía, así que confío que lo hagan bien.

Esto ha sido todo por el momento. No se sientan mal si el formulario sigue viéndose algo deformado, recuerden que primero estamos garantizando la funcionalidad, ya llegará el momento de tocar temas de diseño y visualidad. ¡Nos vemos!

Etiquetas: Desarrollo, Extensiones, Ciclo de desarrollo, Comentarios, Programación

Imprimir