Загрузить шаблон .phtml из Observer Magento 2 - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь загрузить мои файлы .phtml в папку шаблонов в моем обозревателе, но получаю эту ошибку

Недопустимый файл шаблона: 'VENDOR_MYModule :: Category / index.phtml'в модуле: имя блока 'VENDOR_MYModule': 'category_0'

Вот структура моих файлов

app
 + code
    + VENDOR
      + MYModule
        + Block
            - Category.php
        + Controller
            + Category
               - Index.php
        + etc
            + frontend
                - routes.xml
        + Observer
            - CategoryObserver.php
        + view
            + frontend
                + layout
                    - header_category_index.xml
                + templates
                    + category
                        - index.phtml

Теперь содержимое моего Block/Category.php ниже

<?php
namespace VENDOR\MYModule\Block;

class Category extends \Magento\Framework\View\Element\Template 
{
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,       
        array $data = []
    ){
        parent::__construct($context, $data);
    }

}

Содержание моего Controller/Category/Index.php ниже

<?php
namespace VENDOR\MYModule\Controller\Category;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $_pageFactory;    

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

    public function execute()
    {       
        return $this->_pageFactory->create();
    }   
}

Содержание layout/header_category_index.xml ниже

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <referenceContainer name="content">
        <block class="VENDOR\MYModule\Block\Category" name="category_items" template="VENDOR_MYModule::category/index.phtml" />
    </referenceContainer>
</page>

Содержание моего .phtml простопростой <h1>Hello world</h1>.Теперь в моем Observer я пытаюсь загрузить этот .phtml файл, но я не могу загрузить его и получаю сообщение об ошибке.Содержание моего Обозревателя Observer\CategoryObserver ниже

public function execute(\Magento\Framework\Event\Observer $observer)
{           
    $layout = $this->_layout->create();
    $block = $layout->createBlock('VENDOR\MYModule\Block\Category')->setTemplate('VENDOR_MYModule::Category/index.phtml')->toHtml();        

    $this->_logger->debug("[DEBUG]::" , [$block]);
}

Вот содержимое моего events.xml

<?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_category_save_after">
        <observer name="category-edit" instance="VENDOR\MYModule\Observer\CategoryObserver" />
    </event>   
</config>

Но я получаю сообщение об ошибке, как упомянуто выше.Любая идея о том, как загрузить этот файл .phtml для наблюдателя?Я планирую записать содержимое этого файла .phtml в файл .txt.Но я не могу продолжить, так как я попытался вывести его, но я все еще получаю сообщение об ошибке

ОБНОВЛЕНИЕ:

Попробовал мой код с помощью контроллера Frontend / доступа к действию иблок успешно загружен.Теперь я думаю, что есть другой способ или реализация при получении .phtml в части администратора или в Observer.Также обратите внимание, что наблюдатель срабатывает, когда я пытаюсь отредактировать / сохранить каталог-> категорию.

1 Ответ

0 голосов
/ 26 февраля 2019

Не могли бы вы проверить, что вы вызываете следующий класс как $ layout в вашем наблюдателе:

\ Magento \ Framework \ View \ LayoutFactory $ layoutFactory

Дополнительно, вам нужно установить заголовок и тело ответа вместо возврата html.

protected $_layoutFactory;

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

public function execute(\Magento\Framework\Event\Observer $observer)
{           
    $layout = $this->_layoutFactory->create();
    $block = $layout->createBlock('VENDOR\MYModule\Block\Category')->setTemplate('VENDOR_MYModule::Category/index.phtml')->toHtml();

    $response = $observer->getEvent()->getData('response');
    $response->setHeader('Content-Type','text/html')->setBody($block->toHtml());
    return;
}

Надеюсь, это поможет вам!

...