So instanziieren Sie einen Block in magento2


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.