Magento 2:製品属性の選択オプションID、構成可能な製品のラベルを取得する


19

MagentoのオプションIDに基づいてオプション値を取得する方法、またはオプションコードに基づいてオプションIDを取得する方法は?

例:ラベル「Red」から色属性オプションID 10を取得し、オプションIDが10の場合に値「Red」を取得する方法

回答:


46

magento 1と同じようにできます。

詳細、訪問、構成可能な製品からのオプションIDおよびラベルの取得の詳細

//製品オブジェクトからオプションIDに基づいてオプションラベルを取得します

$optionId = 10;

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $optionText = $attr->getSource()->getOptionText($optionId);
 }
//get option text ex. Red

//オプションラベルに基づいてオプションIDを取得

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $option_id = $attr->getSource()->getOptionId("Red");
 }

//get option id ex. 10

属性オプションを取得しながら、$ attr-> usesSource()の使用方法を教えてください
Jaisa

コードに記載されているif条件なしのオプションがありました
-Jaisa

説明できますか、私が間違っている場合
-Jaisa

1
完璧なrakesh bhai mlishu kyarek avad ma :)!私の一日を作りました!!! +1 :)
SagarPPanchal

おかげで、私はこのコードを使用しましたが、現在問題に直面しています。magento.stackexchange.com/questions/256510/…を参照してください。同じ結果を達成するための代替方法はありますか?
アキフ

12

magentoのベストプラクティスは、xmlを使用して行うことです。

たとえばbrand、次のような標準的な属性を取得するには、次のようにcatalog_product_view.xmlします。

<referenceBlock name="product.info.main">
    <block class="Magento\Catalog\Block\Product\View\Description" name="product.info.brand" template="product/view/attribute.phtml" before="-">
        <arguments>
            <argument name="at_call" xsi:type="string">getBrand</argument>
            <argument name="at_code" xsi:type="string">brand</argument>
            <argument name="css_class" xsi:type="string">brand</argument>
            <argument name="at_label" xsi:type="string">none</argument>
            <argument name="add_attribute" xsi:type="string">itemprop="brand"</argument>
        </arguments>
    </block>
</referenceBlock>

これにより、入力属性またはテキストエリアの値が取得されます。ドロップダウンがある場合は、テキストタイプを使用する必要があります。そのため、引数のリストに次の行を追加します。

<argument name="at_type" xsi:type="string">text</argument>

属性を取得するためにファイルを作成したり、PHPコードを記述する必要はありません。これにより、一貫性が保たれ、すべての属性に同じattribute.phtmlファイルが使用されます。何かを変更する場合は、1か所でのみ変更する必要があります。


あなたはちょうど私の一日を救った、私は「ドロップダウン」テキストを取得することができなかった、と私はこれを見つけました。ほんとありがと。
アルンカルナワット16


6

ファクトリーメソッドを使用

   protected $_attributeLoading;

   public function __construct( 
        .....
          \Magento\Catalog\Model\ResourceModel\ProductFactory   $attributeLoading,  
          ....
                                ) {
            parent::__construct($context);

            ....
            $this->_attributeLoading = $attributeLoading;
            ....

    }


   public function getAttributeOptionId($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_id = $attr->getSource()->getOptionId($label);
         }
    }
   public function getAttributeOptionText($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_Text = $attr->getSource()->getOptionText($label);
         }
    }

phtmlファイル内

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');

こんにちは@Qaisar、インストーラーを使用せずにプログラムで属性を作成できますか
jafar pinjar

@jafarpinjarはい、できます。同じコードを使用します。
Qaisar Satti

6

私は簡単な解決策を得る。これにより、製品の属性コードとともに属性値のみが表示されます。カタログと詳細ページをチェックインしました。

コードは

<?php echo $_product->getAttributeText('size'); ?>

ここで、sizeは属性名です。

参照:vendor / magento / module-catalog / view / frontend / templates / product / view / attribute.phtml行:35


2

$product->getResource()少なくともv2.2.2で非推奨になったことに関するDocBlockのメモがあるので、私はそれを使用してコーディングをためらっていました。代わりに、このページに既にあるものに触発されて、このソリューションを見つけました。

$optionId = $product->getDataByKey('attribute_code');
$optionText = null;
$attributes = $product->getAttributes();
if ($optionId && array_key_exists('attribute_code', $attributes)) {
    $attr = $attributes['attribute_code'];
    if ($attr->usesSource()) {
        $optionText = $attr->getSource()->getOptionText($optionId);
    }
}
if ($optionText) {
    //do something with $optionText
}

参考のために、これはAbstractModel.phpのメソッドです

/**
 * Retrieve model resource
 *
 * @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 * @deprecated 101.0.0 because resource models should be used directly
 */
public function getResource()
{
    return $this->_getResource();
}

オリジナルのMagentoではこのコードはどこにありますか?私も見つけることができませんgetResource()。このモデル内のメソッドgithub.com/magento/magento2/blob/2.3-develop/app/code/Magento/...
zitix

getResource()以前に存在した方法でした。私が述べたように、v2.2.2では、すでに廃止予定でした。2.3-developブランチでは、完成したと思われます。したがって、その機能を必要としない私の例。
ジョシュアフリッケ

1

皆のためにここに来ます。

製品エンティティがない場合は、この手順でオプション値を取得できます。

\Magento\Eav\Api\AttributeRepositoryInterfaceクラスに注入する

public function __construct(
    ...
    \Magento\Eav\Api\AttributeRepositoryInterface $attributeRepository,
    ...
) {
    ...
    $this->attributeRepository = $attributeRepository;
    ...
}

リポジトリを使用して属性インスタンスを取得します

// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');

$attributeオプション値からオプションIDを取得するために使用します

$optionId = $attribute->getSource()->getOptionId('[option_value]');

1

属性ラベルを取得するために使用できます

$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);

あなたはオブジェクトマネージャを使用することができます:

$pid = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$pdata = $objectManager->create('Magento\Catalog\Model\Product')->load($pid);

$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);

0

このコードを試してください

ステップ1)最初に製品をロードする必要があります

$_productCollection = $block->getLoadedProductCollection();

ステップ2)製品リストページには、このような製品をリストするためのforeachループがあります。

foreach ($_productCollection as $_product)

Step3)コードはこのループ内にあります。属性ラベルを表示したい場所に以下のコードを配置します。

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);

your_attribute_codeを属性の名前に置き換えてください。

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