Ответы:
вы можете сделать это так же, как 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
Лучшая практика в 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 для всех атрибутов. Если что-то меняется, вам нужно изменить это только в одном месте.
Работал для меня
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
я получаю простое решение. это покажет только значение атрибута с кодом атрибута для продукта. Я проверил на странице каталога и деталей.
код
<?php echo $_product->getAttributeText('size'); ?>
здесь размер - это имя атрибута.
ссылка: поставщик / magento / модуль-каталог / view / внешний интерфейс / шаблоны / product / view / attribute.phtml строка: 35
Использовать фабричный метод
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');
$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();
}
getResource()
метод в этой модели: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
getResource()
был метод, который ранее существовал. В v2.2.2, как я уже упоминал, он уже был объявлен устаревшим. Я подозреваю, что в ветке 2.3 -velop это было завершено. Таким образом, мой пример, который не требует этой функции.
Для всех приходит сюда.
Если у вас нет объекта продукта, вы можете получить значение параметра с помощью этих шагов.
Внедрить \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]');
Вы можете использовать для получения метки атрибута
$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);
Пожалуйста, попробуйте этот код
Шаг 1) Сначала вы должны загрузить продукты
$_productCollection = $block->getLoadedProductCollection();
Шаг 2) На странице со списком продуктов будет цикл foreach для перечисления таких продуктов, как этот
foreach ($_productCollection as $_product)
Шаг 3) Ваш код будет внутри этого цикла. Поместите код ниже в том месте, где вы хотите отобразить метку атрибута.
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Просто замените your_attribute_code на любое имя вашего атрибута.