在Magento2中的购物车中获取产品属性


21

我正在尝试在购物车模板中获取产品属性。但是我就是行不通!该属性在“店面”的“目录页面”上设置为“可见” =是,并在“产品列表”中使用=“是”

我使用自定义模块来覆盖以下模板:

/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();

使用此属性可以使用某些属性(SKU,重量,价格..),但是对于自定义属性均无效。包含的帮助器(\ 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));

但这返回null。

那么如何获取属性的值?

我尝试了以下方法: 在目录页面上获取每种产品的特定属性

在目录list.phtml中输出自定义文本属性(Magento 2)

Answers:


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

不客气:)
Igor Sydorenko '17

2
太棒了!为我工作。看来我必须设法magento setup:di:compile解决这个问题,但这是有道理的。您将在此处更改依赖关系树。
psyklopz

这应该是恕我直言的公认答案。其他答案建议为每个购物车项目加载产品模型,出于性能原因,这不是一个好主意,尤其是在用户购物车很大时。
安德鲁·凯特

我已经在etc下创建了一个模块tenx / checkoutex,我将其放置在上面的代码中,但是它不能正常工作,您可以帮我吗
Sarvesh Tiwari

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.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 '16

2
您不应在模板或块中都不直接使用ObjectManager。
ocornu

如果您根本不在乎如何操作,那么这100%可以使用。
拉尔

1

使用正确的管理员设置,如果eav_attributesql表中的源模型设置为,则自定义属性将加载到Checkout页面的产品对象中NULL。因此,您可以$product->getSampleAttr()在结帐页面上直接访问。

但是,如果属性的源模型为Magento\Eav\Model\Entity\Attribute\Source\Table,则必须从存储库加载产品。

创建一个新的帮助程序并在构造器中添加产品存储库,该构造器仍在使用2.2.6(作为tecjam的解决方案)

请注意,如果您尝试覆盖项目渲染器(在Checkout页面中调用)并在此处添加产品存储库,则问题是相同的。

在此处输入图片说明


0

自定义属性不包含在Quote / Cart中的产品对象中,因此您无法通过getData('custom_attribute')函数获得它。您需要做的是获取从Quote产品对象返回的产品ID,并使用产品存储库加载产品。通过存储库加载产品后,您可以获取所有数据,包括分配给它的自定义属性,稍后,您可以使用getData('custom_attribute')功能获取它。

希望有道理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.