【问题标题】:How Do I Output Multiselect Attribute Values In Magento 2.3.x?如何在 Magento 2.3.x 中输出多选属性值?
【发布时间】:2020-02-15 16:17:58
【问题描述】:

在 Magento 2.3.3 商店中,我试图在类别页面上输出多选自定义属性的值,但没有任何运气。 我已设置要在产品列表中使用的属性,并尝试在我的自定义主题中的目录/产品/listing.phtml 模板页面上输出它。 我正在使用以下代码: <?php /* @escapeNotVerified */ echo $_product->getResource()->getAttribute('custom_attribute')->getFrontend()->getValue($_product); ?> 这适用于下拉属性,但不适用于多选属性。 有点卡在这个...

【问题讨论】:

    标签: magento magento2


    【解决方案1】:

    您可以使用以下代码获取 MultiSelect 属性值

    在“catalog_product_view.xml”中创建块

    <referenceBlock name="product.info.main">
        <block class="Magento\Catalog\Block\Product\View" name="attribue.name" template="Magento_Catalog::product/view/attribute_name.phtml" after="-"  /> 
    </referenceBlock>
    

    在“Magento_Catalog::product/view/attribute_name.phtml”下创建“phtml”文件

    <?php $product = $block->getProduct(); ?> 
    <div>
      <?php 
        $data = explode(',',$product->getData('attribute_code'));
        foreach($data as $value):            
      ?>
      <?php 
        $attr = $product->getResource()->getAttribute('attribute_code');
        if ($attr->usesSource()): 
      ?>
            <?php 
                $option_value = $attr->getSource()->getOptionText($value);
            ?>
            <p><?php echo $option_value; ?></p>
        <?php endif;?>
     <?php endforeach;?>
    </div>
    

    【讨论】:

    • 当我使用上面的代码时,页面中出现错误。这是 Magento 1 还是 Magento 2 的?我正在使用 Magento 2。
    • 对于 magento2,你也可以使用下面的代码 helper('Magento\Catalog\Helper\Output')->productAttribute($block->getProduct(), $block->getProduct()->getDropdown(), 'dropdown'); $dropdown_attr = $_product->getResource()->getAttribute('dropdown'); if ($dropdown_attr->usesSource()) { $dropdown = $dropdown_attr->getSource()->getOptionText($dropdown_id); } ?>
    • 这也不起作用。添加magento2的代码后页面为空白。
    【解决方案2】:

    这是一个返回“多选属性值”的代码示例。该属性属于产品实体。由于从 ProductModel 获取 ProductResource 模型并不是一个好主意,并且考虑到您可能需要在某个模板中获取它,因此只需创建一个 ViewModel 并在那里使用此示例。

    use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
    ...
    public function __construct(
        ...
        ProductResource           $productResource
    )
    {
        ...
        $this->productResource = $productResource;
    }
    
    public function prepareProductAttributeOptions($product, $attributeCode)
    {
        $result = [];
        $data = $product->getData($attributeCode);
        $optionsIds = [];
        if ($data) {
            $optionsIds = explode(',', $data);
        }
    
        foreach ($optionsIds as $optionId) {
            $attr = $this->productResource->getAttribute($attributeCode);
            if ($attr->usesSource()) {
                $option_value = $attr->getSource()->getOptionText($optionId);
                $result[] = $option_value;
            }
        }
    
        return implode(',', $result);
    
    }
    

    【讨论】:

    • 作为一般规则,在发布代码时,请说明它的作用以及它如何解决手头的问题,以及它与现有答案的不同之处。 cf.
    • @Caesar 你需要什么解释?这是返回“多选属性值”的代码示例。该属性属于产品实体,因为它是在问题中提出的。在先前的答案中,ProductResource 模型取自 ProductModel 是一种不好的做法,更不用说模板中的这个逻辑必须通过 ViewModel 使用。这就是与现有答案的区别。
    猜你喜欢
    • 2019-11-20
    • 2016-05-02
    • 2012-01-03
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多