Magento 2:获取产品属性的选择选项ID,可配置产品的标签


19

如何基于Magento中的选项ID获取选项值,或基于选项代码获取选项ID?

例:如何从标签“ Red”中获取颜色属性选项ID 10,如果选项ID为10,如何获取值“ Red”?

Answers:


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/…。也许有其他方法可以达到相同的结果吗?
Akif

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>

这将获取输入属性或textarea的值。如果有下拉菜单,则应使用文本类型,因此请在参数列表中添加以下行:

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

无需创建文件或编写任何php代码即可获得属性。这样,您将具有一致性,并对所有属性使用相同的attribute.phtml文件。如果有什么变化,您只需要在一个地方进行更改。


您刚刚保存了我的一天,我无法获得“下拉”文本,而我发现了这一点。那谢谢啦。
阿伦·卡纳瓦特


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,我们可以编程创建属性,而不安装
贾法尔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开发分支中它已经完成。因此,我的示例不需要该功能。
Joshua Fricke

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)

步骤3)您的代码将在此循环内。将下面的代码放在要显示属性标签的任何地方。

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

只需将您的属性命名为your_attribute_code即可

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.