Notifications de script améliorées dans OpenCart 2.2.x.x

Aujourd'hui, nous allons discuter de l'une des fonctionnalités les plus intéressantes des notifications OpenCart-script. Bien qu'ils soient disponibles depuis la publication de la version OpenCart 2.x, ils ont été améliorés dans la version récente d'OpenCart 2.2.x.x. Tout au long de ce tutoriel, nous allons discuter du concept et le démontrer en créant un module de travail..

introduction

En tant que développeur, vous devrez souvent modifier le flux du comportement de la structure principale, que ce soit pour ajouter une nouvelle fonctionnalité à la structure ou pour améliorer le flux de travail existant. Dans les deux cas, vous devez avoir le contrôle du flux de travail pour pouvoir vous connecter à la fonctionnalité et obtenir le comportement souhaité..

Essayons de le comprendre par un exemple simple. Si vous exploitez un magasin en ligne populaire, il est probable que les produits les plus populaires de votre magasin seront bientôt épuisés. Dans ce cas, il serait bon de recevoir une notification à ce sujet et de prendre les mesures appropriées en conséquence..

Ainsi, dans l'exemple ci-dessus, vous pouvez rechercher la méthode appelée lors du passage de la commande. Ensuite, vous pouvez vous connecter au flux de création de commande afin de pouvoir contrôler le moment où la commande est passée. Cela vous permet d'exécuter un morceau de code aléatoire dans le contexte de l'événement appelé. C'est là que les notifications d'événements entrent en scène, nous permettant d'exécuter du code arbitraire et de modifier le résultat obtenu..

Que sont les notifications de script??

Selon la documentation officielle OpenCart:

Dans la version 2.2+, nous avons ajouté un nouveau système d'événements. Il s'agit de points d'ancrage pouvant être appelés avant et après des événements, tels qu'un appel de méthode de contrôleur, un appel de méthode de modèle ou des modèles en cours de chargement. Ils donnent la possibilité de manipuler les paramètres de la méthode d'entrée et retournent la sortie.

C'est vraiment puissant, car vous pouvez littéralement vous connecter à n'importe quel appel de méthode et changer la sortie renvoyée par cette méthode. Cependant, vous devez être prudent lors de la mise en œuvre des points d'ancrage, si vous prenez la responsabilité de modifier le résultat résultant de l'appel. En effet, si votre implémentation renvoie une valeur, elle arrêtera toute autre action d'événement appelée à être appelée..

Que faut-il pour implémenter les notifications de script? Voici les étapes nécessaires:

Inscrivez votre événement

Lorsque vous enregistrez votre événement avec OpenCart, vous indiquez à OpenCart que vous souhaitez surveiller xyz action, et si cela se produit, exécutez l’action foo dans le fichier du contrôleur de barres. Ce faisant, vous avez le choix entre deux options: avant et après.

Si vous choisissez l'option avant, OpenCart exécutera l'action foo avant l'action surveillée et, dans le cas de l'option after, il s'exécutera après l'action. Dans le cas de l'option before, il est important de noter que si la méthode foo renvoie quoi que ce soit, OpenCart n'exécutera pas le code de la méthode d'origine qui est surveillé du tout..

Nous verrons plus loin dans cet article comment enregistrer un événement lors de la mise en œuvre du module personnalisé..

Mettre en œuvre l'action cible

Ensuite, vous devez implémenter le contrôleur et la méthode d'action correspondante associée à un événement lors de la première étape. C'est à cet endroit que votre code personnalisé doit être inséré. OpenCart envoie des arguments contextuels à votre méthode foo, afin que vous puissiez les utiliser si nécessaire..

Voilà donc un aperçu de ce que les notifications de script sont capables de.

Avons-nous encore besoin d'OCMOD?

Si vous connaissez vQmod ou OCMOD, il est fort probable que vous vous releviez face à la fonctionnalité de notification d'événement. Après tout, vous pouvez tout obtenir grâce aux avantages mentionnés ci-dessus que vous auriez quand même accompli avec les notifications d'événement.

Pour ceux qui ne connaissent ni vQmod ni OCMOD, voici de bons articles d'introduction qui l'expliquent..

  • Le nouveau système de modification dans OpenCart 2
  • Modification du cœur d'OpenCart à l'aide de vQmod

