Cómo instanciar un bloque en magento2


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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.