Las notificaciones de script mejoradas en OpenCart 2.2.x.x

Hoy, vamos a discutir una de las mejores características de las notificaciones de script OpenCart. Aunque han estado disponibles desde el lanzamiento de la versión OpenCart 2.x, se han mejorado en el reciente lanzamiento de OpenCart 2.2.x.x. A lo largo del curso de este tutorial, discutiremos el concepto y lo demostraremos creando un módulo de trabajo.

Introducción

Como desarrollador, a menudo tendrá que alterar el flujo del comportamiento del marco central, ya sea para agregar una nueva característica al marco o para mejorar el flujo de trabajo existente. En cualquier caso, debe tener control sobre el flujo de trabajo para poder conectarse a la funcionalidad y lograr el comportamiento deseado.

Tratemos de entenderlo por un simple ejemplo. Si está ejecutando una tienda en línea popular, es probable que los productos más populares de su tienda se agoten pronto. En este caso, sería bueno recibir una notificación al respecto y tomar las medidas adecuadas en consecuencia..

Entonces, lo que podría hacer en el ejemplo mencionado anteriormente es buscar el método que se llama cuando se realiza el pedido. A continuación, puede conectarse al flujo de creación de orden para que pueda controlar cuándo se realiza el pedido. Eso le permite ejecutar un fragmento de código aleatorio en el contexto del evento llamado. Ahí es donde las notificaciones de eventos entran en escena, lo que nos permite ejecutar código arbitrario y modificar el resultado resultante.

¿Qué son las notificaciones de script??

Según la documentación oficial de OpenCart:

En la versión 2.2+, hemos agregado un nuevo sistema de eventos, estos son enlaces que se pueden llamar antes y después de eventos, como una llamada de método de controlador, una llamada de método de modelo o las plantillas que se cargan. Brindan la capacidad de manipular los parámetros del método de entrada y la salida devuelta.

Eso es realmente poderoso, ya que literalmente podría conectarse a cualquier método llamado y cambiar la salida devuelta por ese método. Sin embargo, debe tener cuidado durante la implementación de los ganchos, si está asumiendo la responsabilidad de modificar la salida resultante de la llamada. Esto se debe a que si su implementación devuelve algún valor, detendrá cualquier otra acción de evento que esté configurada para ser llamada.

¿Qué se necesita para implementar las notificaciones de script? Aquí están los pasos necesarios:

Registre su evento

Cuando está registrando su evento con OpenCart, le está diciendo a OpenCart que desea monitorear xyz acción, y si eso sucede, ejecute la acción foo en el archivo del controlador de barras. Mientras lo hace, tiene dos opciones para elegir: antes y después.

Si elige la opción anterior, OpenCart ejecutará la acción foo antes de la acción que se está monitoreando y, en el caso de la opción posterior, ejecutará foo después de la acción. En el caso de la opción anterior, es importante tener en cuenta que si el método foo devuelve algo, OpenCart no ejecutará el código del método original que se está supervisando en absoluto..

Más adelante en este artículo, veremos cómo registrar un evento durante la implementación del módulo personalizado.

Implementar la acción de destino

A continuación, deberá implementar el controlador y el método de acción correspondiente que se ha asociado con un evento en el primer paso. Ese es el lugar donde debe ir su código personalizado. OpenCart envía argumentos específicos del contexto a su método foo, para que pueda usarlo si es necesario.

Así que eso es solo un vistazo de lo que las notificaciones de script son capaces de hacer..

¿Todavía necesitamos OCMOD?

Si está familiarizado con vQmod o OCMOD, es probable que se arremele contra la función de notificaciones de eventos. Después de todo, podría lograr todo con los beneficios antes mencionados que de todos modos habría logrado con las notificaciones de eventos..

Para aquellos que no están familiarizados con vQmod o OCMOD, los artículos introductorios que explican a continuación son muy buenos..

  • El nuevo sistema de modificación en OpenCart 2
  • Alterar el núcleo de OpenCart usando vQmod

Entonces, la pregunta es, si pudieras usar vQmod o OCMOD para alterar los archivos principales, ¿por qué usarías las notificaciones de script? Es debido al hecho de que puede haber varios complementos de OCMOD que intentan alterar el mismo código, y eso podría generar conflictos. En el caso de eventos, no hay posibilidad de conflicto ya que cada evento se ejecuta en un orden específico.

Entonces, la conclusión es que si es posible usar eventos, adelante. Por otro lado, si cree que no hay ningún evento disponible para su caso de uso, está completamente bien con OCMOD.

Crear un módulo de back-end

