Controladores personalizados en OpenCart 2

Hoy pasaremos por el concepto de controladores en OpenCart 2.x. Con el lanzamiento de la versión OpenCart 2.x, han introducido cambios en el marco que requieren una actualización si ha realizado algún módulo personalizado en la versión anterior-OpenCart 1.x. Veremos un ejemplo práctico de lo que llamaremos Libro de visitas en este tutorial..

Antes de avanzar en este artículo, podría considerar esto como un seguimiento de lo que escribí anteriormente. En ese artículo, expliqué cómo hacer una página personalizada en OpenCart 1.x, y si ya has seguido ese artículo, puedes saltarte rápidamente la mayoría de las secciones de hoy.! 

Por supuesto, es OpenCart 2.x que se discutirá hoy, así que asegúrese de seguir el código de cerca.

Si desea ver más teoría sobre el patrón de marco de OpenCart y los controladores, puede revisar un par de las secciones iniciales de ese artículo. Habiendo dicho eso, no hay nada que le impida seguir este artículo de inmediato, ya que no omitiré ningún elemento esencial..

Por qué un controlador personalizado?

Algo que puede estar preguntando en primer lugar: ¿por qué un controlador personalizado? Entendamos rápidamente de qué se trata el controlador en OpenCart antes de entrar en esto.

En el contexto de OpenCart, el controlador es un componente indispensable del marco que trata directamente con el proceso de enrutamiento y representa la interfaz de usuario. En el proceso, trata con otros componentes importantes como el lenguaje, el modelo y la vista para construir el resultado final.

Cuando accede a cualquier página en OpenCart, el marco de OpenCart busca el controlador correspondiente y le delega un mayor procesamiento. Al ser modular por naturaleza, el marco OpenCart proporciona varios controladores que se ocupan de funcionalidades agrupadas lógicamente.

Por ejemplo, el cuenta el grupo contiene controladores que se ocupan del inicio de sesión, registro, perfil y casos de uso similares. Del mismo modo, el revisa Grupo de controladores maneja el proceso de creación de orden..

En pocas palabras, cuando desee crear una función que no esté en el núcleo de OpenCart y si toma una nueva URL (una ruta en la terminología de OpenCart), debe elegir un controlador personalizado. Le da un control completo del proceso de creación de la página: qué elementos desea mostrar en su página personalizada.

Crear un controlador personalizado

Hoy, implementaremos una funcionalidad básica de Libro de visitas que demuestra el concepto de controladores personalizados. En el transcurso de eso, construiremos una interfaz en el front-end que permita a los usuarios invitados enviar sus comentarios ingresando su nombre y mensaje..

Antes de continuar, asegúrese de que tiene una instalación activa de OpenCart 2.3.x. Y eso es todo para comenzar a trabajar en nuestra función de Libro de visitas..

Para aquellos que no están familiarizados con la estructura OpenCart, el lugar para buscar los controladores front-end es catálogo / controlador. Es el directorio que gestiona todos los controladores por grupo, en función de las características que proporcionan.

En nuestro caso, crearemos un grupo separado llamado libro de visitas. Sigue adelante y crea un directorio. catálogo / controlador / libro de visitas. Dentro de ese directorio, crea un entrada.php Archivo con los siguientes contenidos. Es un archivo de controlador que maneja la lógica de la aplicación y la lógica de envío de nuestra funcionalidad de Libro de visitas.

