Odpowiedzi:
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
Najlepszą praktyką w Magento jest robienie tego za pomocą xml.
Aby uzyskać standardowy atrybut taki jak brand
robisz coś takiego catalog_product_view.xml
na 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.
Pracował dla mnie
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
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
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');
$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();
}
getResource()
metody w tym modelu: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
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.
Wszyscy tu przychodzą.
Jeśli nie masz żadnej jednostki produktu, możesz pobrać wartość opcji, wykonując te czynności.
Wstrzyknąć \Magento\Eav\Api\AttributeRepositoryInterface
do 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, $attribute
aby uzyskać identyfikator opcji z wartości opcji
$optionId = $attribute->getSource()->getOptionId('[option_value]');
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);
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.