Magento 2: Отримайте ідентифікатор вибору параметра атрибута продукту, мітку для настроюваного продукту


19

Як отримати значення опції на основі ідентифікатора параметра в Magento, або отримати ідентифікатор опції на основі коду опції?

Приклад: як отримати ідентифікатор параметра атрибуту кольору 10 з мітки "Червоний" та отримати значення "Червоний", якщо ідентифікатор параметра 10?

Відповіді:


46

ви можете зробити це так само, як магенто 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-> useSource (), отримуючи параметри атрибутів
Jaisa,

Я отримав варіанти без умови if, про що ви згадали у своєму коді
Jaisa

Чи можете ви пояснити, якщо я помиляюся
Джайса

1
ідеальний rakesh bhai mlishu kyarek avad ma :)! зробив мій день!!! +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>

Це отримає значення атрибута введення або textarea. Якщо у вас є спадне меню, ви повинні використовувати тип тексту, тому додайте цей рядок у список аргументів:

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

Не потрібно створювати файли або писати будь-який код PHP, щоб отримати атрибут. Таким чином ви будете мати послідовність і використовувати один і той же файл attribute.phtml для всіх атрибутів. Якщо щось зміниться, потрібно змінити його лише в одному місці.


Ви щойно врятували мені день, я не зміг отримати "спадний" текст, і я знайшов це. тож спасибі
Arun Karnawat


7

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

код є

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

тут розмір - назва атрибута.

довідка: постачальник / magento / модуль-каталог / view / frontend / templates / 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, чи можемо ми створити атрибут програмно без інсталятора
jafar pinjar

@jafarpinjar так, ви можете це зробити. використовуючи той самий код.
Qaisar Satti

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()був методом, який існував раніше. Як я вже згадував, v v.2.2.2 він був запланований для припинення роботи. Я підозрюю, що в галузі 2.3-розробника це було завершено. Таким чином мій приклад, який не вимагає цієї функції.
Джошуа Фріке

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]');

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 ($_productCollection as $_product)

Крок 3) Ваш код буде знаходитися всередині цього циклу. Розташуйте нижченаведений код у місці, де ви хочете відобразити мітку атрибута.

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

Просто замініть код свого_attribute_і тим, як названий ваш атрибут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.