Nhận thuộc tính sản phẩm trong giỏ hàng trong Magento2


21

Tôi đang cố lấy một thuộc tính sản phẩm trong mẫu giỏ hàng. Nhưng tôi không làm việc! Thuộc tính được đặt thành Hiển thị trên các trang Danh mục trên Storefront = yes và Được sử dụng trong Danh sách sản phẩm = yes

Tôi sử dụng một mô-đun tùy chỉnh để ghi đè lên mẫu sau:

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

Tôi có sản phẩm:

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

Thông thường tôi sẽ mong đợi một thuộc tính tùy chỉnh (thuộc loại văn bản trong trường hợp này) với mã thuộc tính 'sample_attr' có sẵn với một trong những điều sau:

$product->getData('sample_attr');

hoặc là

$product->getSampleAttr();

Một số thuộc tính có sẵn bằng cách sử dụng này (sku, trọng lượng, giá ..), nhưng đối với một thuộc tính tùy chỉnh không hoạt động. Trình trợ giúp đi kèm (\ Magento \ Msrp \ Helper \ Data) cũng không có phương thức thuộc tính.

Tôi có thể nhận được tất cả các mã thuộc tính bằng cách sử dụng:

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

Tôi cũng đã thử:

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

nhưng điều này trả về null.

Vậy làm thế nào để tôi có được giá trị của thuộc tính?

Tôi đã thử những điều sau: Nhận thuộc tính cụ thể cho từng sản phẩm trên trang danh mục

Xuất thuộc tính văn bản tùy chỉnh trong danh sách danh mục.phtml (Magento 2)

Câu trả lời:


51

Không cần thiết phải thay đổi bất kỳ mã PHP nào để làm điều này.

Bạn chỉ cần tạo {MODULE_NAME}/etc/catalog_attributes.xmlvới nội dung như vậy:

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

Hấp dẫn. Tôi đã không nghĩ về điều đó. Tôi sẽ thử lại sau.
tecjam

Bạn được chào đón :)
Igor Sydorenko

2
Tuyệt diệu! Làm việc cho tôi. Có vẻ như tôi đã phải chạy magento setup:di:compileđể làm cho nó hoạt động, nhưng điều đó có ý nghĩa. Bạn đang thay đổi cây phụ thuộc ở đây.
psyklopz

Đây phải là câu trả lời được chấp nhận IMHO. Các câu trả lời khác đề nghị tải mô hình sản phẩm cho từng mặt hàng không phải là ý tưởng hay vì lý do hiệu suất, đặc biệt là khi giỏ hàng của người dùng lớn.
Andrew Kett

Tôi đã tạo một mô-đun tenx / checkoutex theo vv Tôi đã đặt mã ở trên nhưng nó không hoạt động, bạn có thể giúp tôi không
Sarvesh Tiwari

8

Vì vậy, tôi tìm thấy một cách để có được thông tin tôi sau. Tôi phải tải sản phẩm hoàn chỉnh từ ProductRep repository! Lưu ý rằng nếu bạn thử và tải nó từ \Magento\Catalog\Model\Productnó sẽ hoạt động giống như một singleton, luôn cung cấp cho bạn cùng một sản phẩm cho mỗi vòng lặp.

Tôi đã sử dụng lớp trình trợ giúp mô-đun của mình vì nó định nghĩa phương thức sau để tải sản phẩm từ sản phẩmId:

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

Tôi đã bao gồm người trợ giúp trong mẫu:

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

Tôi tải toàn bộ sản phẩm:

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

Và bây giờ tôi có thể sử dụng:

$custProd->getSampleAttr();

$custProd->getData('sample_attr');

để lấy dữ liệu


2

Đối với những người hạ cánh ở đây đang tìm kiếm một giải pháp đơn giản, đó là cách nó phù hợp với tôi

Tôi đã thêm vào default.phtml(trong module-checkout/view/frontend/templates/cart/item) này:

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

sau đó bạn có thể gọi $customProduct->getData('your_attribute');như mọi khi


2
Trong mẫu, Magento không khuyến khích chúng tôi sử dụng ObjectManager trực tiếp. Chúng ta nên thêm vào trong khối.
Khoa TruongDinh

2
Bạn không nên sử dụng trực tiếp ObjectManager không có trong mẫu cũng như trong khối.
ocornu

Nếu bạn chỉ đơn giản là không quan tâm làm thế nào, điều này 100% hoạt động.
A. Lal

1

Với cài đặt quản trị chính xác, các thuộc tính tùy chỉnh được tải trong đối tượng sản phẩm trong trang Checkout nếu mô hình nguồn trong eav_attributebảng sql được đặt thành NULL. Vì vậy, bạn có thể truy cập trực tiếp $product->getSampleAttr()trên Trang Thanh toán.

Nhưng nếu thuộc tính có mô hình nguồn như Magento\Eav\Model\Entity\Attribute\Source\Table, bạn phải tải sản phẩm từ kho lưu trữ.

Tạo một trình trợ giúp mới và thêm kho lưu trữ sản phẩm trong hàm tạo vẫn hoạt động trên 2.2.6 (như giải pháp của tecjam)

Xin lưu ý vấn đề là tương tự nếu bạn cố gắng ghi đè trình kết xuất mục (được gọi trong Trang Thanh toán) và thêm kho lưu trữ sản phẩm tại đây.

nhập mô tả hình ảnh ở đây


0

Các thuộc tính tùy chỉnh không được bao gồm trong đối tượng sản phẩm được tìm thấy trong Trích dẫn / Giỏ hàng, do đó bạn không thể có được nó thông qua chức năng getData ('custom_attribution'). những gì bạn cần làm là lấy Id của sản phẩm được trả về từ đối tượng Sản phẩm được trích dẫn và tải sản phẩm bằng kho sản phẩm, khi bạn đã tải sản phẩm qua kho lưu trữ, sau đó bạn có thể nhận được tất cả dữ liệu bao gồm các thuộc tính tùy chỉnh được gán cho nó, sau này bạn có thể sử dụng funciton getData ('custom_attribution') để lấy nó.

Hy vọng nó có ý nghĩa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.