Como instanciar um bloco no magento2

10

Existe uma maneira simples como no magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
fonte
possível duplicata de como instanciar um modelo no magento2?
Rajeev K Tomy
4
Um bloco e um modelo são duas coisas diferentes. Isto não é uma duplicata.
pspahn
Rajeev K modelos e blocos de Tom são totalmente diferente e foi decorado
theSeeker

Respostas:

20

ATUALIZADO: RESPOSTA Refere-se a MAGENTO 2 ALPHA


Eu queria que fosse assim tão fácil.
Depende de onde você deseja instanciar.
Se você deseja criar uma instância de dentro de outro bloco, faça o seguinte:

$this->getLayout()->createBlock('Full\Block\Class\Name\Here');

De dentro de um controlador, faça o seguinte:

 $this->_view->getLayout()->createBlock('Full\Block\Class\Name\Here');

De dentro de um modelo:

 $this->_blockFactory->createBlock('Full\Block\Class\Name\Here');

mas aqui há um problema.
você deve criar um membro protegido no modelo chamado _blockFactorye injetar uma instância \Magento\Framework\View\Element\BlockFactoryno construtor e atribuí-lo a esse membro var.

Algo assim:

protected $_blockFactory;
public function __construct(
   ...,
   \Magento\Framework\View\Element\BlockFactory $blockFactory,
   ....
){
    ....
    $this->_blockFactory = $blockFactory;
    ....
}

Para instanciar um bloco de dentro de um auxiliar, ele funciona da mesma forma que no modelo

Marius
fonte
quanto mais simples melhor
Matoeil 21/08/14
@ Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); use no magento 1 para magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Bloco \ Classe \ Nome \ Aqui \) '-> toHtml (); isso dá um erro como este Erro fatal: Chamada para uma função de membro toHtml () em um não-objeto como posso obter toHtml ()?
ND17 28/01
se você estiver em um controlador, não precisará injetar nada _view. Ele deve estar disponível por padrão, embora eu ache que está obsoleto agora. Eu escrevi esta resposta há 1,5 anos
Marius
1
@SachinS. Você não deve mais usar isso. _viewestá obsoleto agora em controladores e em breve desaparecerá,
Marius
1
Posso ligar usando o objeto pagefactory como este? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam 27/09/16
13

Para instanciar um bloco, você precisa usar a \Magento\Framework\View\LayoutInterfaceclasse e seu createBlock()método.

Com uma classe auxiliar, você pode fazer isso com este código:

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;

     }

}

Então ligue $helper->getBlock()de onde você precisa.

LucScu
fonte