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!!!

Sunny Rahevar
la source
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.

Prince Patel
la source
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
Divyarajsinh Dodiya
la source
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

HelgeB
la source