Получить атрибут товара в корзине в 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)

tecjam
источник

Ответы:

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

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

tecjam
источник
2

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

Я добавил к своему default.phtmlmodule-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)

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

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

Jakk64
источник
0

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

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

Зеешан Хуваджа
источник