Magento2のカートで製品属性を取得する


21

カートテンプレートで商品属性を取得しようとしています。しかし、私はうまくいきません!この属性は、ストアフロントのカタログページで表示可能=はい、製品リストで使用済み=はいに設定されます。

カスタムモジュールを使用して、次のテンプレートをオーバーライドします。

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

私は製品を持っています:

$_item = $block->getItem();
$product = $_item->getProduct();

通常、 'sample_attr'の属性コードを持つカスタム属性(この場合はtext-areaタイプ)は、次のいずれかで使用可能になると予想されます。

$product->getData('sample_attr');

または

$product->getSampleAttr();

一部の属性はこれを使用して使用できます(sku、weight、price ..)が、カスタム属性の場合はどちらも機能しません。付属のヘルパー(\ Magento \ Msrp \ Helper \ Data)には属性メソッドもありません。

次を使用してすべての属性コードを取得できます。

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

私も試しました:

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

しかし、これはnullを返します。

それでは、どのようにして属性の値を取得しますか?

私はこれらを試しました: カタログページで各製品の特定の属性を取得します

カタログlist.phtml(Magento 2)のカスタムテキスト属性を出力します

回答:


51

これを行うためにPHPコードを変更する必要はありません。

{MODULE_NAME}/etc/catalog_attributes.xmlそのようなコンテンツで作成する必要があります:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>

面白い。私はそれを考えていませんでした。後で試してみます。
tecjam

どういたしまして:)
イゴール・シドレンコ

2
素晴らしい!私のために働く。これを機能させるには走らなければならなかったように見えましたmagento setup:di:compileが、それは理にかなっています。ここで依存関係ツリーを変更しています。
psyklopz

これは受け入れられた答えである必要があります。他の回答では、特にユーザーのカートが大きい場合は、パフォーマンス上の理由から良いアイデアではない各カートアイテムの製品モデルをロードすることをお勧めします。
アンドリュー・ケット

私は、コードの上に置かれたが、その作業はしていない私などの下にモジュールTENX / checkoutexを作成し、あなたが私を助けることができている
Sarvesh Tiwariさん

8

それで私は自分が求めていた情報を取得する方法を見つけました。ProductRepositoryから完全な製品をロードする必要があります!あなた\Magento\Catalog\Model\Productがそれからそれをロードしようとすると、シングルトンのように振る舞い、常に各ループで同じ製品を提供することに注意してください。

productIdから製品をロードする次のメソッドを定義するため、モジュールヘルパークラスを使用しました。

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

テンプレートにヘルパーを含めました。

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

製品全体をロードします。

$custProd = $customHelper->getProductById($product->getId());

そして今、私は使用することができます:

$custProd->getSampleAttr();

そして

$custProd->getData('sample_attr');

データを取得します。


2

簡単な解決策を探してここに上陸した人たちにとって、それは私にとってうまくいった方法です

私はdefault.phtml(にmodule-checkout/view/frontend/templates/cart/item)これに追加しました:

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

その後$customProduct->getData('your_attribute');、いつものように呼び出すことができます


2
テンプレートでは、MagentoはObjectManagerを直接使用することを推奨していません。ブロックを追加する必要があります。
コアTruongDinh

2
テンプレートやブロックではなく、ObjectManagerを直接使用しないでください。
-ocornu

どうしても気にしないのなら、この100%は機能します。
A.ラール

1

正しい管理設定を使用すると、eav_attributesqlテーブルのソースモデルがに設定されている場合、カスタム属性がチェックアウトページの製品オブジェクトにロードされNULLます。その$product->getSampleAttr()ため、チェックアウトページで直接アクセスできます。

ただし、属性のソースモデルがの場合、Magento\Eav\Model\Entity\Attribute\Source\Tableリポジトリから製品をロードする必要があります。

新しいヘルパーを作成し、コンストラクターに製品リポジトリーを追加します(tecjamのソリューションとして)。

アイテムレンダラー(チェックアウトページで呼び出されます)をオーバーライドして、ここに製品リポジトリを追加しようとすると、問題は同じであることに注意してください。

ここに画像の説明を入力してください


0

カスタム属性はQuote / Cartにある製品オブジェクトに含まれていないため、getData( 'custom_attribute')関数を使用して取得することはできません。行う必要があるのは、見積製品オブジェクトから返された製品のIDを取得し、製品リポジトリを使用して製品をロードすることです。リポジトリから製品をロードすると、それに割り当てられたカスタム属性を含むすべてのデータを取得できます。後でgetData( 'custom_attribute')関数を使用して取得できます。

それが理にかなっていることを願っています。

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