Étiquette : injection de dépendances

[Magento 2] Récupérer les Simple Products associés à un Configurable Product

Création d’un Helper pas-à-pas

Nous allons créer un fichier app/code/Pdv/Catalog/Helper/Data.php.

Si le fichier en question existe déjà, vous pouvez sauter cette étape. Si le Module <Vendor>_Catalog n’existe pas, il faudra le créer au préalable. Le code pour encapsuler notre Helper est le suivant:

Du Namespace du Model dont je veux injecter la propriété de la classe:

Du Namespace du Model (fichier: vendor/magento/module-configurable-product/Model/ResourceModel/Product/Type/Configurable.php namespace: namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Type;) dont je veux injecter la propriété de la classe.

La fonction getParentIdsByChild() qui nous intéresse dans le Model que nous allons étendre:

Demande à Magento une instance de mon configurable ressource model…

…et mappe le paramètre du constructeur avec la propriété de la classe.

Donne accès à une nouvelle méthode getConfigurableParentIdsByChildId() dans le template PHTML:

Notre Helper app/code/Pdv/Catalog/Helper/Data.php finalisé:

Exploiter notre nouveau Helper dans un template PHTML

Déclarer notre Helper dans notre template PHTML

Créer (ou ajouter dans) un bloc de code PHP assez haut dans votre fichier PHTML et collez-y ceci:

Le chemin Pdv\Catalog\Helper\Data correspond ici au namespace déclaré dans le fichier Helper app/code/Pdv/Catalog/Helper/Data.php + au nom du ficher sans son extension *.php.

A l’endroit dans votre template PHTML où vous souhaitez récupérer l’ID du produit parent (le produit configurable duquel découlent tous les produits simples/toutes les variations), créez une variable $parentProductId

L’utilisation d'implode est obligatoire ici, même si nous allons récupérer une string plutôt qu’un array. C’est une bizarrerie de Magento 2.

Afficher la valeur de $parentProductId dans votre code HTML


Article en cours de rédaction… Je ne suis pas encore parvenu à faire quelque chose de propre à défaut de faire quelque chose qui fonctionne.

Sources:

[Magento 2] Initiation à l’injection de dépendances en créant un widget custom qui permet l’upload d’une image et l’ajout d’un lien vers une page CMS

Note: pour mettre en place l’upload d’image, nous allons installer l’extension magento2-widget-parameters. Je vous invite à consulter le billet de blog suivant pour la démarche à suivre: [Magento 2] Ajouter un sélecteur d’image ou un champ WYSIWYG dans un widget custom.

Convention: on part du principe qu’on crée un widget pour le vendor Sodifrance et le module Pdv.

Une fois l’extension magento2-widget-parameters installée, nous allons créer les fichiers suivants:

app/code/Sodifrance/Pdv/etc/widget.xml

Le champ « Clé d’URL de la page de destination » est en required="false" car l’utilisateur n’est pas obligé d’associer un lien pointant vers une autre page à ce widget. Nous verrons avec le code de la vue PHTML comment nous gérons ça en PHP par le biais d’une condition if/else.

app/code/Sodifrance/Pdv/Block/Widget/TwoColsDynamic.php

Ici, on crée 2 fonctions publiques:

  • getWidgetMediaUrl() qui récupère l’URL de base du site, lui ajoute le chemin vers l’endroit où reposent les médias de contenu éditorial dans Magento 2 et le libellé et le format de l’image uploadée via le widget en BO.
  • getWidgetTargetPageUrl() qui récupère l’URL de base du site et lui ajoute la clé d’URL de la page cible, telle que renseignée via le widget en BO.

Note: dans l’IDE PHP Storm, il est possible de ne taper que les lignes suivantes:

Ensuite, placez le curseur sous ces lignes et faites le raccourci Alt + Inser. Vous aurez accès à une liste de bouts de code que l’IDE se propose d’écrire pour vous! Si vous choisissez « constructor » et que vous sélectionnez ensuite les 2 entrées $helper et $urlInterface (placez le curseur sur la première, puis Maj + flèche du bas), le constructeur sera généré automatiquement.

app/code/Sodifrance/Pdv/view/frontend/templates/widget/twocolsdynamic.phtml

Dans le template PHTML, on ajoute une condition <?php if (!empty($block->getData('block_link'))): ?> qui vérifie si le champ URL est rempli en BO et génère du HTML en fonction.

Flushez vos caches; le widget devrait être disponible en backoffice!