Ottenere il valore dell'attributo del prodotto nella pagina del carrello non è nemmeno assegnato a quel particolare prodotto Magento 2


8

Ricevo l'attributo del prodotto dal preventivo. Sembra che ci sia un valore sbagliato. Si prega di controllare il mio codice qui sotto.

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

Si prega di controllare l'immagine qui sotto per una migliore comprensione. C'è qualche errore nella mia collezione o nel mio ciclo?

inserisci qui la descrizione dell'immagine

Mi aiuti per favore!!!


Ho usato questa funzione non impostata prima di $ item_s = $ product_object-> load ($ productId) ;. Senza fortuna!! C'è qualche problema nel mio codice? non so perché questo stia accadendo !!
Sunny Rahevar,

Devi creare un oggetto $objectManager->create('Magento\Catalog\Model\Product');nel ciclo foreach. Controlla la mia risposta
Prince Patel,

Risposte:


3

Perché usi sempre lo stesso oggetto in foreach. Devi creare un nuovo oggetto nel ciclo foreach. Quindi il tuo codice finale è simile al seguente:

$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: non utilizzare la gestione oggetti direttamente nel codice. Usa la fabbrica del prodotto perché la fabbrica creerà sempre nuovi oggetti.


2

Per favore, prova qualcosa del genere

....

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

Sì, ho seguito la stessa strada che hai menzionato e funziona per me!
Sunny Rahevar,

1

Immagino che tu debba creare un nuovo oggetto prodotto invece di riutilizzarlo nel tuo ciclo foreach. Riutilizzando l'oggetto prodotto è possibile ottenere tali effetti collaterali anche se il metodo "load" suggerisce che ogni dato verrebbe sovrascritto. Controlla l'utilizzo di attributi personalizzati inAbstractExtensibleModel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.