Wie nennt man Blöcke in Controller Magento2?

8

Ich will getBlock Adb/Block/Index in controller Adb/Controller/Category/View. Wie geht das?

Bearbeiten

in der Steuerung.

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');

    }
}

Layout im Frontend

<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> 

Es heißt nicht Block Faq

Xanka
quelle
1
Sie sollten keine Blöcke im Controller aufrufen. Wieso brauchst du es?
KAndy

Antworten:

4

Sie geben nichts in Ihrem Ausführungsbefehl zurück. Ergebnisseite in Ihrem Controller zurückgeben

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

    return $resultPage;

Ihr XML-Name sollte faq_category_view.xml sein.

Shaheer Ali
quelle
20

Wenn Sie einen Block instanziieren möchten, müssen Sie eine Instanz von hinzufügen, um sie in den Konstruktor einzufügen \Magento\Framework\View\LayoutFactory

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

Dann können Sie einen Block wie folgt instanziieren:

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

Wenn Sie auf einen im Layout definierten Block zugreifen möchten, müssen Sie den Konstruktor und die Instanz von einfügen \Magento\Framework\View\Result\PageFactory

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

Dann können Sie wie folgt auf den Block zugreifen:

$resultPage = $this->resultPageFactory->create();
$blockInstance = $resultPage->getLayout()->getBlock('block.name.here');
Marius
quelle
Ist dies immer noch die empfohlene Methode zum Aufrufen des Blocks? Kann ich nicht spritzen? :)
treyBake
9
  1. Erstellen Sie den Block:

     <?php
        namespace Training\Test\Block;
        class Test extends \Magento\Framework\View\Element\AbstractBlock
        {
           protected function _toHtml() {
             return "<b>Hello world from block!</b>";
           }
        }
  2. Erstellen Sie eine Aktionsklasse:

    <?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());
       }
    }
Rakesh Jesadiya
quelle
2
Nicht $this->_viewin Controllern verwenden. Ich habe es gelesen @deprecated. Verwenden Sie resultPage->getLayout()stattdessen wie in der anderen Antwort vorgeschlagen.
7ochem
5

Siehe den Kerncode:

Schritt 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;
}

Schritt 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();

Schritt 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');
Mage2.PRO
quelle