คำตอบ:
ล้าสมัย: คำตอบอ้างอิงถึง MAGENTO 2 ALPHA
ฉันหวังว่ามันจะง่าย
ขึ้นอยู่กับว่าคุณต้องการยกตัวอย่างจากที่ใด
หากคุณต้องการสร้างอินสแตนซ์จากภายในบล็อกอื่นให้ทำดังนี้:
$this->getLayout()->createBlock('Full\Block\Class\Name\Here');
จากภายในคอนโทรลเลอร์ให้ทำสิ่งนี้:
$this->_view->getLayout()->createBlock('Full\Block\Class\Name\Here');
จากภายในโมเดล:
$this->_blockFactory->createBlock('Full\Block\Class\Name\Here');
แต่ที่นี่มีการจับ
คุณต้องสร้างสมาชิกที่มีการป้องกันในรูปแบบที่เรียก_blockFactory
และฉีดอินสแตนซ์ของ\Magento\Framework\View\Element\BlockFactory
ในตัวสร้างและกำหนดให้กับสมาชิก var นั้น
บางสิ่งเช่นนี้
protected $_blockFactory;
public function __construct(
...,
\Magento\Framework\View\Element\BlockFactory $blockFactory,
....
){
....
$this->_blockFactory = $blockFactory;
....
}
สำหรับอินสแตนซ์บล็อกจากภายในตัวช่วยมันทำงานเหมือนกับรุ่น
_view
เลย โดยค่าเริ่มต้นควรจะใช้ได้แม้ว่าฉันคิดว่ามันเลิกใช้แล้ว ฉันเขียนคำตอบนี้เมื่อ 1.5 ปีก่อน
_view
เลิกใช้แล้วในคอนโทรลเลอร์และในไม่ช้ามันก็จะหายไป
เพื่อยกตัวอย่างบล็อกคุณต้องใช้
\Magento\Framework\View\LayoutInterface
คลาสและcreateBlock()
วิธีการ
ด้วยคลาสผู้ช่วยคุณสามารถทำได้ด้วยรหัสนี้:
namespace Vendor\Module\Helper;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* Layout
*
* @var \Magento\Framework\View\LayoutInterface
*/
protected $_layout;
/**
*
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\View\LayoutInterface $layout
) {
$this->_layout = $layout;
parent::__construct($context);
}
/**
* Create new block
*/
public function getBlock() {
$block = $this->_layout
->createBlock('Magento\Framework\View\Element\Template')
->setTemplate('Vendor_Module::helper/block.phtml');
return $block;
}
}
จากนั้นโทร$helper->getBlock()
จากที่ที่คุณต้องการ