Obtendo o valor do atributo do produto na página do carrinho, mesmo não atribuído a esse produto específico Magento 2

8

Estou recebendo o atributo do produto da cotação. Parece que existe um valor errado. Por favor, verifique meu código abaixo.

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

Verifique a imagem abaixo para uma melhor compreensão. Existe algum erro na minha coleção ou loop?

insira a descrição da imagem aqui

Por favor me ajude!!!

Sunny Rahevar
fonte
Eu uso essa função não definida antes de $ item_s = $ product_object-> load ($ productId) ;. Sem sorte !! Existe algum problema no meu código? Eu não sei por que isso está acontecendo!
Sunny Rahevar 30/01/19
Você precisa criar um objeto $objectManager->create('Magento\Catalog\Model\Product');no loop foreach. Veja minha resposta
Prince Patel

Respostas:

3

Porque você sempre usa o mesmo objeto no foreach. Você precisa criar um novo objeto no loop foreach. Então, seu código final fica assim:

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

NOTA: Não use o gerenciador de objetos diretamente no código. Use a fábrica do produto porque a fábrica criará um novo objeto toda vez.

Prince Patel
fonte
2

Tente algo como isto

....

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
fonte
Sim, segui da mesma maneira que você mencionou e funciona para mim!
Sunny Rahevar 31/01/19
1

Eu acho que você precisa criar um novo objeto de produto em vez de reutilizá-lo em seu loop foreach. Reutilizando o objeto do produto, você pode obter esses efeitos colaterais, mesmo que o método "carregar" sugira que todos os dados sejam substituídos. Verifique o uso de atributos customizados emAbstractExtensibleModel

HelgeB
fonte