Получить атрибут товара в корзине в Magento2


21

Я пытаюсь получить атрибут товара в шаблоне корзины. Но у меня просто не работает! Атрибут имеет значение Видимый на страницах каталога в Магазине = да и Используется в списке товаров = да

Я использую пользовательский модуль для переопределения следующего шаблона:

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

У меня есть продукт:

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

Обычно я ожидаю, что пользовательский атрибут (в данном случае типа text-area) с кодом атрибута «sample_attr» будет доступен с одним из них:

$product->getData('sample_attr');

или

$product->getSampleAttr();

Некоторые атрибуты доступны с использованием этого (sku, weight, price ..), но для пользовательского атрибута ни один не работает. Включенный помощник (\ Magento \ Msrp \ Helper \ Data) также не имеет метода атрибутов.

Я могу получить все коды атрибутов, используя:

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

Я также попробовал:

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

но это возвращает ноль.

Итак, как мне получить значение атрибута?

Я пробовал это: получить конкретный атрибут для каждого продукта на странице каталога

Вывести пользовательский текстовый атрибут в каталог list.phtml (Magento 2)

Ответы:


51

Для этого нет необходимости менять какой-либо PHP-код.

Вам просто нужно создать {MODULE_NAME}/etc/catalog_attributes.xmlс таким контентом:

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

Интересный. Я не думал об этом. Я попробую позже.
— tecjam

Не за что :) :)
— Игорь Сидоренко

2
Фантастический! Работает для меня. Казалось, мне нужно было бежать, magento setup:di:compileчтобы заставить это работать, но это имеет смысл. Вы меняете дерево зависимостей здесь.
— psyklopz

Это должен быть принятый ответ ИМХО. Другие ответы предполагают загрузку модели продукта для каждого элемента корзины, что не является хорошей идеей по соображениям производительности, особенно когда пользовательские корзины большие.
— Эндрю Кетт

я создал модуль tenx / checkoutex под etc, я разместил выше код, но он не работает, вы можете мне помочь
— Сарвеш Тивари

8

Таким образом, я нашел способ получить информацию, которая была мне нужна. Я должен загрузить весь продукт из репозитория Product! Обратите внимание, что если вы попытаетесь загрузить его из \Magento\Catalog\Model\Productнего, он будет вести себя как одиночка, всегда предоставляя вам один и тот же продукт для каждого цикла.

Я использовал свой вспомогательный класс модулей, так как он определяет следующий метод для загрузки продукта из 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);
}

Я включил помощника в шаблон:

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

Я загружаю полный продукт:

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

И теперь я могу использовать:

$custProd->getSampleAttr();

и

$custProd->getData('sample_attr');

чтобы получить данные.


2

Для тех, кто приземлился здесь, ищет простое решение, вот как это сработало для меня

Я добавил к своему default.phtml(в module-checkout/view/frontend/templates/cart/item) это:

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

тогда можешь звонить $customProduct->getData('your_attribute');как всегда


2
В шаблоне Magento не рекомендует нам использовать ObjectManager напрямую. Надо добавить в блок.
— Khoa TruongDinh

2
Вы не должны использовать ObjectManager напрямую ни в шаблоне, ни в блоке.
— ocornu

Если вам просто все равно, как это работает, это 100%.
— А. Лал

1

При правильных настройках администратора пользовательские атрибуты загружаются в объект продукта на странице оформления заказа, если для исходной модели в eav_attributeтаблице sql установлено значение NULL. Таким образом, вы можете получить доступ непосредственно $product->getSampleAttr()на странице оформления заказа.

Но если атрибут имеет исходную модель как Magento\Eav\Model\Entity\Attribute\Source\Table, вы должны загрузить продукт из хранилища.

Создайте новый помощник и добавьте репозиторий продукта в конструктор, все еще работающий на 2.2.6 (как решение tecjam)

Обратите внимание, что проблема остается той же, если вы пытаетесь переопределить средство визуализации элементов (называемое на странице оформления заказа) и добавляете сюда репозиторий продуктов.

введите описание изображения здесь


0

Пользовательские атрибуты не включены в объект продукта, который находится в Quote / Cart, поэтому вы не можете получить его через функцию getData ('custom_attribute'). что вам нужно сделать, это получить идентификатор продукта, возвращенного из объекта продукта Quote, и загрузить продукт с помощью репозитория продукта; как только вы загрузите продукт через репозиторий, вы сможете получить все данные, включая назначенные ему пользовательские атрибуты, позже вы можете использовать функцию getData ('custom_attribute'), чтобы получить ее.

Надеюсь, это имеет смысл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.