Mois : février 2023

[Magento 2] Gestion des événements et du passage de l’objet This dans les widgets jQuery UI avec les méthodes proxy ou bind

Ce post sur stack overflow qui explique très bien le problème et donne des solutions: How to handle events in jQuery UI widgets.

Cet autre post sur stack overflow qui explique comment solutionner le problème à l’aide de la méthode .bind(): Pass correct « this » context to setTimeout callback?.

Exemple de widget complet

$(document).on('click', <DOM element>, <JS function>.bind(this)); et setTimeout(function () { ... }.bind(this), 250);

L’objet this passé dans l’événement .on('click', ...) par l’intermédiaire de la méthode .bind() est bien celui du widget et pas la cible du click (récupérable au besoin dans la fonction _handleNewOptionSelection via un e.target.

Autres manières d’utiliser des événements:

ATTENTION: dans l’exemple ci-dessus, la présence du paramètre true dans this.element.on('focus', this.setActiveState.bind(this, true)); peut dans certains cas faire que la fonction cible ne soit pas exécutée!
A ce moment, essayer ceci:

Cas d’utilisation de .bind() avec setInterval():

Cas avec l’utilisation de matchMedia/mediaCheck

Notez la présence de .bind(this) après chaque fonction (entry, exit).

Utiliser la méthode .bindAll de Underscore

La méthode dans le code source du framework Underscore (version 1.8.2):

Dans les faits:

[Magento 2] Récupérer des informations via un Block PHP plutôt qu’en passant par l’invocation de l’Object Manager dans un template PHTML

L’invocation de l’Object Manager dans un template PHTML pour de la récupération d’informations est une mauvaise pratique dans Magento 2. Pourtant, sur le web, bon nombre de solutions données à nos problèmes partent de ce principe…

Dans mon exemple, je souhaitais récupérer depuis une page produit des informations sur les attributs produit associées (leurs attribute_code à proprement parler). Le template PHTML et le Block PHP desquels je suis parti sont détaillés dans le billet [Magento 2] Etendre un Block pour en hériter et lui ajouter de nouvelles fonctionnalités.

Avec l’Object Manager dans le template PHTML (mauvaise pratique dans Magento 2)

J’ai d’abord procédé comme suggéré ici (How to Get Product Options in Magento 2) en invoquant l’object manager directement dans le template PHTML (mauvaise pratique).

Et ça fonctionne: la variable $attributeCodeArr me remonte bien un tableau avec plusieurs attribute_code.

Même chose via un Block PHP (bonne pratique dans Magento 2)

Dans le Block app/code/MyVendor/KlarnaOnsitemessaging/Block/Product.php:

Dans le template PHTML:

De la même manière, la variable $attributeCodeArr me remonte bien un tableau avec plusieurs attribute_code.

[Magento 2] Etendre un Block pour en hériter et lui ajouter de nouvelles fonctionnalités

Note: dans un but d’anonymisation, le véritable libellé du vendor a été remplacé par MyVendor.

Ressource en ligne: Créer un bloc sous magento 2.

Les fichiers obligatoires pour la création d’un nouveau module dans Magento 2 (ou Adobe Commerce)

app/code/MyVendor/KlarnaOnsitemessaging/registration.php

app/code/MyVendor/KlarnaOnsitemessaging/etc/module.xml

app/code/MyVendor/KlarnaOnsitemessaging/etc/di.xml

Etendre un Block dans Magento 2

Le Block (fichier) initial

vendor/klarna/module-onsitemessaging/Block/Product.php

Le Block étendu

app/code/MyVendor/KlarnaOnsitemessaging/Block/Product.php

Raison de l’extension: dans la fiche produit, nous avons besoin de cacher la bannière Klarna pour les produits > 10 000 euros ainsi que les produits not salable ou qui ont un stock = 0.

Nous allons pour ce faire créer une fonction publique getProduct() qui va nous permettre de récupérer tout un tas d’informations sur le produit affiché et notamment celles que nous allons exploiter dans la fonction publique conditionalShowOnProduct() qui teste que toutes les conditions sont remplies pour afficher la bannière.

app/code/MyVendor/KlarnaOnsitemessaging/etc/config.xml

Dans la class Product que nous venons d’étendre (cf. extension de /Block/Product.php), nous utilisons une config const CHECKOUT_PRICES_ABOVE = 'checkout/prices_above'; que nous définissons dans ce fichier (plutôt qu’en dur).

app/design/frontend/MyTheme/default/Klarna_Onsitemessaging/templates/html/placement/product.phtml

On interroge la fonction conditionalShowOnProduct() présente dans notre Block étendu pour afficher ou non la bannière Klarna.

[Magento 2] matchMedia mediaCheck boucler dans un tableau de media-queries avec la méthode jQuery each()

Ressource: How to loop through array in jQuery?. très bien expliqué avec des exemples spécifiques pour du javasqcript vanilla (ES5, ES6, …) et l’utilisation avec this.

Dans mon exemple, je cherche simplement à ré-initialiser un carousel Slick Slider dès qu’un nouveau breakpoint est rencontré. Il est important de comprendre que c’est le même code qui est exécuté à chaque fois.

Si vous souhaitez utiliser des paramètres différents en fonction de vos vues (Mobile, Tablet, Desktop) avec Slick Slider, il faut utiliser l’option responsive.

…revient à déclarer ceci: