चाइल्ड ब्लॉक पर getChildHtml () या कॉल विधि के लिए डेटा पास करें


12

मैं getChildHtml () कॉल पर डेटा पास करने में सक्षम होना चाहता हूं। इसका कारण है, ब्लॉक का उत्पादन एक उत्पाद प्रकार पर निर्भर है। इसलिए मैं उत्पाद को getChildHtml में पास करना चाहता हूं ताकि वह आउटपुट पर निर्णय ले सके।

मैं अंदर ऐसा कर रहा हूं template/checkout/cart/item/default.phtml

आदर्श रूप में, कॉल ऐसा लगेगा:

echo $this->getChildHtml('child_block_name', $_item);

फिर मेरा ब्लॉक आइटम से उत्पाद प्रकार प्राप्त कर सकता है और सही आउटपुट प्रदर्शित कर सकता है।

चूंकि इस डेटा को पारित करना निश्चित रूप से संभव नहीं है getChildHtml- कोर ब्लॉक को फिर से लिखने के बिना इस प्रकार के व्यवहार को कैसे प्राप्त किया जा सकता है

वर्तमान में मेरे दो समाधान इस प्रकार हैं (न ही बहुत आकर्षक):

1 - एक हेल्पर बनाएं और एक ब्लॉक और टेम्पलेट इसे अला रेंडर करने देने के बजाय सहायक के माध्यम से HTML आउटपुट तक पहुंचें $this->helper('my_module')->getItemHtml($_item);

2 - चाइल्ड ब्लॉक और सेटडेटा को टेम्प्लेट के अंदर एक्सेस करें:

 $this->getChild('child_name')->setData('item', $_item);
 echo $this->getChildHtml('child_name')

मुझे लगता है कि मैगेंटो वास्तुकला के संदर्भ में, नंबर 2 दो बुराइयों का कम है, लेकिन यह एक टेम्प्लेट के अंदर दिख रहा है।


क्या आप इसके बजाय चाइल्ड ब्लॉक द्वारा उपयोग किए जाने वाले रजिस्ट्री या सत्र में 'डेटा' प्रदान कर सकते हैं? क्या आप इसे एक पुनरावृत्त में उपयोग कर रहे हैं? उपयोग मामला क्या है?
philwinkle

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

आप उत्पाद-प्रकार विशेषताएँ बना सकते हैं - शायद आप उत्पाद प्रकारों के आधार पर भिन्न विशेषताएँ बनाएँ? यदि आप अपने स्वयं के ब्लॉक बनाते हैं, तो हम निश्चित रूप से उस दिशा में सलाह दे सकते हैं, लेकिन कुछ अन्य अंतर्निहित है कि मैं बाहर सूंघ करने के लिए कोशिश कर रहा हूँ यहाँ जीत ... हो सकता है
philwinkle

वैसे, यह एक उत्पाद स्तर की विशेषता है जिसे मैं एक्सेस कर रहा हूं, लेकिन इसे प्रदर्शित करने का तरीका उत्पाद के प्रकार पर निर्भर करता है। एक समूहीकृत उत्पाद एक साधारण उत्पाद कहने की तुलना में एक ही विशेषता को थोड़ा अलग तरीके से प्रस्तुत करेगा। मैं आउटपुट के प्रत्येक अलग स्वाद के लिए एक ब्लॉक और टेम्पलेट का उपयोग कर रहा हूं
मार्टी वालेस

मैंने अपने प्रश्न को कुछ विचारों के साथ अपडेट किया है जो मेरे पास हैं, जो मैं विचार कर रहा हूं लेकिन 100% के साथ सहज नहीं हूं
मार्टी वालेस

जवाबों:


3

आप उत्पाद प्रकार के आधार पर बच्चे को लाने के लिए मूल ब्लॉक पर एक विधि जोड़ सकते हैं (मैंने इस तरह के तर्क को कई बार कोर या कुछ इसी तरह से देखा है):

class ParentBlock 
{
    public function getIntuitiveNameChild($item)
    {
        return $this->getChild("intuitive_child")
                    ->setProductType($item->getProductType()) 
                    // You can also decide the product type in this setter, in the Child block.
                    ->setItem($item);
    }

    public function getIntuitiveNameChildDinamically($item)
    {
        return $this->getChild("intuitive_child_" . $item->getProductType())
                    ->setItem($item); 
    }    
}

// parent tpl
// i suggest you avoid getChildHtml(), unless you're certain that methods won't need to be called from the tpl
echo $this->getIntuitiveNameChild($_item)
          // ->someOtherMethod()
          ->toHtml();

