layout文件名为控制器路径
layout
class为block控制器对象
name:它是必需的属性,用于将块标识为引用
template:为模板文件地址
首先,我们将创建一个控制器来调用布局文件 .xml
文件:app/code/Mageplaza/HelloWorld/Controller/Index/Display.php
<?php namespace Mageplaza\HelloWorld\Controller\Index; class Display 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(); }}
我们必须声明 PageFactory 并在 execute 方法中创建它来呈现视图。
布局是Magento 2 模块中视图层的主要路径。布局文件是一个 XML 文件,它将定义页面结构并将位于{module_root}/view/{area}/layout/
文件夹中。Area 路径可以是frontend或adminhtml,它们定义了布局的应用位置。
有一个特殊的布局文件名default.xml
,将应用于其区域内的所有页面。另外,布局文件的名称格式为:{router_id}_{controller_name}_{action_name}.xml
.
您可以在这个 Magento主题中详细了解布局,以及布局结构的说明。
在渲染页面时,Magento 会检查布局文件以找到页面的句柄,然后加载 Block 和 Template。我们将为这个模块创建一个布局句柄文件:
文件:app/code/Mageplaza/HelloWorld/view/frontend/layout/helloworld_index_display.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="Mageplaza\HelloWorld\Block\Display" name="helloworld_display" template="Mageplaza_HelloWorld::sayhello.phtml" /> </referenceContainer></page>
在这个文件中,我们定义了这个页面的块和模板:
块类:Mageplaza\HelloWorld\Block\Display
模板文件:Mageplaza_HelloWorld::sayhello.phtml
name:它是必需的属性,用于将块标识为引用
Block 文件应该包含所有需要的视图逻辑,它不应该包含任何类型的 html 或 css。块文件应该具有所有应用程序视图逻辑。
创建一个文件:
app/code/Mageplaza/HelloWorld/Block/Display.php
内容将是:
<?phpnamespace Mageplaza\HelloWorld\Block;class Display extends \Magento\Framework\View\Element\Template{ public function __construct(\Magento\Framework\View\Element\Template\Context $context) { parent::__construct($context); } public function sayHello() { return __('Hello World'); }}
Magento 2 中的每个块都必须从Magento\Framework\View\Element\Template
. 在这个块中,我们将定义一个方法 sayHello() 来显示单词“Hello World”。我们将在模板文件中使用它。
创建模板文件调用sayhello.phtml
app/code/Mageplaza/HelloWorld/view/frontend/templates/sayhello.phtml
插入以下代码:
<?php/** * @var \Mageplaza\HelloWorld\Block\Display $block */echo $block->sayHello();
在布局文件中,我们通过Mageplaza_HelloWorld::sayhello.phtml
. 这意味着 Magento 将在模块 Mageplaza_HelloWorld 的模板文件夹中找到文件名sayhello.phtml。模块的模板文件夹是app/code/{vendor_name}/{module_name}/view/frontend/templates/
.
在模板文件中,我们可以将变量 $block 用于块对象。sayHello()
如您所见,我们在 Block 中调用该方法。已完成,请再次访问此页面(http://
在之前的Models (CRUD)中,我们在控制器中调用了 postFactory 模型。现在,我们尝试显示表使用块和模板的所有数据。
我们编辑了文件app/code/Mageplaza/HelloWorld/Block/Display.php
内容将是:
<?phpnamespace Mageplaza\HelloWorld\Block;class Display extends \Magento\Framework\View\Element\Template{ protected $_postFactory; public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Mageplaza\HelloWorld\Model\PostFactory $postFactory ) { $this->_postFactory = $postFactory; parent::__construct($context); } public function sayHello() { return __('Hello World'); } public function getPostCollection(){ $post = $this->_postFactory->create(); return $post->getCollection(); }}
在块文件中,我们创建了一个getPostCollection
获取mageplaza_helloworld_post
表上所有数据的方法,我们将在模板中调用它。
我们编辑了文件app/code/Mageplaza/HelloWorld/view/frontend/templates/sayhello.phtml
内容将是:
<?php/** * @var \Mageplaza\HelloWorld\Block\Display $block */echo $block->sayHello();?><style>table { font-family: arial, sans-serif; border-collapse: collapse; width: 100%; margin-top: 30px;}td, th { border: 1px solid #dddddd; text-align: left; padding: 8px; }tr:nth-child(even) { background-color: #dddddd; }.post-id{width:2%} .post-name{width:30%}</style><table> <tr> <th class="post-id">Id</th> <th class="post-name">Name</th> <th>Content</th> </tr> <?php foreach ($block->getPostCollection() as $key=>$post){ echo '<tr> <td>'.$post->getPostId().'</td> <td>'.$post->getName().'</td> <td>'.$post->getPostContent().'</td> </tr>'; } ?></table></body></html>
完成后,请运行php bin/magento cache:clean
并检查结果。它会像这样显示