Uzyskaj atrybut produktu w koszyku w Magento2


21

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)

Odpowiedzi:


51

W tym celu nie trzeba zmieniać żadnego kodu PHP.

Musisz tylko utworzyć {MODULE_NAME}/etc/catalog_attributes.xmlprzy użyciu takich treści:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>

Ciekawy. Nie myślałem o tym. Spróbuję później.
tecjam

Nie ma za co :)
Igor Sydorenko,

2
Fantastyczny! Pracuje dla mnie. Wydawało się, że musiałem biec, magento setup:di:compileżeby to zadziałało, ale to ma sens. Zmieniasz tutaj drzewo zależności.
psyklopz

To powinna być zaakceptowana odpowiedź IMHO. Inne odpowiedzi sugerują ładowanie modelu produktu dla każdego elementu koszyka, co nie jest dobrym pomysłem ze względu na wydajność, szczególnie gdy wózki użytkowników są duże.
Andrew Kett

utworzyłem moduł tenx / checkoutex pod itd. Umieściłem powyżej kodu, ale nie działa, czy możesz mi pomóc
Sarvesh Tiwari

8

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\Productzachowa 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:

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

Uwzględniłem pomocnika w szablonie:

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

Ładuję pełny produkt:

$custProd = $customHelper->getProductById($product->getId());

A teraz mogę użyć:

$custProd->getSampleAttr();

i

$custProd->getData('sample_attr');

uzyskać dane.


2

Dla tych, którzy tu wylądowali, szukając prostego rozwiązania, tak mi się udało

Dodałem do mojego default.phtml(w module-checkout/view/frontend/templates/cart/item) to:

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

możesz zadzwonić $customProduct->getData('your_attribute');jak zawsze


2
W szablonie Magento odradza nam bezpośrednie korzystanie z ObjectManager. Powinniśmy dodać w bloku.
Khoa TruongDinh

2
Nie należy używać bezpośrednio menedżera obiektów ObjectManager nie w szablonie ani w bloku.
ocornu

Jeśli po prostu Cię to nie obchodzi, to w 100% działa.
A. Lal,

1

Przy prawidłowych ustawieniach administratora niestandardowe atrybuty są ładowane do obiektu produktu na stronie kasy, jeśli model źródłowy w eav_attributetabeli sql jest ustawiony na NULL. 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.

wprowadź opis zdjęcia tutaj


0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.