购物车页面上的“获取产品价值”属性,即使未分配给该特定产品Magento 2


8

我从报价中获取产品属性。似乎有错误的价值来了。请检查我下面的代码。

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

请检查下图以获得更好的理解。我的收藏或循环中有任何错误吗?

在此处输入图片说明

请帮我!!!


我在$ item_s = $ product_object-> load($ productId);之前使用了此未设置的函数。没运气!!我的代码有什么问题吗?我不知道为什么会这样!
阳光明媚的Rahevar,

您需要$objectManager->create('Magento\Catalog\Model\Product');在foreach循环中创建对象。检查我的答案
帕特尔王子(Pater Patel)

Answers:


3

因为您每次在foreach中都使用相同的对象。您需要在foreach循环中创建新对象。因此,您的最终代码如下所示:

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

注意:不要在代码中直接使用对象管理器。使用产品工厂是因为工厂每次都会创建新对象。


2

请尝试这样的事情

....

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

是的,我的做法与您提到的相同,对我有用!
Sunny Rahevar

1

我猜您必须创建一个新的产品对象,而不是在foreach循环中重用它。通过重用产品对象,即使方法“ load”表明每个数据都将被覆盖,您仍会得到此类副作用。检查中的自定义属性的用法AbstractExtensibleModel

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.