Как создать блок в magento2

10

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

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
источник
Возможный дубликат, как создать модель в magento2?
Раджив К Томи
4
Блок и модель - это две разные вещи. Это не дубликат.
pspahn
Раджив К. Модели и блоки Тома совершенно
разные

Ответы:

20

УСТАРЕЛО: ОТВЕТ О МАГЕНТО 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;
    ....
}

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

Мариус
источник
чем проще, тем лучше
Матейл
@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 года назад
Мариус
1
@SachinS. Вы не должны использовать это больше. _viewустарела в контроллерах и скоро уйдет
Мариус
1
Могу ли я позвонить, используя Pagefactory объект, как это? $ viewPanelPageFactory = $ this-> resultPageFactory-> создать (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Сушивам
13

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

LucScu
источник