Як інстанціювати блок в magento2


10

Чи є простий спосіб, як у magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');


4
Блок і модель - це дві різні речі. Це не дублікат.
pspahn

Радєєв K Том моделі та блоки абсолютно різні
theSeeker

Відповіді:


20

ВІДКЛЮЧЕНО: ВІДПОВІДАЄ ВІДПОВІДЬ ДО АЛФИ 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у конструктор та призначити його цьому варі-члену.

Щось на зразок цього:

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 (Повний \ Блок \ Клас \ Ім'я \ Тут \) -> toHtml (); це дасть помилку, як ця фатальна помилка: виклик функції члена toHtml () на об'єкті, як я можу дістатися доHtml ()?
ND17

якщо ви перебуваєте в контролері, вам нічого не потрібно вводити _view. Він повинен бути доступний за замовчуванням, хоча, я думаю, зараз його застаріло. Я написав цю відповідь 1,5 року тому
Маріус

1
@SachinS. Вам більше не слід цим користуватися. _viewтепер застаріло в контролерах, і воно скоро піде,
Маріус

1
Чи можу я зателефонувати, використовуючи подібний об’єкт сторінки? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ 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()звідти, де вам потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.