En esta sección, vamos a construir un módulo que demuestra cómo usar las notificaciones de eventos en OpenCart. Supongo que está al tanto del proceso de desarrollo del módulo básico en OpenCart, ya que lo haremos a través de los conceptos básicos. Si no te das cuenta, aquí tienes un buen artículo que puedes revisar rápidamente..

Entendamos el caso de uso antes de seguir adelante e implementarlo. Supongamos que tiene una tienda que recupera la información del catálogo del back-end de API de terceros. Ha configurado un cron que regularmente obtiene la información y la inserta en la base de datos de OpenCart, para que pueda mostrarse en el front-end. Si bien ha configurado un cron que actualiza la información a intervalos regulares, debe asegurarse de que la información que se muestra en el front-end debe estar en tiempo real..

En el front-end, OpenCart llama al obtenerProducto Funciona cuando se muestra la página de detalles del producto. Entonces, ese es el candidato ideal para que usted pueda conectarse y actualizar la base de datos si la información de la API ha cambiado.

Así que vamos a empezar a crear los archivos de back-end primero.

Sigue adelante y crea el admin / controller / module / demoevent.php archivo con los siguientes contenidos.

carga-> modelo ('extensión / evento'); $ this-> model_extension_event-> addEvent ('event_product_info', 'catalog / model / catalog / product / getProduct / before', 'custom / product / info');  función pública uninstall () $ this-> load-> model ('extension / event'); $ this-> model_extension_event-> deleteEvent ('event_product_info'); 

Como comentamos anteriormente, lo primero que le gustaría hacer es el registro del evento. Es el gancho de instalación que usaremos para hacerlo, ya que se ejecutará cuando se instale el módulo..

Hemos utilizado el Añadir evento método del modelo de evento bajo el extensión directorio, y ese método tiene tres argumentos.

El primer argumento, event_product_info, Es el nombre del evento. Puedes nombrarlo como quieras, pero asegúrate de que sea único..

El segundo argumento es muy importante y señala el método al que te gustaría conectar. En nuestro caso, tenemos que elegir el obtenerProducto método de la Producto Modelo bajo el Catalogar directorio. Así que la jerarquía es modelo / catálogo / producto / getProducto. Además de eso, debe ser prefijado por cualquiera catalogar o administración, que representa la aplicación. En nuestro caso, es catalogar como estamos enganchando en el método de front-end. Finalmente, será reparado posteriormente por antes o después, lo que le dice a OpenCart que ejecute nuestro código en consecuencia.

El tercer argumento apunta a la acción de su controlador que se activará cuando se dispare el evento. Se establece en personalizado / producto / info, así que tendrás que crear un Producto controlador con el info método bajo el personalizado directorio, como lo haremos en un momento.

Finalmente, el método de desinstalación se utiliza para eliminar el evento durante la desinstalación del módulo..

A continuación, vamos a crear un archivo de idioma para nuestro módulo personalizado en admin / language / en-gb / module / demoevent.php con los siguientes contenidos.

Hemos terminado con la configuración del archivo de back-end. Ahora, debería poder ver nuestro módulo listado en Extensiones> Módulos en el back-end de OpenCart. Adelante e instálalo. Ahora, vamos a seguir adelante y crear los archivos en el front-end.

Crear un archivo modelo catalog / model / custom / product.php Con los siguientes contenidos. Es un archivo de modelo típico según la estructura OpenCart.

db-> query ("SELECT date_modified FROM". DB_PREFIX. "product WHERE product_id = '". (int) $ product_id. "'"); devuelve $ consulta-> fila;  function updateProductInfo ($ product_id, $ data) include_once __DIR __. '… /… /… /admin/model/catalog/product.php'; $ modelCatalogProduct = new ModelCatalogProduct (); $ modelCatalogProduct-> editProduct ($ product_id, $ data); 

Implementa dos métodos importantes. los getProductLastModifiedInfo Este método se utiliza para buscar la última fecha de modificación del producto y el updateProductInfo Este método se utiliza para actualizar la información del producto en la base de datos. En un momento, veremos cómo se utilizarán estos métodos..

Finalmente, vamos a crear uno de los archivos más importantes de este artículo., catalog / controller / custom / product.php, Con los siguientes contenidos. Es un archivo controlador que implementa el info método de acción que se establece para ser llamado cuando el obtenerProducto método de la Modelo del Producto se llama.

