Obter atributo do produto no carrinho no Magento2

21

Estou tentando pegar um atributo de produto no modelo de carrinho. Mas eu simplesmente não funciona! O atributo está definido como Visível nas páginas do catálogo na montra = sim e Usado na lista de produtos = sim

Eu uso um módulo personalizado para substituir o seguinte modelo:

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

Eu tenho o produto:

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

Normalmente, eu esperaria que um atributo personalizado (do tipo área de texto nesse caso) com um código de atributo 'sample_attr' estivesse disponível com um destes:

$product->getData('sample_attr');

ou

$product->getSampleAttr();

Alguns atributos estão disponíveis usando isso (sku, peso, preço ..), mas para um atributo personalizado não funciona. O auxiliar incluído (\ Magento \ Msrp \ Helper \ Data) também não possui método de atributo.

Eu posso obter todos os códigos de atributo usando:

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

Eu também tentei:

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

mas isso retorna nulo.

Então, como obtenho o valor do atributo?

Eu tentei o seguinte: Obter atributo específico para cada produto na página do catálogo

Atributo de texto personalizado de saída no catálogo list.phtml (Magento 2)

tecjam
fonte

Respostas:

51

Não há necessidade de alterar nenhum código PHP para fazer isso.

Você só precisa criar {MODULE_NAME}/etc/catalog_attributes.xmlcom esse conteúdo:

<?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
fonte
Interessante. Eu não tinha pensado nisso. Vou tentar isso mais tarde.
tecjam
De nada :)
Igor Sydorenko
2
Fantástico! Funciona para mim. Parecia que eu tinha que correr magento setup:di:compilepara fazer isso funcionar, mas isso faz sentido. Você está alterando a árvore de dependência aqui.
Psyklopz 23/05
Esta deve ser a resposta aceita IMHO. As outras respostas sugerem o carregamento do modelo do produto para cada item do carrinho, o que não é uma boa ideia por razões de desempenho, especialmente quando os carrinhos dos usuários são grandes.
Andrew Kett
eu tenho criar um módulo tenx / checkoutex sob etc eu ter colocado acima código, mas não o seu trabalho você pode me ajudar
Sarvesh Tiwari
8

Então, encontrei uma maneira de obter as informações que buscava. Preciso carregar o produto completo no ProductRepository! Observe que se você tentar carregá- \Magento\Catalog\Model\Productlo, ele se comportará como um singleton, sempre fornecendo o mesmo produto para cada loop.

Usei a classe auxiliar de módulos, pois define o seguinte método para carregar o produto a partir do productId:

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

Eu incluí o auxiliar no modelo:

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

Carrego o produto completo:

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

E agora eu posso usar:

$custProd->getSampleAttr();

e

$custProd->getData('sample_attr');

para obter os dados.

tecjam
fonte
2

Para aqueles que chegaram aqui procurando uma solução simples, foi assim que funcionou para mim

Eu adicionei ao meu default.phtml(in module-checkout/view/frontend/templates/cart/item) isto:

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

então você pode ligar $customProduct->getData('your_attribute');como sempre

Luca G
fonte
2
No modelo, o Magento nos desencoraja a usar o ObjectManager diretamente. Devemos adicionar no bloco.
precisa saber é o seguinte
2
Você não deve usar diretamente o ObjectManager, nem no modelo nem no bloco.
Ocornu
Se você simplesmente não se importa como, esse 100% funciona.
A. Lal
1

Com configurações administrativas corretas, atributos personalizados são carregados no objeto produto no caixa página, se o modelo de origem na eav_attributetabela SQL está definido para NULL. Assim, você pode acessar diretamente com $product->getSampleAttr()a Página do Google Checkout.

Mas se o atributo tiver um modelo de origem como Magento\Eav\Model\Entity\Attribute\Source\Table, você deverá carregar o produto a partir do repositório.

Crie um novo auxiliar e adicione o repositório do produto no construtor ainda está trabalhando no 2.2.6 (como a solução do tecjam)

Observe que o problema é o mesmo se você tentar substituir o representante do item (chamado na página Checkout) e adicionar o repositório do produto aqui.

insira a descrição da imagem aqui

Jakk64
fonte
0

Os atributos personalizados não estão incluídos no objeto do produto encontrado em Quote / Cart, portanto, você não pode obtê-lo através da função getData ('custom_attribute'). o que você precisa fazer é obter o ID do produto retornado do objeto Quote e carregar o produto usando o repositório do produto. Depois de carregar o produto no repositório, você poderá obter todos os dados, incluindo os atributos personalizados atribuídos a ele, posteriormente, você pode usar a função getData ('custom_attribute') para obtê-lo.

Espero que faça sentido.

Zeeshan Khuwaja
fonte