Стабильная версия Magento2 - Макет рендеринга не работает в пользовательском модуле
Мой модуль отлично работал в бета-версии Magento2. В стабильной версии модуль отображается в списке, а серверная часть пользовательского модуля работает нормально. Однако интерфейсные страницы моего модуля не работают. Вот мой код.
Регулятор индекса
namespace Companyname\Modulename\Controller\Index;
use Magento\Framework\App\Action\Action;
class Index extends Action {
public function execute() {
$this->_view->loadLayout();
$this->_view->renderLayout();
}
}
Планировка - /app/code/Companyname/Modulename/view/frontend/layout/modulename_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Companyname\Modulename\Block\Modulename" name="modulename" template="Companyname_Modulename::modulename.phtml" />
</referenceContainer>
</body>
</page>
Файл блокировки
namespace Companyname\Modulename\Block;
class Modulename extends \Magento\Framework\View\Element\Template {
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
array $data = array()
) {
parent::__construct($context, $data);
}
}
Когда я отлаживаю, он не входит конструкция блока. Я предполагаю, что он не в состоянии найти блок. Файл phtml просто печатает echo "hello world";
, но на интерфейсе ничего не отображается. Есть идеи относительно того, что я делаю не так?
3 answers
Я думаю, что проблема в вашем файле modulename_index_index.xml
, вы должны упомянуть макет страницы, такой как layout="1column"
.
Вы можете изменить макет страницы
- 1 столбец
- 2колонны-слева
- 2колонны-справа
- 3колонны
Вам необходимо указать макет страницы.
Поэтому добавьте этот layout="2columns-left"
в узел <page>
в hello_index_index.xml
.
Вы также можете использовать 1column
, 2columns-right
, 3columns
или empty
.
Пожалуйста, убедитесь, что ваш контроллер выполнен, если не проверять маршруты.
Кроме того, макетом не предполагается управлять напрямую с помощью объекта view
в контроллере (как это было в Magento 1), вместо этого следует создать объект страницы результатов.
Пожалуйста, подумайте о том, чтобы переписать свой контроллер следующим образом:
<?php
namespace CompanyName\ModuleName\Controller\Index;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Action\Context;
class Index extends \Magento\Framework\App\Action\Action
{
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* Some action.
*
* @return \Magento\Framework\View\Result\Page
*/
public function execute()
{
/** @var \Magento\Framework\View\Result\Page $resultPage */
$resultPage = $this->resultPageFactory->create();
return $resultPage;
}
}