So instanziieren Sie einen Block in magento2

10

Gibt es einen einfachen Weg wie in magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
quelle
Mögliches Duplikat, wie ein Modell in magento2 instanziiert wird?
Rajeev K Tomy
4
Ein Block und ein Modell sind zwei verschiedene Dinge. Dies ist kein Duplikat.
pspahn
Rajeev K Tom Modelle und Blöcke sind völlig anders
theSeeker

Antworten:

20

Veraltet: Antwort bezieht sich auf MAGENTO 2 ALPHA


Ich wünschte es wäre so leicht.
Dies hängt davon ab, von wo aus Sie es instanziieren möchten.
Wenn Sie eine Instanz aus einem anderen Block heraus erstellen möchten, gehen Sie folgendermaßen vor:

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

Gehen Sie in einem Controller folgendermaßen vor:

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

Aus dem Inneren eines Modells:

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

aber hier gibt es einen Haken.
Sie müssen ein geschütztes Element für das aufgerufene Modell erstellen _blockFactory, eine Instanz von \Magento\Framework\View\Element\BlockFactoryin den Konstruktor einfügen und es diesem Element var zuweisen.

Etwas wie das:

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

Das Instanziieren eines Blocks aus einem Helfer heraus funktioniert genauso wie beim Modell

Marius
quelle
Je
@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); Verwenden Sie in Magento 1 für Magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); Dies führt zu einem Fehler wie diesem. Schwerwiegender Fehler: Aufruf einer Mitgliedsfunktion toHtml () für ein Nicht-Objekt. Wie kann ich toHtml () erhalten?
ND17
Wenn Sie sich in einem Controller befinden, müssen Sie nichts injizieren _view. Es sollte standardmäßig verfügbar sein, obwohl ich denke, dass es jetzt veraltet ist. Ich habe diese Antwort vor 1,5 Jahren geschrieben
Marius
1
@SachinS. Das solltest du nicht mehr benutzen. _viewist jetzt in Controllern veraltet und wird bald verschwinden,
Marius
1
Kann ich mit einem solchen pagefactory-Objekt aufrufen? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam
13

Um einen Block zu instanziieren, müssen Sie die \Magento\Framework\View\LayoutInterfaceKlasse und ihre createBlock()Methode verwenden.

Mit einer Hilfsklasse können Sie dies mit diesem Code tun:

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;

     }

}

Dann rufen Sie $helper->getBlock()an, wo Sie brauchen.

LucScu
quelle