Obtenir l'attribut de produit dans le panier dans Magento2


21

J'essaie de récupérer un attribut de produit dans le modèle de panier. Mais je ne fonctionne tout simplement pas! L'attribut est défini sur Visible sur les pages de catalogue sur la vitrine = oui et utilisé dans la liste des produits = oui

J'utilise un module personnalisé pour remplacer le modèle suivant:

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

J'ai le produit:

$_item = $block->getItem();
$product = $_item->getProduct();

Normalement, je m'attendrais à ce qu'un attribut personnalisé (de type zone de texte dans ce cas) avec un code d'attribut 'sample_attr' soit disponible avec l'un d'eux:

$product->getData('sample_attr');

ou

$product->getSampleAttr();

Certains attributs sont disponibles en utilisant ceci (sku, poids, prix ..), mais pour un attribut personnalisé, cela ne fonctionne pas. L'assistant inclus (\ Magento \ Msrp \ Helper \ Data) n'a également aucune méthode d'attribut.

Je peux obtenir tous les codes d'attribut en utilisant:

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

J'ai aussi essayé:

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

mais cela renvoie null.

Alors, comment puis-je obtenir la valeur de l'attribut?

J'ai essayé ceux-ci: obtenir un attribut spécifique pour chaque produit sur la page du catalogue

Attribut de texte personnalisé en sortie dans le catalogue list.phtml (Magento 2)

Réponses:


51

Il n'est pas nécessaire de modifier le code PHP pour ce faire.

Vous avez juste besoin de créer {MODULE_NAME}/etc/catalog_attributes.xmlavec un tel contenu:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>

Intéressant. Je n'y avais pas pensé. Je vais essayer ça plus tard.
tecjam

Vous êtes les bienvenus :)
Igor Sydorenko

2
Fantastique! Travaille pour moi. Il semblait que je devais courir magento setup:di:compilepour que cela fonctionne, mais cela a du sens. Vous modifiez ici l'arborescence des dépendances.
psyklopz

Cela devrait être la réponse acceptée à mon humble avis. Les autres réponses suggèrent de charger le modèle de produit pour chaque article du panier, ce qui n'est pas une bonne idée pour des raisons de performances, en particulier lorsque les chariots des utilisateurs sont volumineux.
Andrew Kett

j'ai créé un module tenx / checkoutex sous etc j'ai placé au-dessus du code mais ça ne fonctionne pas, pouvez-vous m'aider
Sarvesh Tiwari

8

J'ai donc trouvé un moyen d'obtenir les informations que je recherchais. Je dois charger le produit complet depuis ProductRepository! Notez que si vous essayez de le charger, \Magento\Catalog\Model\Productil se comportera comme un singleton, vous donnant toujours le même produit pour chaque boucle.

J'ai utilisé ma classe d'assistance de modules car elle définit la méthode suivante pour charger le produit à partir de productId:

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

J'ai inclus l'aide dans le modèle:

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

Je charge le produit complet:

$custProd = $customHelper->getProductById($product->getId());

Et maintenant je peux utiliser:

$custProd->getSampleAttr();

et

$custProd->getData('sample_attr');

pour obtenir les données.


2

Pour ceux qui ont atterri ici à la recherche d'une solution simple, c'est comme ça que ça a fonctionné pour moi

J'ai ajouté à mon default.phtml(en module-checkout/view/frontend/templates/cart/item) ceci:

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

alors vous pouvez appeler $customProduct->getData('your_attribute');comme toujours


2
Dans le modèle, Magento nous décourage d'utiliser directement ObjectManager. Nous devons ajouter dans le bloc.
Khoa TruongDinh

2
Vous ne devez pas utiliser directement l'ObjectManager ni dans le modèle, ni dans le bloc.
ocornu

Si vous ne vous souciez simplement pas de savoir comment, cela fonctionne à 100%.
A. Lal

1

Avec des paramètres d'administration corrects, les attributs personnalisés sont chargés dans l'objet produit dans la page Checkout si le modèle source dans la eav_attributetable sql est défini sur NULL. Vous pouvez donc accéder directement à $product->getSampleAttr()sur la page de paiement.

Mais si l'attribut a un modèle source en tant que Magento\Eav\Model\Entity\Attribute\Source\Table, vous devez charger le produit à partir du référentiel.

Créer un nouvel assistant et ajouter le référentiel de produits dans le constructeur fonctionne toujours sur 2.2.6 (comme solution de tecjam)

Veuillez noter que le problème est le même si vous essayez de remplacer le rendu d'élément (appelé dans la page de paiement) et d'ajouter le référentiel de produit ici.

entrez la description de l'image ici


0

Les attributs personnalisés ne sont pas inclus dans l'objet produit trouvé dans Quote / Cart, donc vous ne pouvez pas l'obtenir via la fonction getData ('custom_attribute'). ce que vous devez faire est d'obtenir l'ID du produit retourné à partir de l'objet produit Quote et de charger le produit à l'aide du référentiel de produit, une fois que vous avez chargé le produit via le référentiel, vous pouvez obtenir toutes les données, y compris les attributs personnalisés qui lui sont attribués, plus tard, vous pouvez utiliser la fonction getData ('custom_attribute') pour l'obtenir.

J'espère que cela a du sens.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.