Produktattribut in Magento2 in den Warenkorb legen

21

Ich versuche, ein Produktattribut in der Warenkorbvorlage zu erfassen. Aber ich arbeite einfach nicht! Das Attribut ist auf Sichtbar auf Katalogseiten in Storefront = yes und In Produktliste = yes festgelegt

Ich verwende ein benutzerdefiniertes Modul, um die folgende Vorlage zu überschreiben:

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

Ich habe das Produkt:

$_item = $block->getItem();
$product = $_item->getProduct();

Normalerweise würde ich erwarten, dass ein benutzerdefiniertes Attribut (in diesem Fall vom Typ Textbereich) mit dem Attributcode 'sample_attr' mit einem der folgenden Werte verfügbar ist:

$product->getData('sample_attr');

oder

$product->getSampleAttr();

Einige Attribute sind mit dieser Option verfügbar (Artikelnummer, Gewicht, Preis ...), aber für ein benutzerdefiniertes Attribut funktioniert beides nicht. Der enthaltene Helfer (\ Magento \ Msrp \ Helper \ Data) hat auch keine Attributmethode.

Ich kann alle Attributcodes erhalten mit:

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

Ich habe auch versucht:

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

Dies gibt jedoch null zurück.

Wie erhalte ich den Wert des Attributs?

Ich habe Folgendes ausprobiert: Für jedes Produkt auf der Katalogseite ein bestimmtes Attribut abrufen

Benutzerdefiniertes Textattribut in Katalog list.phtml ausgeben (Magento 2)

Tecjam
quelle

Antworten:

51

Es besteht keine Notwendigkeit, dafür PHP-Code zu ändern.

Sie müssen nur {MODULE_NAME}/etc/catalog_attributes.xmlmit solchen Inhalten erstellen :

<?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>
Igor Sydorenko
quelle
Interessant. Daran hatte ich nicht gedacht. Ich werde es später versuchen.
Tecjam
Gern geschehen :)
Igor Sydorenko
2
Fantastisch! Funktioniert bei mir. Es schien, als müsste ich weglaufen magento setup:di:compile, um das zum Laufen zu bringen, aber das macht Sinn. Hier ändern Sie den Abhängigkeitsbaum.
Psyklopz
Dies sollte meiner Meinung nach die akzeptierte Antwort sein. In den anderen Antworten wird vorgeschlagen, das Produktmodell für jeden Einkaufswagenartikel zu laden. Dies ist aus Leistungsgründen keine gute Idee, insbesondere wenn die Einkaufswagen der Benutzer groß sind.
Andrew Kett
Ich habe ein Modul erstellen tenx / checkoutex unter etc Ich habe oben Code platziert , aber seine nicht funktioniert können Sie mir helfen
Sarvesh Tiwari
8

Also habe ich einen Weg gefunden, an die Informationen zu kommen, nach denen ich gesucht habe. Ich muss das komplette Produkt aus dem ProductRepository laden! Beachten Sie, dass Sie sich, wenn Sie versuchen, es von dort zu laden, \Magento\Catalog\Model\Productwie ein Singleton verhalten, wodurch Sie für jede Schleife immer das gleiche Produkt erhalten.

Ich habe die Hilfsklasse "modules" verwendet, da sie die folgende Methode definiert, um das Produkt von der productId zu laden:

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

Ich habe den Helfer in die Vorlage aufgenommen:

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

Ich lade das vollständige Produkt:

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

Und jetzt kann ich verwenden:

$custProd->getSampleAttr();

und

$custProd->getData('sample_attr');

um die Daten zu bekommen.

Tecjam
quelle
2

Für diejenigen, die hier gelandet sind und nach einer einfachen Lösung suchen, hat es bei mir so funktioniert

Ich habe zu meinem default.phtml(in module-checkout/view/frontend/templates/cart/item) folgendes hinzugefügt :

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

dann kannst du $customProduct->getData('your_attribute');wie immer anrufen

Luca G
quelle
2
In der Vorlage rät uns Magento davon ab, ObjectManager direkt zu verwenden. Wir sollten im Block hinzufügen.
Khoa TruongDinh
2
Sie sollten den ObjectManager nicht direkt in der Vorlage oder im Block verwenden.
15.
Wenn es Ihnen einfach egal ist, wie, dann funktioniert dies zu 100%.
A. Lal
1

Mit den richtigen Administratoreinstellungen werden benutzerdefinierte Attribute in das Produktobjekt auf der Checkout-Seite geladen, wenn das eav_attributeQuellmodell in der SQL-Tabelle auf festgelegt ist NULL. So können Sie direkt mit $product->getSampleAttr()auf die Checkout-Seite zugreifen .

Wenn das Attribut jedoch ein Quellmodell hat Magento\Eav\Model\Entity\Attribute\Source\Table, müssen Sie das Produkt aus dem Repository laden.

Erstellen Sie einen neuen Helfer und fügen Sie das Produkt-Repository hinzu. Der Konstruktor arbeitet noch an 2.2.6 (als die Lösung von Tecjam).

Beachten Sie, dass das Problem dasselbe ist, wenn Sie versuchen, den Artikelrenderer (auf der Checkout-Seite aufgerufen) zu überschreiben und das Produkt-Repository hier hinzuzufügen.

Bildbeschreibung hier eingeben

Jakk64
quelle
0

Benutzerdefinierte Attribute sind nicht im Produktobjekt enthalten, das sich in Quote / Cart befindet. Daher können Sie sie nicht über die Funktion getData ('custom_attribute') abrufen. Sie müssen lediglich die ID des Produkts aus dem Angebotsproduktobjekt abrufen und das Produkt über das Produktrepository laden. Nachdem Sie das Produkt über das Repository geladen haben, können Sie alle Daten einschließlich der ihm zugewiesenen benutzerdefinierten Attribute abrufen. später können Sie die Funktion getData ('custom_attribute') verwenden, um sie abzurufen.

Hoffe es macht Sinn.

Zeeshan Khuwaja
quelle