load-> language ('guestbook / guestbook'); $ this-> document-> setTitle ($ this-> language-> get ('heading_title')); if (($ this-> request-> server ['REQUEST_METHOD'] == 'POST') && $ this-> validate ()) $ this-> load-> model ('guestbook / guestbook'); $ data ['subject'] = sprintf ('Nueva entrada del libro de visitas enviada por% s', $ this-> request-> post ['guest_name']); $ data ['mensaje'] = $ this-> request-> post ['guest_message']; $ this-> model_guestbook_guestbook-> processGuestbookEntry ($ data); $ this-> session-> data ['success'] = $ this-> language-> get ('text_success'); $ this-> response-> redirect ($ this-> url-> link ('guestbook / entry', ", true)); $ data ['success'] ="; if (isset ($ this-> session-> data ['success'])) $ data ['success'] = $ this-> session-> data ['success']; unset ($ this-> session-> data ['success']);  $ data ['breadcrumbs'] = array (); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> get ('text_home'), 'href' => $ this-> url-> link ('common / home' )); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> get ('heading_title'), 'href' => $ this-> url-> link ('guestbook / entry' , ", verdadero)); $ data ['heading_title'] = $ this-> language-> get ('heading_title'); $ data ['entry_guest_name'] = $ this-> language-> get ('entry_guest_name') $ data ['entry_guest_message'] = $ this-> language-> get ('entry_guest_message'); $ data ['entry_submit'] = $ this-> language-> get ('entry_submit'); if (isset ($ this-> error ['guest_name'])) $ data ['error_guest_name'] = $ this-> error ['guest_name']; else $ data ['error_guest_name'] = ";  if (isset ($ this-> error ['guest_message'])) $ data ['error_guest_message'] = $ this-> error ['guest_message'];  else $ data ['error_guest_message'] = "; $ data ['action'] = $ this-> url-> link ('guestbook / entry',", true); if (isset ($ this-> request-> post ['guest_name'])) $ data ['guest_name'] = $ this-> request-> post ['guest_name'];  else $ data ['guest_name'] = "; if (isset ($ this-> request-> post ['guest_message'])) $ data ['guest_message'] = $ this-> request-> post ['guest_message']; else $ data ['guest_message'] = ";  $ data ['column_left'] = $ this-> load-> controller ('common / column_left'); $ data ['column_right'] = $ this-> load-> controller ('common / column_right'); $ data ['content_top'] = $ this-> load-> controller ('common / content_top'); $ data ['content_bottom'] = $ this-> load-> controller ('common / content_bottom'); $ data ['footer'] = $ this-> load-> controller ('common / footer'); $ data ['header'] = $ this-> load-> controller ('common / header'); $ this-> response-> setOutput ($ this-> load-> view ('guestbook / entry', $ data));  validar función protegida () si (utf8_strlen (recortar ($ this-> request-> post ['guest_name'])) < 1)  $this->error ['guest_name'] = $ this-> language-> get ('error_guest_name');  if (utf8_strlen (recortar ($ this-> request-> post ['guest_message'])) < 1)  $this->error ['guest_message'] = $ this-> language-> get ('error_guest_message');  volver! $ este-> error;  

De acuerdo con las convenciones de nomenclatura de OpenCart, el nombre de la clase comienza con el Controlador palabra clave seguida del nombre del directorio, Libro de visitas En nuestro caso, en el que reside el archivo de clase. Además, el nombre del archivo de clase, Entrada En nuestro caso, se anexa al final..

Cada clase de controlador proporciona un de facto índice Método que maneja la mayor parte de la lógica del controlador. A continuación, vamos a pasar por el código en el índice Método, y también crearemos otros archivos según sea necesario..

La mayoría de las veces, comenzaremos por incluir el archivo de idioma para el grupo específico. Es la forma en que OpenCart gestiona las etiquetas de lenguaje estático en toda la aplicación. Por supuesto, eso hace que la implementación de sitios en varios idiomas sea muy fácil.

$ this-> load-> language ('guestbook / guestbook');

Antes de seguir adelante, vamos a crear el archivo de idioma correspondiente para que nuestro controlador pueda encontrarlo. Crear un catálogo / idioma / en-gb / guestbook / guestbook.php archivo con los siguientes contenidos.

Como puede ver, solo estamos asignando etiquetas con sus valores en la matriz de idiomas.

De vuelta a nuestro controlador, lo siguiente es configurar la etiqueta de título HTML para nuestra página.

$ this-> document-> setTitle ($ this-> language-> get ('heading_title'));

Los usuarios con ojos agudos habrán notado que hemos usado el título_título Variable de idioma definida en el archivo de idioma creado hace un momento..

Para entender el siguiente fragmento de código, necesitamos crear un archivo modelo. Por un momento, lo desviaré para crear el archivo modelo en catálogo / modelo / libro de visitas / guestbook.php con los siguientes contenidos.

protocol = $ this-> config-> get ('config_mail_protocol'); $ mail-> parámetro = $ this-> config-> get ('config_mail_parameter'); $ mail-> smtp_hostname = $ this-> config-> get ('config_mail_smtp_hostname'); $ mail-> smtp_username = $ this-> config-> get ('config_mail_smtp_username'); $ mail-> smtp_password = html_entity_decode ($ this-> config-> get ('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); $ mail-> smtp_port = $ this-> config-> get ('config_mail_smtp_port'); $ mail-> smtp_timeout = $ this-> config-> get ('config_mail_smtp_timeout'); $ mail-> setTo ($ this-> config-> get ('config_email')); $ mail-> setFrom ($ this-> config-> get ('config_email')); $ mail-> setSender (html_entity_decode ($ this-> config-> get ('config_name'), ENT_QUOTES, 'UTF-8')); $ mail-> setSubject ($ data ['subject']); $ mail-> setText ($ data ['mensaje']); $ mail-> send ();  

En OpenCart, el modelo es responsable de manejar la lógica de negocios de la aplicación. Si desea implementar alguna lógica que involucre una base de datos, este es el lugar donde debe ir.

La convención de nomenclatura de la clase de modelo es similar a la de la clase de controlador. Para mantener las cosas simples, hemos implementado un método. processGuestbookEntry que notifica al administrador de la tienda por correo electrónico cuando un usuario envía una entrada del Libro de visitas. Bastante simple, eh?

Regresemos a nuestro controlador y examinemos el siguiente fragmento de código en la cola.

if (($ this-> request-> server ['REQUEST_METHOD'] == 'POST') && $ this-> validate ()) $ this-> load-> model ('guestbook / guestbook'); $ data ['subject'] = sprintf ('Nueva entrada del libro de visitas enviada por% s', $ this-> request-> post ['guest_name']); $ data ['mensaje'] = $ this-> request-> post ['guest_message']; $ this-> model_guestbook_guestbook-> processGuestbookEntry ($ data); $ this-> session-> data ['success'] = $ this-> language-> get ('text_success'); $ this-> response-> redirect ($ this-> url-> link ('guestbook / entry', ", true));

Verifica por un valido ENVIAR solicitud y hace validación básica de los datos enviados por el usuario llamando a la validar método.

El código $ this-> load-> model ('guestbook / guestbook') Se utiliza para cargar el modelo que definimos hace un momento. Inmediatamente después, preparamos la $ datos matriz basada en la entrada del usuario y llame a la processGuestbookEntry Método, que notifica al administrador de la tienda sobre la entrada del Libro de visitas. Por último, redirigimos al usuario a la página de entrada del Libro de visitas..

Avanzando en el controlador, el siguiente fragmento de código configura el mensaje de éxito que se mostrará al enviar el formulario..

$ data ['success'] = "; if (isset ($ this-> session-> data ['success'])) $ data ['success'] = $ this-> session-> data ['success' ]; unset ($ this-> session-> data ['success']);

Después de eso, hay un fragmento que se utiliza para crear enlaces de ruta de exploración para la página.

$ data ['breadcrumbs'] = array (); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> get ('text_home'), 'href' => $ this-> url-> link ('common / home' )); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> get ('heading_title'), 'href' => $ this-> url-> link ('guestbook / entry' ,", cierto) );

El siguiente fragmento de código es importante, y es algo que utilizará la mayor parte del tiempo para pasar información del método del controlador a la plantilla de vista..

$ data ['heading_title'] = $ this-> language-> get ('heading_title'); $ data ['entry_guest_name'] = $ this-> language-> get ('entry_guest_name'); $ data ['entry_guest_message'] = $ this-> language-> get ('entry_guest_message'); $ data ['entry_submit'] = $ this-> language-> get ('entry_submit');

Similar a la asignación de variables, OpenCart inicializa elementos comunes del encabezado de página, pie de página y similares, como se muestra en el siguiente fragmento de código.

$ data ['column_left'] = $ this-> load-> controller ('common / column_left'); $ data ['column_right'] = $ this-> load-> controller ('common / column_right'); $ data ['content_top'] = $ this-> load-> controller ('common / content_top'); $ data ['content_bottom'] = $ this-> load-> controller ('common / content_bottom'); $ data ['footer'] = $ this-> load-> controller ('common / footer'); $ data ['header'] = $ this-> load-> controller ('common / header');

Finalmente, llama a la plantilla de vista para renderizar la página real.!

$ this-> response-> setOutput ($ this-> load-> view ('guestbook / entry', $ data));

Por supuesto, todavía no hemos creado una plantilla de vista. ¡Es el momento perfecto para hacer eso! Sigue adelante y crea un catalog / view / theme / default / template / guestbook / entry.tpl archivo con los siguientes contenidos.

 
  • ">

Este es nuestro archivo de plantilla de vista principal que se encarga de mostrar el contenido de nuestra página de Libro de visitas. En este archivo, acabamos de utilizar las variables que se configuraron en el controlador índice método.

Es importante tener en cuenta que la capacidad de respuesta es algo que viene incorporado con las versiones recientes de OpenCart compatibles con el marco de Bootstrap. Aparte de eso, es algo bastante normal en HTML que es bastante fácil de entender.

Entonces, eso es todo en lo que respecta a la configuración del archivo..

Ya tenemos todo en su lugar, pero ¿cómo accedería a eso desde el front-end??

En el front-end, puede acceder a la página del Libro de visitas agregando la variable de cadena de consulta de ruta, por lo que la URL debe ser algo como http: //your-opencart-store-url/index.php? Route = guestbook / entry.

Entendamos cómo OpenCart asigna cualquier URL al archivo del controlador específico. El formato de la variable de ruta es directorio / nombre de archivo / nombre de método.

  • los directorio componente se asigna al directorio bajo catálogo / controlador.
  • los nombre del archivo se asigna al nombre del archivo controlador bajo catálogo / controlador / directorio.
  • Finalmente, buscará el método del controlador llamado nombre de método si está especificado en la ruta, de lo contrario llamará el valor predeterminado índice método.

Así es como se ve el resultado final.

Por supuesto, puede seguir adelante y probarlo enviando el formulario, y debe recibir una notificación por correo electrónico a la dirección de correo electrónico que está registrada como administrador de la tienda..

Conclusión

En cualquier marco, siempre es emocionante seguir adelante e implementar su propia funcionalidad personalizada. Ese fue exactamente el tema del tutorial de hoy, en el que ampliamos OpenCart y desarrollamos controladores personalizados mediante la creación de una funcionalidad bastante simple pero útil de Guestbook..

En el proceso, nos dimos cuenta de que no se trataba solo de los controladores, había algunos otros elementos clave que eran inevitables. Así que terminamos presentándolos también: Modelo, Idioma y Vista..

Al final, fue agradable ver el caso de uso de trabajo de lo que prometí al principio del artículo. Entonces, eso es todo por hoy, y no dude en dejar sus consultas y comentarios. Además, me encantaría saber de usted si hay algún tema en particular que quisiera que se me ocurriera en mi próximo artículo.!

Como siempre, si está buscando herramientas adicionales de OpenCart, utilidades, extensiones, etc. que pueda aprovechar en sus propios proyectos o para su propia educación, no olvide ver lo que tenemos disponible en el mercado..

Si has disfrutado de este artículo, tengo algunos más por si acaso te gustaría leerlos.!