Ottieni l'attributo del prodotto nel carrello in Magento2


21

Sto cercando di afferrare un attributo del prodotto nel modello del carrello. Ma non funziona! L'attributo è impostato su Visibile nelle pagine del catalogo su Storefront = yes e utilizzato nella scheda di prodotto = yes

Uso un modulo personalizzato per sovrascrivere il seguente modello:

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

Ho il prodotto:

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

Normalmente mi aspetterei che un attributo personalizzato (di tipo area di testo in questo caso) con un codice di attributo di 'sample_attr' sia disponibile con uno di questi:

$product->getData('sample_attr');

o

$product->getSampleAttr();

Alcuni attributi sono disponibili usando questo (sku, peso, prezzo ..), ma per un attributo personalizzato non funziona. Anche l'helper incluso (\ Magento \ Msrp \ Helper \ Data) non ha alcun metodo di attributo.

Posso ottenere tutti i codici degli attributi usando:

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

Ho anche provato:

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

ma questo restituisce null.

Quindi, come posso ottenere il valore dell'attributo?

Ho provato questi: ottenere l'attributo specifico per ciascun prodotto sulla pagina del catalogo

Attributo del testo personalizzato di output nell'elenco del catalogo.phtml (Magento 2)

Risposte:


51

Non è necessario modificare alcun codice PHP per farlo.

Hai solo bisogno di creare {MODULE_NAME}/etc/catalog_attributes.xmlcon tali contenuti:

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

Interessante. Non ci avevo pensato. Ci proverò più tardi.
tecjam,


2
Fantastico! Per me va bene. Sembrava che dovessi correre magento setup:di:compileper farlo funzionare, ma ha senso. Stai cambiando l'albero delle dipendenze qui.
psyklopz,

Questa dovrebbe essere la risposta accettata IMHO. Le altre risposte suggeriscono di caricare il modello del prodotto per ciascun articolo del carrello che non è una buona idea per motivi di prestazioni, specialmente quando i carrelli degli utenti sono grandi.
Andrew Kett,

ho creato un modulo tenx / checkoutex sotto ecc. ho inserito il codice sopra, ma non funziona mi potete aiutare
Sarvesh Tiwari,

8

Quindi ho trovato un modo per ottenere le informazioni che cercavo. Devo caricare il prodotto completo dal ProductRepository! Nota che se provi a caricarlo da \Magento\Catalog\Model\Productesso si comporterà come un singleton, dandoti sempre lo stesso prodotto per ogni loop.

Ho usato la mia classe helper di moduli in quanto definisce il seguente metodo per caricare il prodotto dall'Id prodotto:

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

Ho incluso l'helper nel modello:

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

Carico il prodotto completo:

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

E ora posso usare:

$custProd->getSampleAttr();

e

$custProd->getData('sample_attr');

per ottenere i dati.


2

Per quelli sbarcati qui alla ricerca di una soluzione semplice, è così che ha funzionato per me

Ho aggiunto al mio default.phtml(in module-checkout/view/frontend/templates/cart/item) questo:

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

allora puoi chiamare $customProduct->getData('your_attribute');come sempre


2
Nel modello, Magento ci scoraggia a usare direttamente ObjectManager. Dovremmo aggiungere nel blocco.
Khoa TruongDinh,

2
Non utilizzare direttamente l'ObjectManager non nel modello, né nel blocco.
ocornu,

Se semplicemente non ti interessa come, questo funziona al 100%.
A. Lal il

1

Con le impostazioni di amministrazione corrette, gli attributi personalizzati vengono caricati nell'oggetto prodotto nella pagina Checkout se il modello di origine nella eav_attributetabella sql è impostato su NULL. In questo modo puoi accedere direttamente $product->getSampleAttr()alla pagina di pagamento.

Ma se l'attributo ha un modello di origine come Magento\Eav\Model\Entity\Attribute\Source\Table, è necessario caricare il prodotto dal repository.

Crea un nuovo helper e aggiungi il repository di prodotti nel costruttore sta ancora lavorando su 2.2.6 (come soluzione del tecjam)

Si noti che il problema è lo stesso se si tenta di sovrascrivere il renderer di elementi (chiamato nella pagina di pagamento) e aggiungere qui il repository del prodotto.

inserisci qui la descrizione dell'immagine


0

Gli attributi personalizzati non sono inclusi nell'oggetto prodotto trovato in Quote / Carrello, quindi non è possibile ottenerlo tramite la funzione getData ('custom_attribute'). quello che devi fare è ottenere l'ID del prodotto restituito dall'oggetto prodotto Quote e caricare il prodotto utilizzando il repository del prodotto, una volta che hai caricato il prodotto tramite il repository, puoi ottenere tutti i dati inclusi gli attributi personalizzati assegnati, successivamente è possibile utilizzare la funzione getData ('custom_attribute') per ottenerlo.

Spero abbia senso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.