carga-> modelo ('personalizado / producto'); $ product_modified_date = $ this-> model_custom_product-> getProductLastModifiedInfo ($ product_id); if ($ product_modified_date ['date_modified']! = $ product_api_info ['date_modified']) // La información de la API ha cambiado, por lo que primero vamos a actualizar db // Nota: es probable que desee formatear $ product_api_info según el formato requerido por el método de edición de producto $ this-> model_custom_product-> updateProductInfo ($ product_id, $ product_api_info); // devuelve la última matriz de información de producto en tiempo real ('product_id' => $ product_api_info ['product_id'], 'name' => $ product_api_info ['name'], 'description' => $ product_api_info ['description' ], 'meta_título' => $ product_api_info ['meta_title'], 'meta_description' => $ product_api_info ['meta_description'], 'meta_keyword' => $ product_api_info ['meta_keyword'], 'tag' => $ product_api_info '' tag '],' model '=> $ product_api_info [' model '],' sku '=> $ product_api_info [' sku '],' upc '=> $ product_api_info [' upc '],' ean '=> $ product_api_info ['ean'], 'jan' => $ product_api_info ['jan'], 'isbn' => $ product_api_info ['isbn'], 'mpn' => $ product_api_info ['mpn'], 'location' => $ product_api_info ['location'], 'quantity' => $ product_api_info ['quantity'], 'stock_status' => $ product_api_info ['stock_status'], 'image' => $ product_api_info ['image'], 'manufacturer_id' => $ product_api_info ['manufacturer_id'], 'manufacturer' => $ product_api_info ['manufacturer'], 'price' => ($ product_api_info ['discount']? $ product_api_in fo ['discount']: $ product_api_info ['price']), 'special' => $ product_api_info ['special'], 'reward' => $ product_api_info ['reward'], 'points' => $ product_api_info [ 'puntos'], 'tax_class_id' => $ product_api_info ['tax_class_id'], 'date_available' => $ product_api_info ['date_available'], 'weight' => $ product_api_info ['weight'], 'weight_class_id' => $ product_api_info ['weight_class_id'], 'length' => $ product_api_info ['length'], 'width' => $ product_api_info ['width'], 'height' => $ product_api_info ['height'], 'length_class_id' = > $ product_api_info ['length_class_id'], 'resta' => $ product_api_info ['resta'], 'rating' => round ($ product_api_info ['rating']), 'reviews' => $ product_api_info ['reviews'] ? $ product_api_info ['reviews']: 0, 'minimum' => $ product_api_info ['minimum'], 'sort_order' => $ product_api_info ['sort_order'], 'status' => $ product_api_info ['status'], ' date_added '=> $ product_api_info [' date_added '],' date_modified '=> $ product_api_info [' date_modified '],' seen '=> $ product_api_info [' seen '); 

Lo importante a tener en cuenta aquí es que OpenCart proporciona argumentos específicos de contexto para su método. El primero $ ruta El argumento le indica la ruta asociada con el evento que se ha activado. En nuestro caso, debería ser catálogo / producto / getProducto. El segundo argumento es la identificación del producto, ya que es un argumento requerido por el real obtenerProducto método.

La lógica es algo como esto: compararemos la fecha de modificación del producto en la base de datos OpenCart con la información que devuelve la devolución de llamada de la API.

Entonces, el primer paso es cargar la información del producto en tiempo real desde la API. Tenga en cuenta que el api_call_to_fetch_product_info El método es solo un método ficticio que le gustaría reemplazar con su llamada API real.

A continuación, utilizamos el getProductLastModifiedInfo Método, que se creó en la sección anterior, para obtener la fecha modificada del producto de la base de datos OpenCart.

Finalmente, hacemos la comparación y, si la fecha es diferente, actualizará la base de datos OpenCart con la información más reciente del producto usando la updateProductInfo método en nuestra clase de modelo.

También hemos devuelto la información del producto en formato de matriz de la misma manera que la información real. obtenerProducto habría vuelto Es importante tener en cuenta que, como hemos proporcionado el valor de retorno en nuestro enlace, no se realizarán más llamadas a eventos, incluida la llamada al original. obtenerProducto método también.

Entonces, de esta manera, podría influir en el flujo de ejecución en OpenCart. Es una forma realmente poderosa de alterar la funcionalidad del núcleo. Sin embargo, debe tener cuidado al acercarse a esta solución, ya que le brinda control total para cambiar el resultado resultante de cualquier método..

Conclusión

Hoy, hemos discutido una de las características interesantes en OpenCart llamadas notificaciones de script. Comenzamos con una introducción al tema, y ​​fue la última parte del artículo la que demostró cómo usarlos mediante la creación de un módulo de eventos personalizado..

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..

Las consultas y comentarios son siempre bienvenidos.!