Próbuję pobrać atrybut produktu w szablonie koszyka. Ale ja po prostu nie działa! Atrybut jest ustawiony na Widoczny na stronach katalogu w witrynie Storefront = yes i używany na liście produktów = tak
Korzystam z niestandardowego modułu, aby zastąpić następujący szablon:
/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml
Mam produkt:
$_item = $block->getItem();
$product = $_item->getProduct();
Normalnie oczekiwałbym, że niestandardowy atrybut (w tym przypadku typu text-area) z kodem atrybutu „sample_attr” będzie dostępny z jednym z następujących:
$product->getData('sample_attr');
lub
$product->getSampleAttr();
Niektóre atrybuty są dostępne przy użyciu tego (SKU, waga, cena ..), ale dla atrybutu niestandardowego nie działa. Dołączony pomocnik (\ Magento \ Msrp \ Helper \ Data) również nie ma metody atrybutu.
Mogę uzyskać wszystkie kody atrybutów, używając:
$attributes = $product->getAttributes();
foreach($attributes as $a)
{
var_dump($a->getName());
}
Próbowałem też:
$attribute = $product->getResource()->getAttribute('sample_attr');
var_dump($attribute->getFrontend()->getValue($product));
ale zwraca wartość null.
Jak więc uzyskać wartość atrybutu?
Próbowałem: Uzyskaj określony atrybut dla każdego produktu na stronie katalogu
Wyjście niestandardowego atrybutu tekstu w katalogu list.phtml (Magento 2)
źródło
magento setup:di:compile
żeby to zadziałało, ale to ma sens. Zmieniasz tutaj drzewo zależności.Więc znalazłem sposób, aby uzyskać informacje, których szukałem. Muszę załadować pełny produkt z ProductRepository! Pamiętaj, że jeśli spróbujesz go załadować,
\Magento\Catalog\Model\Product
zachowa się jak singleton, zawsze dając ci ten sam produkt dla każdej pętli.Użyłem klasy pomocniczej modułów, ponieważ definiuje ona następującą metodę ładowania produktu z identyfikatora produktu:
Uwzględniłem pomocnika w szablonie:
Ładuję pełny produkt:
A teraz mogę użyć:
i
uzyskać dane.
źródło
Dla tych, którzy tu wylądowali, szukając prostego rozwiązania, tak mi się udało
Dodałem do mojego
default.phtml
(wmodule-checkout/view/frontend/templates/cart/item
) to:możesz zadzwonić
$customProduct->getData('your_attribute');
jak zawszeźródło
Przy prawidłowych ustawieniach administratora niestandardowe atrybuty są ładowane do obiektu produktu na stronie kasy, jeśli model źródłowy w
eav_attribute
tabeli sql jest ustawiony naNULL
. Dzięki temu możesz uzyskać bezpośredni dostęp$product->getSampleAttr()
na stronie kasy.Ale jeśli atrybut ma model źródłowy as
Magento\Eav\Model\Entity\Attribute\Source\Table
, należy załadować produkt z repozytorium.Utwórz nowego pomocnika i dodaj repozytorium produktów do konstruktora nadal działa na 2.2.6 (jako rozwiązanie tecjam)
Uwaga: problem jest taki sam, jeśli spróbujesz przesłonić mechanizm renderujący elementy (wywoływany na stronie kasy) i dodać tutaj repozytorium produktów.
źródło
Niestandardowe atrybuty nie są uwzględniane w obiekcie produktu znalezionym w Quote / Cart, dlatego nie można uzyskać go za pomocą funkcji getData („custom_attribute”). musisz uzyskać identyfikator produktu zwrócony z obiektu produktu Quote i załadować produkt za pomocą repozytorium produktu, po załadowaniu produktu przez repozytorium możesz uzyskać wszystkie dane, w tym przypisane do niego niestandardowe atrybuty, później możesz użyć funkcji getData („custom_attribute”), aby ją zdobyć.
Mam nadzieję, że to ma sens.
źródło