La question est donc: si vous pouviez utiliser vQmod ou OCMOD pour modifier les fichiers principaux, pourquoi utiliseriez-vous les notifications de script? Cela est dû au fait que plusieurs plug-ins OCMOD peuvent essayer de modifier le même code, ce qui peut entraîner un conflit. Dans le cas d'événements, il n'y a aucune chance de conflit car chaque événement est exécuté dans un ordre spécifique.

Donc, la conclusion est que s'il est possible d'utiliser des événements, allez-y. D'un autre côté, si vous estimez qu'il n'y a pas d'événement disponible pour votre cas d'utilisation, vous pouvez utiliser OCMOD..

Créer un module de back-end

Dans cette section, nous allons construire un module qui montre comment utiliser les notifications d'événement dans OpenCart. Je suppose que vous êtes au courant du processus de développement de modules de base dans OpenCart, car nous allons parcourir les bases. Si vous n'êtes pas au courant, voici un bel article que vous pouvez lire rapidement.

Comprenons le cas d'utilisation avant d'aller de l'avant et de le mettre en œuvre. Supposons que vous ayez un magasin qui récupère les informations de catalogue à partir du back-end de l'API tierce. Vous avez configuré un cron qui récupère régulièrement les informations et les insère dans la base de données OpenCart, de manière à pouvoir les afficher au niveau du serveur frontal. Bien que vous ayez configuré un cron qui mette à jour les informations à intervalles réguliers, vous voulez vous assurer que les informations affichées dans l'interface frontale sont en temps réel..

Dans le front-end, OpenCart appelle le getProduct fonctionne lorsqu'il affiche la page de détail du produit. C'est donc le candidat idéal pour vous connecter et mettre à jour la base de données si les informations de l'API ont changé.

Commençons donc par créer les fichiers back-end.

Allez-y et créez le admin / controller / module / demoevent.php fichier avec le contenu suivant.

load-> model ('extension / event'); $ this-> model_extension_event-> addEvent ('event_product_info', 'catalogue / modèle / catalogue / produit / getProduct / avant', 'custom / product / info');  fonction publique uninstall () $ this-> load-> model ('extension / event'); $ this-> model_extension_event-> deleteEvent ('event_product_info'); 

Comme nous en avons discuté plus tôt, la première chose que vous voudriez faire est l’inscription de l’événement. C'est le crochet d'installation que nous utiliserons pour le faire, car il sera exécuté lors de l'installation du module.

Nous avons utilisé le ajouter un évènement méthode du modèle d'événement sous la extension répertoire, et cette méthode a trois arguments.

Le premier argument, événement_produit_événement, est le nom de l'événement. Vous pouvez nommer n'importe quoi, mais assurez-vous qu'il est unique.

Le deuxième argument est très important et indique la méthode à laquelle vous souhaitez vous accrocher. Dans notre cas, nous devons choisir le getProduct méthode du Produit Modèle sous la Catalogue annuaire. Donc, la hiérarchie est modèle / catalogue / produit / getProduct. En plus de cela, il devrait être préfixé par catalogue ou admin, qui représente l'application. Dans notre cas, c'est catalogue comme nous accrochons dans la méthode front-end. Enfin, il sera post-fixé par avant ou après, ce qui indique à OpenCart d'exécuter notre code en conséquence..

Le troisième argument pointe vers le action de votre contrôleur qui sera déclenché lorsque l'événement est déclenché. Il est réglé pour personnalisé / produit / info, donc vous devrez créer un Produit contrôleur avec le Info méthode sous la Douane répertoire, comme nous le ferons dans un instant.

Enfin, la méthode de désinstallation est utilisée pour supprimer l’événement lors de la désinstallation du module..

Ensuite, créons un fichier de langue pour notre module personnalisé à admin / language / fr-gb / module / demoevent.php avec le contenu suivant.

Nous avons terminé la configuration du fichier back-end. Maintenant, vous devriez pouvoir voir notre module énuméré sous Extensions> Modules dans le back-end de OpenCart. Allez-y et installez-le. Maintenant, nous allons aller de l'avant et créer les fichiers dans le front-end.

Créer un fichier de modèle catalogue / modèle / personnalisé / produit.php avec le contenu suivant. C'est un fichier de modèle typique selon la structure OpenCart.

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

