Magento 2: Uzyskaj identyfikator opcji wyboru atrybutu produktu, etykietę dla konfigurowalnego produktu

19

Jak uzyskać wartość opcji na podstawie identyfikatora opcji w Magento lub uzyskać identyfikator opcji na podstawie kodu opcji?

Przykład: jak uzyskać identyfikator atrybutu koloru id 10 z etykiety „Czerwony” i uzyskać wartość „Czerwony”, jeśli identyfikator opcji to 10?

Arnaud
źródło

Odpowiedzi:

46

możesz to zrobić tak samo jak magento 1,

Więcej informacji w szczegółach, Odwiedź, Uzyskaj identyfikator opcji i Etykieta z konfigurowalnego produktu

// pobierz etykietę opcji na podstawie identyfikatora opcji z obiektu produktu

$optionId = 10;

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

// pobierz identyfikator opcji na podstawie etykiety opcji

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

//get option id ex. 10
Rakesh Jesadiya
źródło
Czy możesz mi powiedzieć, jakie jest użycie $ attr-> usesSource () podczas uzyskiwania opcji atrybutów
Jaisa
Mam opcje bez warunku if, o czym wspomniałeś w kodzie
Jaisa
Czy możesz wyjaśnić, jeśli się mylę
Jaisa
1
perfect rakesh bhai mlishu kyarek avad ma :)! uczyniło mój dzień !!! +1 :)
SagarPPanchal
Dzięki, użyłem tego fragmentu kodu, ale mam teraz problemy. Zobacz magento.stackexchange.com/questions/256510/… . Czy istnieje alternatywna metoda osiągnięcia tego samego rezultatu?
Akif
12

Najlepszą praktyką w Magento jest robienie tego za pomocą xml.

Aby uzyskać standardowy atrybut taki jak brandrobisz coś takiego catalog_product_view.xmlna przykład:

<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>

Otrzyma wartość atrybutu wejściowego lub pola tekstowego. Jeśli masz listę rozwijaną, powinieneś użyć typu tekstu, więc dodaj ten wiersz na liście argumentów:

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

Nie trzeba tworzyć plików ani pisać kodu php, aby uzyskać atrybut. W ten sposób uzyskasz spójność i użyjesz tego samego pliku attribute.phtml dla wszystkich atrybutów. Jeśli coś się zmienia, musisz to zmienić tylko w jednym miejscu.

Claudiu Creanga
źródło
Właśnie uratowałeś mi dzień, nie mogłem uzyskać tekstu „rozwijanego” i znalazłem to. Więc dziękuję.
Arun Karnawat
11

Pracował dla mnie

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Nathaniel Meyer
źródło
7

dostaję proste rozwiązanie. pokaże to tylko wartość atrybutu z kodem atrybutu dla produktu. sprawdziłem na stronie katalogu i szczegółów.

kod jest

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

tutaj rozmiar jest nazwą atrybutu.

referencja: sprzedawca / magento / moduł-katalog / widok / interfejs / szablony / produkt / widok / atrybut.phtml wiersz: 35

Rafiqul Islam
źródło
6

Użyj metody fabrycznej

   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);
         }
    }

w pliku phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
źródło
cześć @Qaisar, czy możemy stworzyć atrybut programowo bez instalatora
jafar pinjar
@jafarpinjar tak, możesz to zrobić. używając tego samego kodu.
Qaisar Satti
2

$product->getResource()ma notatkę DocBlock o tym, że jest przestarzała przynajmniej w wersji 2.2.2, więc wahałem się przed użyciem kodu. Wymyśliliśmy to rozwiązanie, inspirowane tymi, które są już na tej stronie:

$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
}

Dla porównania jest to metoda z 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();
}
Joshua Fricke
źródło
Gdzie widzisz ten kod w oryginalnym Magento? Nie mogę nawet znaleźć getResource()metody w tym modelu: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()była metodą, która wcześniej istniała. W wersji 2.2.2, jak wspomniałem, było już przeznaczone na wycofanie. Podejrzewam, że w gałęzi 2.3 rozwijającej się został ukończony. Zatem mój przykład, który nie wymaga tej funkcji.
Joshua Fricke
1

Wszyscy tu przychodzą.

Jeśli nie masz żadnej jednostki produktu, możesz pobrać wartość opcji, wykonując te czynności.

Wstrzyknąć \Magento\Eav\Api\AttributeRepositoryInterfacedo swojej klasy

public function __construct(
    ...
    \Magento\Eav\Api\AttributeRepositoryInterface $attributeRepository,
    ...
) {
    ...
    $this->attributeRepository = $attributeRepository;
    ...
}

Użyj repozytorium, aby uzyskać instancję atrybutu

// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');

Użyj, $attributeaby uzyskać identyfikator opcji z wartości opcji

$optionId = $attribute->getSource()->getOptionId('[option_value]');
LucScu
źródło
1

możesz użyć do uzyskania etykiety atrybutu

$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);

możesz użyć menedżera obiektów:

$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);
Pradip Garchar
źródło
0

Spróbuj tego kodu

Krok 1) Najpierw musisz załadować produkty

$_productCollection = $block->getLoadedProductCollection();

Krok 2) Na stronie z listą produktów pojawi się pętla foreach do umieszczenia na liście takich produktów

foreach ($_productCollection as $_product)

Krok 3) Twój kod będzie w tej pętli. Umieść poniższy kod w miejscu, w którym chcesz wyświetlić etykietę atrybutu.

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

Po prostu zamień swój kod_atrybutu na dowolną nazwę atrybutu.

Divya Muralidharan
źródło