Magento 2: Получить идентификатор опции выбора атрибута продукта, метку для настраиваемого продукта

19

Как получить значение опции на основе идентификатора опции в Magento или получить идентификатор опции на основе кода опции?

Пример: как получить идентификатор опции атрибута цвета 10 из метки «Красный» и получить значение «Красный», если идентификатор опции равен 10?

Arnaud
источник

Ответы:

46

вы можете сделать это так же, как magento 1,

Более подробная информация, посещение, получение идентификатора опции и метка из настраиваемого продукта

// получаем метку опции на основе идентификатора опции из объекта продукта

$optionId = 10;

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

// получаем идентификатор опции на основе метки опции

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

//get option id ex. 10
Ракеш Джесадия
источник
Можете ли вы сказать мне, что такое использование $ attr-> likesSource () при получении параметров атрибута
Jaisa
У меня есть варианты без условия if, что вы упомянули в своем коде
Jaisa
Можете ли вы объяснить, если я не прав
Джайса
1
идеальный ракеш бхай млишу кярек авад ма :)! сделал мой день!!! +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 для всех атрибутов. Если что-то меняется, вам нужно изменить это только в одном месте.

Клаудиу Крянгэ
источник
Вы только что сохранили мой день, я не смог получить «выпадающий» текст, и я нашел это. тогда спасибо.
Арун Карнават
11

Работал для меня

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Натаниэль Мейер
источник
7

я получаю простое решение. это покажет только значение атрибута с кодом атрибута для продукта. Я проверил на странице каталога и деталей.

код

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

здесь размер - это имя атрибута.

ссылка: поставщик / magento / модуль-каталог / view / внешний интерфейс / шаблоны / product / view / attribute.phtml строка: 35

Рафик Ислам
источник
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, мы можем создать атрибут программно без установщика
Джафар Пинджар
@jafarpinjar да, вы можете сделать это. используя тот же код.
Кайсар Сатти
2

$product->getResource()есть примечание DocBlock о том, что он устарел, по крайней мере, в v2.2.2, и поэтому я не решался его использовать. Придумал это решение, вдохновленное теми, что уже есть на этой странице:

$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 -velop это было завершено. Таким образом, мой пример, который не требует этой функции.
Джошуа Фрике
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для получения идентификатора опции из значения опции

$optionId = $attribute->getSource()->getOptionId('[option_value]');
LucScu
источник
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 на любое имя вашего атрибута.

Дивья Муралидхарана
источник