Abrufen des Werts des Produktattributs auf der Warenkorbseite, auch wenn es nicht diesem bestimmten Produkt zugeordnet ist Magento 2


8

Ich erhalte das Produktattribut aus dem Angebot. Es scheint, dass es einen falschen Wert gibt. Bitte überprüfen Sie meinen unten stehenden Code.

 $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>";
      }
 }

Bitte überprüfen Sie das Bild unten zum besseren Verständnis. Gibt es einen Fehler in meiner Sammlung oder Schleife?

Geben Sie hier die Bildbeschreibung ein

Bitte hilf mir!!!


Ich habe diese nicht gesetzte Funktion verwendet, bevor $ item_s = $ product_object-> load ($ productId);. Kein Glück!! Gibt es ein Problem in meinem Code? Ich weiß nicht, warum das passiert !!
Sunny Rahevar

Sie müssen ein Objekt $objectManager->create('Magento\Catalog\Model\Product');in einer foreach-Schleife erstellen . Überprüfen Sie meine Antwort
Prinz Patel

Antworten:


3

Weil Sie jedes Mal dasselbe Objekt in foreach verwenden. Sie müssen ein neues Objekt in jeder Schleife erstellen. Ihr endgültiger Code sieht also folgendermaßen aus:

$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>";
  }
}

HINWEIS: Verwenden Sie den Objektmanager nicht direkt im Code. Verwenden Sie die Produktfabrik, da die Fabrik jedes Mal ein neues Objekt erstellt.


2

Bitte versuchen Sie so etwas

....

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

Ja, ich habe den gleichen Weg wie Sie erwähnt und es funktioniert für mich!
Sunny Rahevar

1

Ich denke, Sie müssen ein neues Produktobjekt erstellen, anstatt es in Ihrer foreach-Schleife wiederzuverwenden. Durch die Wiederverwendung des Produktobjekts können solche Nebenwirkungen auftreten, selbst wenn die Methode "Laden" vorschlägt, dass alle Daten überschrieben werden. Überprüfen Sie die Verwendung von benutzerdefinierten Attributen inAbstractExtensibleModel

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.