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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace Pdv\Catalog\Helper; /** * Catalog data helper * */ class Data extends \Magento\Framework\App\Helper\AbstractHelper { ... } |
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.
1 2 3 4 |
/** * @var \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable */ protected $typeConfigurableResourceModel; |
La fonction getParentIdsByChild()
qui nous intéresse dans le Model que nous allons étendre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * Retrieve parent ids array by required child * * @param int|array $childId * @return string[] */ public function getParentIdsByChild($childId) { $select = $this->getConnection() ->select() ->from(['l' => $this->getMainTable()], []) ->join( ['e' => $this->getTable('catalog_product_entity')], 'e.' . $this->optionProvider->getProductEntityLinkField() . ' = l.parent_id', ['e.entity_id'] )->where('l.product_id IN(?)', $childId); $parentIds = $this->getConnection()->fetchCol($select); return $parentIds; } |
Demande à Magento une instance de mon configurable ressource model…
1 2 3 4 5 |
public function __construct( \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $typeConfigurableResourceModel ) { ... } |
…et mappe le paramètre du constructeur avec la propriété de la classe.
1 2 3 4 5 |
public function __construct( ... ) { $this->typeConfigurableResourceModel = $typeConfigurableResourceModel; } |
Donne accès à une nouvelle méthode getConfigurableParentIdsByChildId()
dans le template PHTML:
1 2 3 4 5 6 7 8 |
/** * @param $childId * @return string[] */ public function getConfigurableParentIdsByChildId($childId) { return $this->typeConfigurableResourceModel->getParentIdsByChild($childId); } |
Notre Helper app/code/Pdv/Catalog/Helper/Data.php
finalisé:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php namespace Pdv\Catalog\Helper; /** * Catalog data helper * */ class Data extends \Magento\Framework\App\Helper\AbstractHelper { /** * @var \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable */ protected $typeConfigurableResourceModel; // 1. Du nom du model dont je veux injecter la propriété de la classe public function __construct( \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $typeConfigurableResourceModel // 2. Demande à Magento une instance de mon configurable ressource model ) { $this->typeConfigurableResourceModel = $typeConfigurableResourceModel; // 3. ...et mappe le paramètre du constructeur avec la propriété de la classe } /** * @param $childId * @return string[] */ public function getConfigurableParentIdsByChildId($childId) { // 4. Je donne accès à ma nouvelle méthode dans le PHTML return $this->typeConfigurableResourceModel->getParentIdsByChild($childId); } } |
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:
1 2 3 4 |
<?php /** @var \Pdv\Catalog\Helper\Data $helper */ $helper = $this->helper('Pdv\Catalog\Helper\Data'); ?> |
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
1 2 3 |
<?php $parentProductId = implode("|", $helper->getConfigurableParentIdsByChildId($_product->getId())); ?> |
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
1 |
<div class="pricing-plan" data-configurable="<?= $parentProductId ?>">...</div> |
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:
- Probablement la ressource la plus utile: Magento 2: Get Associated Simple Products from Configurable Product – En utilisant l’injection de dépendances ou Object Manager.
- How to get parent product id in magento 2? – Bout de code hyper crade à placer dans le PHTML de votre liste produit; ça marche, mais bon …
- How to Get Parent Product ID in Magento 2 – Propose de passer par un Helper; je n’ai pas réussi à exploiter le code fourni…
- How to Get Parent Product Ids in Magento 2 – Magento 2.3 – pour un produit de type Bundle ou Grouped (l’article n’évoque pas le produit Configurable).