Как создать экземпляр блока в magento2


Есть ли простой способ, как в magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Author: Fabian Schmengler, 2014-08-20

2 answers


УСТАРЕВШИЙ: ОТВЕТ ОТНОСИТСЯ К АЛЬФА-ВЕРСИИ MAGENTO 2


Хотел бы я, чтобы все было так просто.
Это зависит от того, откуда вы хотите создать его экземпляр.
Если вы хотите создать экземпляр внутри другого блока, сделайте это следующим образом:

$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;
    ....
}

Для создания экземпляра блока изнутри помощника он работает так же, как и для модели

 20
Author: Marius, 2016-04-20 08:35:04

Для создания экземпляра блока вам необходимо использовать \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() оттуда, откуда вам нужно.

 14
Author: LucScu, 2018-01-24 10:33:47