Cómo instanciar un bloque en magento2

10

¿Hay una manera simple como en magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
fuente
posible duplicado de cómo instanciar un modelo en magento2?
Rajeev K Tomy
44
Un bloque y un modelo son dos cosas diferentes. Esto no es un duplicado.
pspahn
Los modelos y bloques de Rajeev K Tom son totalmente diferentes
theSeeker el

Respuestas:

20

ACTUALIZADO: LA RESPUESTA SE REFIERE AL MAGENTO 2 ALFA


Desearía que fuera así de fácil.
Depende de dónde quieras instanciarlo.
Si desea crear una instancia desde otro bloque, hágalo así:

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

Desde el interior de un controlador, haga esto:

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

Desde el interior de un modelo:

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

Pero aquí hay una trampa.
debe crear un miembro protegido en el modelo llamado _blockFactorye inyectar una instancia de \Magento\Framework\View\Element\BlockFactoryen el constructor y asignarlo a ese miembro var.

Algo como esto:

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

Para crear instancias de un bloque desde el interior de un asistente, funciona igual que para el modelo

Marius
fuente
cuanto más simple mejor
Matoeil
@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); usar en magento 1 para magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); esto da un error como este Error fatal: Llamar a una función miembro toHtml () en un no objeto ¿cómo puedo obtener toHtml ()?
ND17
Si está en un controlador, no necesita inyectar nada _view. Debería estar disponible de forma predeterminada, aunque creo que ahora está en desuso. Escribí esta respuesta hace 1.5 años
Marius
1
@SachinS. No deberías usar eso nunca más. _viewahora está en desuso en los controladores y pronto desaparecerá,
Marius
1
¿Puedo llamar usando un objeto pagefactory como este? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam
13

Para crear una instancia de un bloque, debe usar la \Magento\Framework\View\LayoutInterfaceclase y su createBlock()método.

Con una clase auxiliar puedes hacerlo con 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;

     }

}

Luego llame $helper->getBlock()desde donde lo necesite.

LucScu
fuente