Magento2 में कार्ट में उत्पाद विशेषता प्राप्त करें


21

मैं कार्ट टेम्पलेट में उत्पाद विशेषता को हथियाने की कोशिश कर रहा हूं। लेकिन मैं सिर्फ काम नहीं करता! विशेषता स्टोरफ्रंट पर कैटलॉग पेजों पर दिखाई देने के लिए सेट है = हां और उत्पाद लिस्टिंग में प्रयुक्त = हां

मैं निम्नलिखित टेम्पलेट को ओवरराइड करने के लिए एक कस्टम मॉड्यूल का उपयोग करता हूं:

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

मेरे पास उत्पाद है:

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

आम तौर पर मैं इन मामलों में से एक के साथ उपलब्ध होने के लिए 'नमूना_अंतर' के एक विशेषता कोड के साथ एक कस्टम विशेषता (इस मामले में टाइप-क्षेत्र का) की उम्मीद करूंगा:

$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)

जवाबों:


52

ऐसा करने के लिए किसी भी 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

यह स्वीकृत उत्तर IMHO होना चाहिए। अन्य उत्तर प्रत्येक कार्ट आइटम के लिए उत्पाद मॉडल लोड करने का सुझाव देते हैं जो प्रदर्शन के कारणों के लिए एक अच्छा विचार नहीं है, खासकर जब उपयोगकर्ता कार्ट बड़े होते हैं।
एंड्रयू केट

मैंने एक मॉड्यूल टेनक्स / चेकआउट के तहत बनाया है आदि मैंने ऊपर दिए गए कोड में रखा है, लेकिन इसके काम नहीं करने से आप मेरी मदद कर सकते हैं
सर्वेश तिवारी

8

इसलिए मुझे उस जानकारी को प्राप्त करने का एक तरीका मिल गया जो मैं था। मुझे ProductRepository से पूरा उत्पाद लोड करना है! ध्यान दें कि यदि आप कोशिश करते हैं और इसे लोड करते हैं\Magento\Catalog\Model\Product यह एक सिंगलटन की तरह व्यवहार करेगा, हमेशा आपको प्रत्येक लूप के लिए एक ही उत्पाद देगा।

मैंने अपने मॉड्यूल सहायक वर्ग का उपयोग किया क्योंकि यह उत्पाद को उत्पाद से लोड करने के लिए निम्न विधि को परिभाषित करता है:

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 का उपयोग करने के लिए हतोत्साहित करता है। हमें ब्लॉक में जोड़ना चाहिए।
खोआ TruongDinh

2
आपको टेम्पलेट में न तो ObjectManager का उपयोग करना चाहिए, न ही ब्लॉक में।
ओकोर्नु

यदि आप आसानी से परवाह नहीं करते हैं, तो यह 100% काम करता है।
ए। लाल

1

सही व्यवस्थापक सेटिंग्स के साथ, कस्टम विशेषताओं को चेकआउट पृष्ठ में उत्पाद ऑब्जेक्ट में लोड किया जाता है यदि eav_attributesql तालिका में स्रोत मॉडल सेट हैNULL । इसलिए आप सीधे $product->getSampleAttr()Checkout पेज पर पहुंच सकते हैं ।

लेकिन अगर विशेषता के रूप में एक स्रोत मॉडल है Magento\Eav\Model\Entity\Attribute\Source\Table , तो आपको उत्पाद को रिपॉजिटरी से लोड करना होगा।

एक नया सहायक बनाएं और निर्माता में उत्पाद रिपॉजिटरी जोड़ें। अभी भी 2.2.6 पर काम कर रहा है (tecjam के समाधान के रूप में)

कृपया ध्यान दें कि यदि आप आइटम रेंडरर (चेकआउट पेज में कहा जाता है) को ओवरराइड करने की कोशिश करते हैं और उत्पाद रिपॉजिटरी को यहां जोड़ते हैं तो यह समस्या है।

यहाँ छवि विवरण दर्ज करें


0

कस्टम विशेषताएँ उद्धरण / कार्ट में मिली उत्पाद वस्तु में शामिल नहीं हैं, इसलिए आप इसे getData ('custom_attribute') फ़ंक्शन के माध्यम से प्राप्त नहीं कर सकते। आपको उत्पाद की Id को उत्पाद की बोली से लौटाए जाने वाले उत्पाद की Id प्राप्त करने और उत्पाद भंडार का उपयोग करके लोड करने की आवश्यकता है, एक बार जब आपने उत्पाद को भंडार के माध्यम से लोड कर दिया है, तो आप इसे सौंपे गए कस्टम विशेषताओं सहित सभी डेटा प्राप्त कर सकते हैं, बाद में आप इसे प्राप्त करने के लिए getData ('custom_attribute') funciton का उपयोग कर सकते हैं।

आशा है कि यह समझ में आता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.