在这篇博客中,我们将看到如何向模块添加布局文件和块。在之前的博客中,我们创建了一个Magease_Hello模块,这次使用相同的模块,我们将再次显示“hello World”,但这次使用的布局/块具有适当的页面结构。
步骤1
在之前的World.php操作文件中,我们只显示了“Hello World”,我们将删除它并使用magento的布局系统。
World.php操作方法的新代码是
<?php namespace Magease\Hello\Controller\Hello; class World extends \Magento\Framework\App\Action\Action { protected $resultPageFactory; public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory) { $this->resultPageFactory = $resultPageFactory; return parent::__construct($context); } public function execute() { return $this->resultPageFactory->create(); } }
这里,我们将“PageFactory”注入控制器的构造函数中,并将其进一步用于初始化execute()中的布局。
依赖注入是magento2 的主要变化之一,并将在以后详细讨论。现在,直接使用这个代码
Layout
现在我们将为控制方法设置布局文件
在magento2中,模块的所有布局文件都位于模块的“view/fro.d/.”文件夹中,对于每个路由,我们需要创建不同的布局文件。我们现在的情况下,文件是
Magease/Hello/view/frontend/layout/magease_hello_world.xml
内容是
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<referenceContainer name="content">
<block template="content.phtml" class="Magease\Hello\Block\Main" name="magease_test"/>
</referenceContainer>
</page>
magento2还支持default.xml布局文件,该文件将为该模块的所有操作加载
Blocks
现在我们已经设置了布局文件,接下来我们需要设置块文件。如我们的布局中所定义,我们的块文件将位于
Magease\Hello\Block\Main
块文件的内容是
<?php
namespace Magease\Hello\Block; class Main extends \Magento\Framework\View\Element\Template
{ public function __construct( \Magento\Framework\View\Element\Template\Context $context ) { parent::__construct($context); } protected function _prepareLayout() { } }
这是一个简单的,没有方法的空的块
Template
现在我们的块文件已设置,接下来我们需要设置模板文件
模块A的模板位于“view/frontend/templates”文件夹中,所以我们需要创建文件、
Magease/Hello/view/frontend/templates/content.phtml
我们将添加代码
<h1><?php echo __('Hello World'); ?></h1>
现在,当您打开url/magease/hello/world时,您将再次看到“hello world”,但是具有完整的页面布局(header、footer等)
注意:__()是magento2的i18n(多语言)功能。我们通常都使用这个方法,而不是直接输出字符串
Template/Block传递数据
将数据从块传递到模板,使用非常频繁
这很简单,将块代码更新为
<?php
namespace Magease\Hello\Block;
class Main extends \Magento\Framework\View\Element\Template
{
public function __construct(
\Magento\Framework\View\Element\Template\Context $context
)
{
parent::__construct($context);
}
protected function _prepareLayout()
{
$this->setText('Testing');
}
}
如你所见,我们已经做到了
$this->setText()
在我们的块文件中,要在我们的模板文件中访问,我们需要
<?php echo $block->getText(); ?>
这跟magento1有很大的不同,在magento1中,我们在模板文件中使用($this)变量,但是在magento2 中,我们使用$block。
正确使用Block/Template
块文件应该包含所需的所有视图逻辑,它不应该包含任何类型的HTML或CSS,块文件应该具有所有的应用程序视图逻辑。
另一方面,模板文件应该主要包含所有HTML脚本,它应该包含尽可能少的视图逻辑,这是一个非常重要的实践。