Получение значения атрибута продукта на странице корзины, даже не назначенного этому конкретному продукту 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) ;. Не повезло!! Есть ли проблема в моем коде? я не знаю почему это происходит !!
Солнечный Рахевар
Вам нужно создать объект $objectManager->create('Magento\Catalog\Model\Product');в цикле foreach. Проверь мой ответ
Принц Патель

Ответы:

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
Дивьярайсинь Додия
источник
Да, я следую так же, как вы упомянули, и это работает для меня!
Солнечный Рахевар
1

Я думаю, вам нужно создать новый объект продукта, а не использовать его в цикле foreach. Повторно используя объект продукта, вы можете получить такие побочные эффекты, даже если метод «load» предполагает, что все данные будут перезаписаны. Проверьте использование пользовательских атрибутов вAbstractExtensibleModel

HelgeB
источник