Estoy tratando de obtener un atributo de producto en la plantilla del carrito. Pero yo simplemente no funciona! El atributo se establece en Visible en las páginas del catálogo en Storefront = yes y se utiliza en el listado de productos = yes
Utilizo un módulo personalizado para anular la siguiente plantilla:
/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml
Tengo el producto:
$_item = $block->getItem();
$product = $_item->getProduct();
Normalmente esperaría que un atributo personalizado (de tipo área de texto en este caso) con un código de atributo 'sample_attr' esté disponible con uno de estos:
$product->getData('sample_attr');
o
$product->getSampleAttr();
Algunos atributos están disponibles usando esto (sku, peso, precio ...), pero para un atributo personalizado tampoco funciona. El ayudante incluido (\ Magento \ Msrp \ Helper \ Data) tampoco tiene método de atributo.
Puedo obtener todos los códigos de atributos usando:
$attributes = $product->getAttributes();
foreach($attributes as $a)
{
var_dump($a->getName());
}
También he intentado:
$attribute = $product->getResource()->getAttribute('sample_attr');
var_dump($attribute->getFrontend()->getValue($product));
pero esto devuelve nulo.
Entonces, ¿cómo obtengo el valor del atributo?
He intentado estos: obtener un atributo específico para cada producto en la página del catálogo
Salida del atributo de texto personalizado en el catálogo list.phtml (Magento 2)
fuente
magento setup:di:compile
para que esto funcionara, pero eso tiene sentido. Estás cambiando el árbol de dependencias aquí.Así que encontré una manera de obtener la información que buscaba. ¡Tengo que cargar el producto completo del ProductRepository! Tenga en cuenta que si intenta cargarlo,
\Magento\Catalog\Model\Product
se comportará como un singleton, siempre le dará el mismo producto para cada bucle.Utilicé la clase auxiliar de mis módulos, ya que define el siguiente método para cargar el producto desde el productId:
Incluí el ayudante en la plantilla:
Cargo el producto completo:
Y ahora puedo usar:
y
para obtener los datos
fuente
Para aquellos que aterrizaron aquí buscando una solución simple, así es como me funcionó
Agregué a mi
default.phtml
(enmodule-checkout/view/frontend/templates/cart/item
) esto:entonces puedes llamar
$customProduct->getData('your_attribute');
como siemprefuente
Con la configuración de administrador correcta, los atributos personalizados se cargan en el objeto del producto en la página Finalizar compra si el modelo de origen en la
eav_attribute
tabla sql está configurado enNULL
. Por lo tanto, puede acceder directamente$product->getSampleAttr()
desde la página de pago.Pero si el atributo tiene un modelo de origen como
Magento\Eav\Model\Entity\Attribute\Source\Table
, debe cargar el producto desde el repositorio.Cree un nuevo ayudante y agregue el repositorio de productos en el constructor que aún funciona en 2.2.6 (como la solución de tecjam)
Tenga en cuenta que el problema es el mismo si intenta anular el procesador de elementos (llamado en la página de pago) y agregar el depósito del producto aquí.
fuente
Los atributos personalizados no se incluyen en el objeto del producto que se encuentra en Quote / Cart, por lo que no puede obtenerlo a través de la función getData ('custom_attribute'). lo que debe hacer es obtener el Id. del producto devuelto por el objeto de Cotización del producto y cargar el producto utilizando el repositorio del producto, una vez que haya cargado el producto a través del repositorio, puede obtener todos los datos, incluidos los atributos personalizados asignados, más tarde puede usar la función getData ('custom_attribute') para obtenerlo.
Espero que tenga sentido.
fuente