Obtener el valor del atributo del producto en la página del carrito, incluso no asignado a ese producto en particular Magento 2

8

Estoy obteniendo el atributo del producto de la cotización. Parece que hay un valor incorrecto. Por favor revise mi código a continuación.

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

Por favor, consulte la imagen de abajo para una mejor comprensión. ¿Hay algún error en mi colección o bucle?

ingrese la descripción de la imagen aquí

¡¡¡Por favor, ayúdame!!!

Sunny Rahevar
fuente
He usado esta función no establecida antes de $ item_s = $ product_object-> load ($ productId) ;. ¡¡Sin suerte!! ¿Hay algún problema en mi código? ¡No sé por qué sucede esto!
Sunny Rahevar
Necesita crear un objeto $objectManager->create('Magento\Catalog\Model\Product');en cada ciclo. Comprueba mi respuesta
Prince Patel

Respuestas:

3

Porque usas el mismo objeto cada vez en foreach. Necesita crear un nuevo objeto en cada ciclo. Entonces su código final se ve así:

$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: No use el administrador de objetos directamente en el código. Use la fábrica de productos porque la fábrica creará nuevos objetos cada vez.

Príncipe Patel
fuente
2

Por favor intente algo como esto

....

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
fuente
Sí, he seguido el mismo camino que mencionaste y ¡funciona para mí!
Sunny Rahevar
1

Supongo que tienes que crear un nuevo objeto de producto en lugar de reutilizarlo en tu bucle foreach. Al reutilizar el objeto del producto, puede obtener tales efectos secundarios incluso si el método "cargar" sugiere que todos los datos se sobrescribirán. Verifique el uso de atributos personalizados enAbstractExtensibleModel

HelgeB
fuente