Comment instancier un bloc dans magento2

10

Existe-t-il un moyen simple comme dans magento1:

 $crumbs = Mage::app()->getLayout->getBlock('breadcrumbs');
Matoeil
la source
doublon possible de la façon d'instancier un modèle dans magento2?
Rajeev K Tomy
4
Un bloc et un modèle sont deux choses différentes. Ce n'est pas un doublon.
pspahn
Les modèles et blocs de Rajeev K Tom sont totalement différents
theSeeker

Réponses:

20

VIEILLI: LA RÉPONSE SE RÉFÈRE À MAGENTO 2 ALPHA


Je souhaite que ce soit aussi simple que cela.
Cela dépend d'où vous voulez l'instancier.
Si vous souhaitez créer une instance à l'intérieur d'un autre bloc, faites-le comme ceci:

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

De l'intérieur d'un contrôleur, procédez comme suit:

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

De l'intérieur d'un modèle:

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

mais ici, il y a un hic.
vous devez créer un membre protégé sur le modèle appelé _blockFactoryet injecter une instance de \Magento\Framework\View\Element\BlockFactorydans le constructeur et l'affecter à ce membre var.

Quelque chose comme ça:

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

Pour instancier un bloc depuis l'intérieur d'un assistant, cela fonctionne de la même manière que pour le modèle

Marius
la source
le plus simple sera le mieux
Matoeil
@Marius $ toplink = $ this-> getLayout () -> getBlock ('top.links') -> toHtml (); utiliser dans magento 1 pour magento 2 $ this -> _ view-> getLayout () -> getBlock (Full \ Block \ Class \ Name \ Here ') -> toHtml (); cela donne une erreur comme cette erreur fatale: Appel à une fonction membre toHtml () sur un non-objet, comment puis-je obtenir toHtml ()?
ND17
si vous êtes dans un contrôleur, vous n'avez rien à injecter _view. Il devrait être disponible par défaut, même si je pense qu'il est désormais obsolète. J'ai écrit cette réponse il y a 1,5 ans
Marius
1
@SachinS. Vous ne devriez plus utiliser cela. _viewest désormais obsolète dans les contrôleurs et il disparaîtra bientôt,
Marius
1
Puis-je appeler en utilisant un objet pagefactory comme celui-ci? $ viewPanelPageFactory = $ this-> resultPageFactory-> create (); $ viewPanel = $ viewPanelPageFactory-> getLayout () -> getBlock ('catalog.leftnav') -> toHtml ();
Sushivam
13

Pour instancier un bloc, vous devez utiliser la \Magento\Framework\View\LayoutInterfaceclasse et sa createBlock()méthode.

Avec une classe d'assistance, vous pouvez le faire avec ce code:

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;

     }

}

Appelez ensuite $helper->getBlock()d'où vous avez besoin.

LucScu
la source