Відповіді:
ви можете зробити це так само, як магенто 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>
Це отримає значення атрибута введення або textarea. Якщо у вас є спадне меню, ви повинні використовувати тип тексту, тому додайте цей рядок у список аргументів:
<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 / frontend / templates / 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()
був методом, який існував раніше. Як я вже згадував, v v.2.2.2 він був запланований для припинення роботи. Я підозрюю, що в галузі 2.3-розробника це було завершено. Таким чином мій приклад, який не вимагає цієї функції.
Бо всі приходять сюди.
Якщо у вас немає об’єкта продукту, ви можете отримати значення параметра за допомогою цих кроків.
Введіть \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 ($_productCollection as $_product)
Крок 3) Ваш код буде знаходитися всередині цього циклу. Розташуйте нижченаведений код у місці, де ви хочете відобразити мітку атрибута.
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Просто замініть код свого_attribute_і тим, як названий ваш атрибут.