Jak utworzyć instancję bloku w magento2

10

Czy istnieje prosty sposób jak w Magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
źródło
możliwy duplikat tego, jak zaimplementować model w magento2?
Rajeev K Tomy
4
Blok i model to dwie różne rzeczy. To nie jest duplikat.
pspahn
Modele i bloki Rajeev K Tom są całkowicie różne
poszukiwacz

Odpowiedzi:

20

NIEAKTUALIZOWANE: ODPOWIEDŹ ODNOSI SIĘ DO MAGENTO 2 ALPHA


Chciałbym, żeby to było takie proste.
To zależy od tego, skąd chcesz go utworzyć.
Jeśli chcesz utworzyć instancję z innego bloku, zrób to tak:

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

Z poziomu kontrolera wykonaj następujące czynności:

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

Z wnętrza modelu:

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

ale tutaj jest haczyk.
musisz utworzyć chroniony element członkowski w modelu o nazwie _blockFactoryi wstrzyknąć wystąpienie \Magento\Framework\View\Element\BlockFactoryw konstruktorze i przypisać go do tego elementu var.

Coś takiego:

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

W przypadku tworzenia bloku z poziomu pomocnika działa tak samo, jak w przypadku modelu

Marius
źródło
im prościej, tym lepiej
Matoeil
@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); użyj w magento 1 dla magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); to daje błąd taki jak ten Błąd krytyczny: Wywołanie funkcji członkowskiej toHtml () na obiekcie niebędącym obiektem, jak mogę dostać się doHtml ()?
ND17
jeśli jesteś kontrolerem, nie musisz niczego zastrzykiwać _view. Powinien być domyślnie dostępny, choć myślę, że teraz jest przestarzały. Napisałem tę odpowiedź 1,5 roku temu
Marius
1
@SachinS. Nie powinieneś już tego używać. _viewjest teraz przestarzałe w kontrolerach i wkrótce zniknie,
Marius
1
Czy mogę wywoływać za pomocą takiego obiektu pagefactory? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam
13

Aby utworzyć instancję bloku, musisz użyć \Magento\Framework\View\LayoutInterfaceklasy i jej createBlock()metody.

Z klasą pomocnika możesz to zrobić za pomocą tego kodu:

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;

     }

}

Następnie zadzwoń $helper->getBlock()z miejsca, w którym potrzebujesz.

LucScu
źródło