Come creare un'istanza di un blocco in magento2


Risposte:


20

AGGIORNATO: RISPOSTA SI RIFERISCE A MAGENTO 2 ALPHA


Vorrei che fosse così facile.
Dipende da dove vuoi istanziarlo.
Se vuoi creare un'istanza dall'interno di un altro blocco, fallo in questo modo:

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

Dall'interno di un controller, procedere come segue:

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

Dall'interno di un modello:

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

ma qui c'è un problema.
devi creare un membro protetto sul modello chiamato _blockFactorye iniettare un'istanza di \Magento\Framework\View\Element\BlockFactorynel costruttore e assegnarlo a quel membro var.

Qualcosa come questo:

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

Per creare un'istanza di un blocco dall'interno di un helper funziona come per il modello


più semplice è, meglio è
Matoeil,

@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); usa in magento 1 per magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); questo dà un errore come questo Errore fatale: chiamata a una funzione membro toHtml () su un non oggetto come posso ottenere a HTML ()?
ND17,

se si utilizza un controller, non è necessario iniettare nulla per _view. Dovrebbe essere disponibile per impostazione predefinita, anche se penso che ora sia deprecato. Ho scritto questa risposta 1,5 anni fa
Marius

1
@SachinS. Non dovresti più usarlo. _viewè deprecato ora nei controller e presto scomparirà,
Marius

1
Posso chiamare usando un oggetto pagefactory come questo? $ viewPanelPageFactory = $ this-> resultPageFactory-> creare (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam,

13

Per creare un'istanza di un blocco devi usare la \Magento\Framework\View\LayoutInterfaceclasse e il suo createBlock()metodo.

Con una classe helper potresti farlo con questo codice:

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;

     }

}

Quindi chiama $helper->getBlock()da dove ti serve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.