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

Sunny Rahevar
quelle
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.

Prinz Patel
quelle
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
Divyarajsinh Dodiya
quelle
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

HelgeB
quelle