特定の製品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);の前にこのunset関数を使用しました。運が悪い!コードに問題はありますか?なぜこれが起こっているのかわかりません!!
Sunny Rahevar

$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

はい、私はあなたが言ったのと同じ方法に従っています、そしてそれは私のために働きます!
Sunny Rahevar

1

foreachループで再利用する代わりに、新しい製品オブジェクトを作成する必要があると思います。productオブジェクトを再利用することにより、メソッド「load」がすべてのデータが上書きされることを示唆している場合でも、そのような副作用を得ることができます。カスタム属性の使用法を確認してくださいAbstractExtensibleModel

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.