รับคุณลักษณะของผลิตภัณฑ์ในตะกร้าใน 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));

แต่สิ่งนี้จะคืนค่าว่าง

ดังนั้นฉันจะรับค่าของคุณลักษณะได้อย่างไร

ฉันลองแล้ว: ดู แอตทริบิวต์เฉพาะของแต่ละผลิตภัณฑ์ในหน้าแคตตาล็อก

เอาท์พุทแอตทริบิวต์ข้อความที่กำหนดเองในรายการ 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

ไม่เป็นไร :)
Igor Sydorenko

2
Fantastic! ใช้งานได้สำหรับฉัน ดูเหมือนว่าฉันจะต้องวิ่งmagento setup:di:compileเพื่อให้มันได้ผล แต่มันก็สมเหตุสมผล คุณกำลังเปลี่ยนแผนผังการพึ่งพาที่นี่
psyklopz

นี่ควรเป็นคำตอบที่ได้รับการยอมรับจาก IMHO คำตอบอื่น ๆ แนะนำให้โหลดรุ่นผลิตภัณฑ์สำหรับแต่ละรายการในรถเข็นซึ่งไม่ใช่ความคิดที่ดีสำหรับเหตุผลด้านประสิทธิภาพโดยเฉพาะอย่างยิ่งเมื่อผู้ใช้รถเข็นมีขนาดใหญ่
Andrew Kett

ฉันได้สร้างโมดูล 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 โดยตรง เราควรเพิ่มในบล็อก
Khao TruongDinh

2
คุณไม่ควรใช้ ObjectManager โดยตรงไม่ได้อยู่ในเทมเพลตหรือในบล็อก
ocornu

หากคุณไม่สนใจว่าจะทำงานอย่างไร 100%
A. Lal

1

ด้วยการตั้งค่าผู้ดูแลระบบที่ถูกต้องแอตทริบิวต์ที่กำหนดเองจะถูกโหลดในวัตถุสินค้าในหน้าชำระเงินถ้ารุ่นแหล่งที่มาในeav_attributeตาราง SQL NULLถูกตั้งค่าให้ ดังนั้นคุณสามารถเข้าถึงได้โดยตรงด้วย$product->getSampleAttr()ในหน้าชำระเงิน

แต่ถ้าแอ็ตทริบิวต์มีโมเดลต้นทางเป็นMagento\Eav\Model\Entity\Attribute\Source\Tableคุณต้องโหลดผลิตภัณฑ์จากที่เก็บ

สร้างผู้ช่วยใหม่และเพิ่มพื้นที่เก็บข้อมูลผลิตภัณฑ์ในตัวสร้างยังคงทำงานบน 2.2.6 (เป็นโซลูชันของ tecjam)

โปรดทราบว่าปัญหาจะเหมือนกันหากคุณพยายามแทนที่ตัวแสดงรายการ (เรียกว่าในหน้าชำระเงิน) และเพิ่มที่เก็บผลิตภัณฑ์ที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


0

แอตทริบิวต์ที่กำหนดเองไม่รวมอยู่ในวัตถุผลิตภัณฑ์ที่พบในใบเสนอราคา / รถเข็นดังนั้นคุณไม่สามารถรับมันผ่านฟังก์ชั่น getData ('custom_attribute') สิ่งที่คุณต้องทำคือรับ Id ของผลิตภัณฑ์ที่ส่งคืนจากออบเจ็กต์ผลิตภัณฑ์ Quote และโหลดผลิตภัณฑ์โดยใช้ที่เก็บผลิตภัณฑ์เมื่อคุณโหลดผลิตภัณฑ์ผ่านที่เก็บแล้วคุณจะได้รับข้อมูลทั้งหมดรวมถึงแอตทริบิวต์ที่กำหนดเอง ในภายหลังคุณสามารถใช้ funciton getData ('custom_attribute') เพื่อรับมันได้

หวังว่ามันจะสมเหตุสมผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.