Il met en œuvre deux méthodes importantes. le getProductLastModifiedInfo méthode est utilisée pour récupérer la dernière date de modification du produit, et le updateProductInfo Cette méthode est utilisée pour mettre à jour les informations sur le produit dans la base de données. Dans un instant, nous verrons comment ces méthodes seront utilisées.

Enfin, créons l'un des fichiers les plus importants de cet article, catalogue / contrôleur / personnalisé / product.php, avec le contenu suivant. C'est un fichier contrôleur qui implémente le Info méthode d'action qui est définie pour être appelée lorsque le getProduct méthode du modèle du produit est appelé.

load-> model ('custom / product'); $ product_modified_date = $ this-> model_custom_product-> getProductLastModifiedInfo ($ product_id); if ($ product_modified_date ['date_modified']!! = $ product_api_info ['date_modified']) // les informations api ont été modifiées. Commençons par mettre à jour la base de données // Remarque: vous voudrez probablement formater $ product_api_info selon le format requis par la méthode editProduct $ this-> model_custom_product-> updateProductInfo ($ product_id, $ product_api_info); // retourne le tableau de retour des informations produit les plus récentes / en temps réel ('product_id' => $ product_api_info ['product_id'], 'name' => $ product_api_info ['name'], 'description' => $ product_api_info ['description' ], 'meta_title' => $ 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'], 'quantité' => $ product_api_info ['quantité'], 'stock_status' => $ product_api_info ['stock_status'], 'image' => $ product_api_info ['image'], 'fabricant_id' => $ product_api_info ['constructeur_id'], 'fabricant' => $ product_api_info ['fabricant'], 'price' => ($ product_api_info ['discount']?? $ product_api_in fo ['discount']: $ product_api_info ['price']), 'special' => $ product_api_info ['special'], 'récompense' => $ product_api_info ['récompense'], 'points' => $ product_api_info [ 'points'], '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'], 'soustract' => $ product_api_info ['subtract'], 'rating' => rond ($ 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 '],' consulté '=> $ product_api_info [' consulté ']); 

La chose importante à noter ici est qu'OpenCart fournit des arguments spécifiques au contexte de votre méthode. La première $ route argument vous indique la route associée à l'événement qui a été déclenché. Dans notre cas, il devrait être catalogue / produit / getProduct. Le deuxième argument est l’identifiant du produit car c’est un argument requis par le getProduct méthode.

La logique ressemble à ceci: nous comparerons la date de modification du produit dans la base de données OpenCart avec les informations renvoyées par le rappel de l'API..

La première étape consiste donc à charger les informations de produit en temps réel à partir de l'API. Veuillez noter que le api_call_to_fetch_product_info méthode est juste une méthode factice que vous souhaitez remplacer par votre appel API actuel.

Ensuite, nous utilisons le getProductLastModifiedInfo méthode, créée dans la section précédente, pour extraire la date de modification du produit à partir de la base de données OpenCart.

Enfin, nous faisons la comparaison, et si la date est différente, la base de données OpenCart sera mise à jour avec les informations les plus récentes sur le produit à l’aide du bouton updateProductInfo méthode dans notre classe Model.

Nous avons également renvoyé les informations sur le produit au format tableau de la même manière que le getProduct serait retourné. Il est important de noter que, comme nous avons fourni la valeur de retour dans notre hook, il n'appellera aucun autre appel d'événement, y compris l'appel de l'original. getProduct méthode aussi bien.

Ainsi, de cette manière, vous pourriez influencer le déroulement de l’exécution dans OpenCart. C'est un moyen très puissant pour modifier les fonctionnalités principales. Cependant, vous devez être prudent lorsque vous approchez de cette solution car elle vous donne le contrôle total pour modifier le résultat résultant de toute méthode..

Conclusion

Aujourd'hui, nous avons discuté d'une des fonctionnalités intéressantes d'OpenCart appelée notifications de script. Nous avons commencé par une introduction au sujet, et c’est la dernière moitié de l’article qui a montré comment les utiliser en construisant un module d’événement personnalisé..

Comme toujours, si vous recherchez des outils, utilitaires, extensions, etc., OpenCart supplémentaires que vous pouvez exploiter dans vos propres projets ou pour votre propre éducation, n'oubliez pas de voir ce que nous avons sur le marché..

Les requêtes et les commentaires sont toujours les bienvenus!