Отримайте атрибут товару у кошику в Magento2


21

Я намагаюся схопити атрибут продукту у шаблоні кошика. Але я просто не працюю! Атрибут встановлено на видимій на Сторінках каталогу на Storefront = так і використовується в Лістингу продуктів = Так

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

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

У мене є товар:

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

Зазвичай я очікую, що користувацький атрибут (тип текстової області в цьому випадку) з кодом атрибута "sample_attr" буде доступний з одним із таких:

$product->getData('sample_attr');

або

$product->getSampleAttr();

Деякі атрибути доступні за допомогою цього (ску, вага, ціна ..), але для спеціального атрибута не працює. Включений помічник (\ 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 під тощо. Я розмістив вище код, але його не працює, чи можете ви мені допомогти
Сарвеш Тіварі

8

Тож я знайшов спосіб отримати інформацію, яку я шукав. Мені потрібно завантажити повний продукт із ProductRepository! Зауважте, що якщо ви спробуєте завантажити його, \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.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

При правильних налаштуваннях адміністратора користувацькі атрибути завантажуються в об’єкт продукту на сторінці Checkout, якщо для вихідної моделі 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.