Caveats: ไม่มีวิธีที่ออกแบบมาเพื่อทำสิ่งที่คุณถามในระบบ สิ่งต่อไปนี้ควรใช้งานได้ แต่ฉันไม่เคยลองใช้ระบบการผลิตอย่างกว้างขวางและอาจมีสถานการณ์ที่จะทำให้เกิดปัญหามากขึ้นว่าจะคุ้มค่า ดำเนินการต่อหากคุณสะดวกสบายในการดีบักปัญหาที่เกี่ยวข้องกับการเปลี่ยนแปลงการเขียนของระบบการทำงาน
ขั้นตอนที่ 1 คือการเลิกเขียนใหม่ แผนผังการกำหนดค่า Magento สามารถเปลี่ยนได้ที่รันไทม์ ดังนั้นหากคุณเรียกใช้รหัสต่อไปนี้
$config = Mage::getConfig();
$config->setNode(
'global/blocks/catalog/rewrite/product_list_toolbar',
'Mage_Catalog_Block_Product_List_Toolbar'
);
จากนั้นวีโอไอพีจะสร้างอินสแตนซ์Mage_Catalog_Block_Product_List_Toolbar
บล็อกเดิมให้เป็นระยะเวลาที่เหลือของคำขอ
ขั้นตอนที่ 2 กำลังตัดสินใจว่าจะเรียกสิ่งนี้ในโมดูลของคุณที่ไหน เนื่องจากนี่เป็นเพียงคอนโทรลเลอร์ของคุณและจะเขียนบล็อกที่จะไม่สร้างอินสแตนซ์จนกว่าจะสิ้นสุดคอนโทรลเลอร์ของคุณฉันจะเพิ่มวิธีการในคลาสคอนโทรลเลอร์ของคุณบางอย่างเช่นนี้
protected function _undoRewrites()
{
$config = Mage::getConfig();
$config->setNode(
'global/blocks/catalog/rewrite/product_list_toolbar',
'Mage_Catalog_Block_Product_List_Toolbar'
);
}
จากนั้นเพียงเรียกวิธีนี้เมื่อเริ่มต้นการกระทำของคุณ
public function indexAction()
{
$this->_undoRewrites();
$test = Mage::getSingleton('core/layout')->createBlock('catalog/product_list_toolbar');
var_dump($test);
}
นี่อาจดูเป็นเรื่องเล็กน้อย แต่ฉันคิดว่ามันเป็นความคิดที่ดีที่จะเป็น clunky (เช่นชัดเจน) เมื่อคุณฉลาดกับวัตถุในระบบของ Magento สถานที่นี้อาจเป็นcontroller_action_predispatch
หรือcontroller_action_predispatch_front_controller_action
กิจกรรมและ / หรือนำไปใช้ตามเงื่อนไข
เพียงจำไว้ว่าการเขียนจะไม่ถูกยกเลิกจนกว่าจะมีการเรียกใช้วิธีนี้ ซึ่งหมายความว่าหากคุณพยายามสร้างอินสแตนซ์บล็อกก่อนเรียก_undoRewrites
ใช้คลาสที่เขียนใหม่จะถูกใช้เพื่อสร้างอินสแตนซ์