চাইল্ডএইচটিএমএল () বা চাইল্ড ব্লকে কল পদ্ধতিতে ডেটা পাস করুন


12

আমি getChildHtml () কলটিতে ডেটা পাস করতে সক্ষম হতে চাই। কারণটি হ'ল, ব্লকের আউটপুট একটি পণ্যের ধরণের উপর নির্ভরশীল। সুতরাং আমি পণ্যটি getChildHtml এ পাস করতে চাই যাতে এটি আউটপুট সম্পর্কে সিদ্ধান্ত নিতে পারে।

আমি এটি ভিতরে করছি template/checkout/cart/item/default.phtml

আদর্শভাবে, কলটি দেখতে এমন হবে:

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

তারপরে আমার ব্লকটি আইটেম থেকে পণ্যের ধরণ পেতে এবং সঠিক আউটপুট প্রদর্শন করতে পারে।

যেহেতু এই ডেটাটিতে অবশ্যই প্রবেশ করা সম্ভব নয় getChildHtml- মূল ব্লকটি পুনরায় লেখালেখি না করে কীভাবে এই জাতীয় আচরণ করা যায়?

আমার কাছে যে দুটি সমাধান রয়েছে তা নিম্নরূপ (খুব আকর্ষণীয় নয়):

1 - কোনও সহায়ক তৈরি করুন এবং কোনও ব্লক এবং টেমপ্লেটকে এটি রেন্ডার করার পরিবর্তে সহায়তার মাধ্যমে এইচটিএমএল আউটপুট অ্যাক্সেস করুন $this->helper('my_module')->getItemHtml($_item);

2 - টেমপ্লেটের ভিতরে চাইল্ড ব্লক এবং এতে ডেটা সেট করুন:

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

আমি মনে করি ম্যাজেন্টো আর্কিটেকচারের দিক থেকে, 2 নম্বর দুটি খারাপের চেয়ে কম, তবে এটি কোনও টেমপ্লেটের অভ্যন্তরে দেখতে কুৎসিত।


চাইল্ড ব্লক যে রেজিস্ট্রি বা সেশনে ব্যবহার করে তার পরিবর্তে আপনি কীভাবে 'ডেটা' সরবরাহ করতে পারেন? আপনি কি এটি পুনরুক্তিতে ব্যবহার করছেন? ব্যবহারের ক্ষেত্রে কী?
ফিলিউঙ্কল

আমি মনে করি না যে রেজিস্ট্রি এখানে সহায়তা করবে কারণ কাঙ্ক্ষিত আউটপুট একটি কার্ট আইটেম পণ্য ধরণের উপর নির্ভরশীল। সুতরাং এটি অবশ্যই কোনওভাবে ব্লকে পাস করতে হবে যাতে সঠিক ডেটা আউটপুট হতে পারে। ব্যবহারের ক্ষেত্রে কার্ট আইটেমটিতে কিছু অতিরিক্ত তথ্য প্রদর্শন করা হয় তবে এটি পণ্যের ধরণের উপর নির্ভর করে
মার্টি ওয়ালেস

আপনি পণ্যের ধরণের বৈশিষ্ট্য তৈরি করতে পারেন - সম্ভবত আপনি পণ্যের ধরণের উপর নির্ভর করে পৃথক বৈশিষ্ট্য তৈরি করেন? আপনি যদি নিজের ব্লকটি তৈরি করতে চান তবে আমরা অবশ্যই সেদিকেই পরামর্শ দিতে পারি তবে এখানে আরও কিছু অন্তর্নির্মিত জয়ের কথা থাকতে পারে যা আমি
শুকানোর

ঠিক আছে, এটি এমন একটি পণ্য স্তরের বৈশিষ্ট্য যা আমি অ্যাক্সেস করছি তবে এটি যেভাবে প্রদর্শিত হবে তা পণ্যের ধরণের উপর নির্ভর করে। একটি গ্রুপযুক্ত পণ্য একটি সাধারণ পণ্য বলার চেয়ে একই বৈশিষ্ট্যটিকে সামান্য আলাদাভাবে রেন্ডার করবে। আমি আউটপুট এর প্রতিটি স্বাদের জন্য একটি ব্লক এবং টেমপ্লেট ব্যবহার করছি
মার্টি ওয়ালেস

আমি আমার কিছু ধারণার সাথে আমার প্রশ্নটি আপডেট করেছি যা আমি চিন্তা করছি তবে 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();

তবুও, আপনি কীভাবে বাচ্চাদের ব্লকগুলি যুক্ত করার জন্য লেআউট এক্সএমএলকে সংশোধন করছেন তা দেখে আপনি আগ্রহী হতে পারেন কীভাবে এবং ম্যাগেন্টো কীভাবে 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


আমি ১০০% বিশ্বাস করি না এটি এটির একটি ভাল পদ্ধতির যা আমি উত্তরটি গ্রহণ করে নি।
মার্টি ওয়ালেস

1
শুধুমাত্র একটি উইজেট ব্লক ডেটা পেতে পারে? আপনি কি বোঝাতে চেয়েছেন? সমস্ত ব্লক তথ্য গ্রহণ করতে পারে। ম্যাজেন্টো পদগুলিতে একটি উইজেট কিছু আলাদা।
নেভভারমাইন্ড

আমি কখনও বলিনি যে তারা পারে না; আমি বলছি, সংজ্ঞা অনুসারে, কোনও উইজেটের শর্তাধীন কিছু প্রদর্শনের জন্য ডেটা ইনপুট প্রয়োজন।
ফিলিঙ্কল

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.