Controller Magento2でブロックを呼び出すにはどうすればよいですか?


8

欲しいですgetBlock Adb/Block/Index in controller Adb/Controller/Category/View。それでどうやって?

編集する

コントローラ内。

namespace Addon\Faq\Controller\Category;


class View extends \Addon\Faq\Controller\Category
{
    /**
     * @var \Magento\Framework\Controller\Result\ForwardFactory
     */
    protected $_coreRegistry = null;
    /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $resultPageFactory ;

    /**
     * @param \Magento\Backend\App\Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context, 
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Framework\Registry $registry

    ) {
        $this->resultPageFactory  = $resultPageFactory;
        $this->_coreRegistry = $registry;
        parent::__construct($context);
    }

    /**
     * Product list page
     *
     * @return \Magento\Backend\Model\View\Result\Page
     */
    public function execute()
    {   
        $resultPage = $this->resultPageFactory ->create();
        $blockInstance = $resultPage->getLayout()->getBlock('category.index');

    }
}

フロントエンドのレイアウト

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> 
    <body>
        <referenceContainer name="content">
            <block class="Addon\Faq\Block\Faq" name="category.index" template="Addon_Faq::view.phtml"/>               
        </referenceContainer>
    </body>
</page> 

ブロックFAQとは呼ばない


1
コントローラーでブロックを呼び出さないでください。なぜあなたはそれが必要なのですか?
KAndy、2015年

回答:


4

実行コマンドで何も返しません。コントローラに結果ページを返す

    $resultPage = $this->resultPageFactory->create();

    return $resultPage;

XML名はfaq_category_view.xmlである必要があります。


20

ブロックをインスタンス化したい場合は、コンストラクタにインスタンスを挿入するために追加する必要があります \Magento\Framework\View\LayoutFactory

...
protected $layoutFactory;
...
public function __construct(
   ...
   \Magento\Framework\View\LayoutFactory $layoutFactory,
   ...
) {
   ...
   $this->layoutFactory = $layoutFactory;
   ...
}

次に、次のようにブロックをインスタンス化できます。

$this->layoutFactory->create()->createBlock('Block\Class\Here');

レイアウトで定義されたブロックにアクセスする場合は、コンストラクタとインスタンスに挿入する必要があります \Magento\Framework\View\Result\PageFactory

...
protected $resultPageFactory;
...
public function __construct(
   ...
   \Magento\Framework\View\Result\PageFactory $resultPageFactory,
   ...
) {
   ...
   $this->resultPageFactory = $resultPageFactory;
   ...
}

その後、次のようにブロックにアクセスできます。

$resultPage = $this->resultPageFactory->create();
$blockInstance = $resultPage->getLayout()->getBlock('block.name.here');

これはまだブロックを呼び出す推奨方法ですか?注射できませんか?:)
treyBake

9
  1. ブロックを作成します。

     <?php
        namespace Training\Test\Block;
        class Test extends \Magento\Framework\View\Element\AbstractBlock
        {
           protected function _toHtml() {
             return "<b>Hello world from block!</b>";
           }
        }
  2. アクションクラスを作成します。

    <?php
    namespace Training\Test\Controller\Block;
    class Index extends \Magento\Framework\App\Action\Action
       {
       public function execute() {
         $layout = $this->_view->getLayout();
         $block = $layout->createBlock('Training\Test\Block\Test');
         $this->getResponse()->appendBody($block->toHtml());
       }
    }

2
$this->_viewコントローラでは使用しないでください。読むです @deprecatedresultPage->getLayout()他の答えが示唆するように代わりに使用してください。
7ochem 2016年

5

コアコードを見てください:

ステップ1

https://github.com/magento/magento2/blob/02e0378c33054acb0cdb8d731d1e2b2c2069bc1b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php#L26-L34

public function __construct(
    \Magento\Backend\App\Action\Context $context,
    \Magento\Framework\View\Result\PageFactory $resultPageFactory,
) {
    parent::__construct($context);
    $this->resultPageFactory = $resultPageFactory;
}

ステップ2

https://github.com/magento/magento2/blob/02e0378c33054acb0cdb8d731d1e2b2c2069bc1b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php#L69-L70

/** @var \Magento\Backend\Model\View\Result\Page $resultPage */
$resultPage = $this->resultPageFactory->create();

ステップ3

https://github.com/magento/magento2/blob/02e0378c33054acb0cdb8d731d1e2b2c2069bc1b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php#L119

$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.