Получение значения атрибута продукта на странице корзины, даже не назначенного этому конкретному продукту 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.