在这篇博客中,我们将看到如何向模块添加布局文件和块。在之前的博客中,我们创建了一个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脚本,它应该包含尽可能少的视图逻辑,这是一个非常重要的实践。