magento2でブロックをインスタンス化する方法


回答:


20

旧式:MAGENTO 2 ALPHAへの回答


そんなに簡単だったらよかったのに。
それをどこからインスタンス化するかによって異なります。
他のブロック内からインスタンスを作成する場合は、次のようにします。

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

コントローラ内からこれを行います:

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

モデル内から:

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

しかし、ここには落とし穴があります。
呼び出されたモデルに保護されたメンバーを作成し、コンストラクターにの_blockFactoryインスタンスを挿入して、\Magento\Framework\View\Element\BlockFactoryそのメンバーvarに割り当てる必要があります。

このようなもの:

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

ヘルパー内からブロックをインスタンス化する場合、モデルと同じように機能します


シンプルな方が良い
Matoeil 2014

@Marius $ toplink = $ this-> getLayout()-> getBlock( 'top.links')-> toHtml(); magento 1でmagento 2に使用$ this-> _ view-> getLayout()-> getBlock(Full \ Block \ Class \ Name \ Here ')-> toHtml(); これはこのような致命的なエラーのようなエラーを出します:非オブジェクトでメンバー関数toHtml()を呼び出すにはどうすればtoHtml()を取得できますか?
ND17

コントローラを使用している場合は、に何も注入する必要はありません_view。デフォルトでは利用できるはずですが、現在は非推奨になっていると思います。私は1.5年前にこの回答を書きました
マリウス

1
@SachinS。あなたはもうそれを使うべきではありません。_viewコントローラでは非推奨になり、間もなく廃止されます
マリウス

1
このようなpagefactoryオブジェクトを使用して呼び出すことはできますか?$ viewPanelPageFactory = $ this-> resultPageFactory-> create(); $ viewPanel = $ viewPanelPageFactory-> getLayout()-> getBlock( 'catalog.leftnav')-> toHtml();
Sushivam

13

ブロックをインスタンス化するには、\Magento\Framework\View\LayoutInterfaceクラスとそのcreateBlock()メソッドを使用する必要があります 。

ヘルパークラスを使用すると、次のコードでそれを行うことができます。

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;

     }

}

次に$helper->getBlock()、必要な場所から呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.