如何在magento2中实例化一个块


Answers:


20

过时的:答案指的是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;
    ....
}

为了从助手内部实例化一个块,其工作原理与模型相同


越简单越好
Matoeil

@Marius $ toplink = $ this-> getLayout()-> getBlock('top.links')-> toHtml(); 在magento 1中用于magento 2 $ this-> _ view-> getLayout()-> getBlock(Full \ Block \ Class \ Name \ Here')-> toHtml(); 这给出了这样的错误,它是致命错误:在非对象上调用成员函数toHtml()怎么获得toHtml()?
ND17

如果您在控制器中,则无需为注入任何东西_view。默认情况下应该可用,尽管我认为现在已不推荐使用。我在1.5年前写了这个答案
Marius

1
@SachinS。您不应该再使用它。_view现在已在控制器中弃用,并且很快就会消失,
Marius

1
我可以使用这样的pagefactory对象打电话吗?$ viewPanelPageFactory = $ this-> resultPageFactory-> create(); $ viewPanel = $ viewPanelPageFactory-> getLayout()-> getBlock('catalog.leftnav')-> toHtml();
Sushivam '16

13

要实例化一个块,您必须使用 \Magento\Framework\View\LayoutInterfaceclass及其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()从您需要的地方致电。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.