Obtenir la valeur de l'attribut de produit sur la page du panier même non attribué à ce produit particulier Magento 2


8

Je reçois l'attribut de produit du devis. Il semble qu'il y ait une mauvaise valeur. Veuillez vérifier mon code ci-dessous.

 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $cart = $objectManager->get('\Magento\Checkout\Model\Cart');
 $itemsCollection = $cart->getQuote()->getItemsCollection();
 $itemsVisible = $cart->getQuote()->getAllVisibleItems();
 $items = $cart->getQuote()->getAllItems();

 $product_object = $objectManager->create('Magento\Catalog\Model\Product');

 foreach($itemsVisible as $item){                
      if($option = $item->getOptionByCode('simple_product')) {
           $productId = $option->getProduct()->getId();
           $item_s = $product_object->load($productId);
           echo $screen_size =   $productId."/".$item_s->getScreenFrameSize()."/".$item_s->getFiberglassScreenRollSize()."/".$item_s->getScreenCornerSize()."<br>";
      }
 }

Veuillez vérifier l'image ci-dessous pour une meilleure compréhension. Y a-t-il une erreur dans ma collection ou boucle?

entrez la description de l'image ici

Aidez-moi, s'il vous plaît!!!


J'ai utilisé cette fonction non définie avant $ item_s = $ product_object-> load ($ productId) ;. Pas de chance!! Y a-t-il un problème dans mon code? je ne sais pas pourquoi cela se produit !!
Sunny Rahevar

Vous devez créer un objet $objectManager->create('Magento\Catalog\Model\Product');dans la boucle foreach. Vérifiez ma réponse
Prince Patel

Réponses:


3

Parce que vous utilisez le même objet à chaque fois dans foreach. Vous devez créer un nouvel objet dans la boucle foreach. Donc, votre code final ressemble à ceci:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cart = $objectManager->get('\Magento\Checkout\Model\Cart');
$itemsCollection = $cart->getQuote()->getItemsCollection();
$itemsVisible = $cart->getQuote()->getAllVisibleItems();
$items = $cart->getQuote()->getAllItems();

foreach($itemsVisible as $item){                
  if($option = $item->getOptionByCode('simple_product')) {
       $productId = $option->getProduct()->getId();
       $product_object = $objectManager->create('Magento\Catalog\Model\Product');
       $item_s = $product_object->load($productId);
       echo $screen_size =   $productId."/".$item_s->getScreenFrameSize()."/".$item_s->getFiberglassScreenRollSize()."/".$item_s->getScreenCornerSize()."<br>";
  }
}

REMARQUE: n'utilisez pas le gestionnaire d'objets directement dans le code. Utiliser l'usine du produit car l'usine créera à chaque fois un nouvel objet.


2

Veuillez essayer quelque chose comme ça

....

function productData($pro_id)
{   
       $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
       $product_object = $objectManager->create('Magento\Catalog\Model\Product');
       $item_s = $product_object->load($pro_id);
       return $item_s;
}

....

$item_s = productData($productId); //In foreach loop

Oui, je suis de la même manière que vous l'avez mentionné et cela fonctionne pour moi!
Sunny Rahevar

1

Je suppose que vous devez créer un nouvel objet produit au lieu de le réutiliser dans votre boucle foreach. En réutilisant l'objet produit, vous pouvez obtenir de tels effets secondaires même si la méthode "charger" suggère que toutes les données seraient écrasées. Vérifiez l'utilisation des attributs personnalisés dansAbstractExtensibleModel

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.