फिर भी, कैसे आप बच्चों ब्लॉक जोड़ने के लिए लेआउट एक्सएमएल संशोधित देखकर, आप में कैसे Magento मार्कअप प्रतिपादन में उत्पाद प्रकार के आधार पर के साथ काम करने का फैसला किया दिलचस्पी हो सकती है Mage_Sales_Block_Items_Abstract::getItemHtml()और Mage_Checkout_Block_Cart_Abstract::getItemHtml()


यह विधि लेआउट संरचना को दरकिनार करती है और उन ब्लॉकों का निर्माण करती है जो कसकर युग्मित होते हैं (जैसे मैगेंटो में सब कुछ ...)
विक्टर श्रोडर

12

यदि आप foreachलूप में चाइल्ड ब्लॉक प्रदर्शित कर रहे हैं तो उपरोक्त समाधान काम नहीं करेगा ।

इसके लिए आपको निम्नलिखित कोड का उपयोग करना होगा:

<?php
foreach ($blocks as $block) {
    $this->getChild("child.block")->setData("my_data", $any_data);
    echo $this->getChildHtml('child.block', false);
}
?>

चाइल्ड.ब्लॉक में आप $this->getMyData()डेटा प्राप्त करने के लिए उपयोग कर सकते हैं । इस रणनीति का उपयोग करके चाइल्ड ब्लॉक को हमेशा माता-पिता से नवीनतम डेटा प्राप्त होगा।

का दूसरा पैरामीटर getChildHtml()है $useCache। इसे गलत पर सेट करने से पहला आउटपुट बंद हो जाता है और बच्चे को फिर से प्रस्तुत करने पर मजबूर करता है।


4

एक ब्लॉक जो डेटा प्राप्त कर सकता है उसे विजेट कहा जाता है ; हालांकि यह कई ब्लॉक परिभाषाओं (गुणों के आधार पर $_item) के माध्यम से किया जा सकता है ।

मैगेंटो विधि के लघु कोड के आधार पर भुगतान विधि ब्लॉक को लोड करके कोर में कुछ समान करता है:

<dd>
    <?php echo $this->getChildHtml('payment.method.'.$_code) ?>
</dd>

आप इस छद्म कोड के साथ भी ऐसा कर सकते हैं:

if($type = $_item->getTypeId()){
    $this->getChildHtml('my.block.' . $type);
}

सब की आवश्यकता होगी प्रत्येक उत्पाद प्रकार के लिए एक अलग ब्लॉक प्रकार के लिए हो सकता है - bundle, simple, configurable, virtual, grouped। सच में इतना बुरा नहीं है।

यदि आप वास्तव में एक विजेट का उपयोग करना चाहते हैं - यह आपके संपादित प्रश्न में आपके दूसरे विचार के प्रभाव के लिए कुछ होगा:

<?php
echo $this->getLayout()->createBlock('yourcompany/widget_class')->setType($_item->getTypeId())->toHtml();

एक विजेट बनाना शायद इस जवाब के दायरे से बाहर - लेकिन यह बहुत मुश्किल नहीं है, और लाभ दिया जा करने के लिए सक्षम होने के पुनः प्रयोजन , सीएमएस ब्लॉकों के लिए हालांकि आपके उपयोग के मामले के लिए मुझे नहीं लगता कि लागू होता है है।

एक विजेट बनाने के बारे में अधिक जानकारी के लिए:

http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1


मैं 100% आश्वस्त नहीं हूं कि यह इस के लिए एक अच्छा तरीका है जिसे मैंने उत्तर में स्वीकार किया है।
मार्टी वालेस

1
केवल एक विजेट ब्लॉक डेटा प्राप्त कर सकता है? क्या मतलब? सभी ब्लॉक डेटा प्राप्त कर सकते हैं। Magento के शब्दों में एक विजेट कुछ अलग है।
नेवरमाइंड

मैंने कभी नहीं कहा कि वे नहीं कर सकते थे; मैं कह रहा हूं, परिभाषा के अनुसार, एक विजेट को सशर्त रूप से कुछ प्रदर्शित करने के लिए डेटा इनपुट की आवश्यकता होती है।
१५:५०

0

के लिए Magento 2, आप उपयोग कर सकते हैं

<?php
foreach ($blocks as $block) {
    $block->getChildBlock("child.block")->setData("my_data", $any_data);
    echo $block->getChildHtml('child.block', false);
}
?>

डेटा प्राप्त करने के लिए,

$block->getMyData();

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