4.Magento 2 创建视图:区块、布局、模板

Magento 2 模块开发基础部分 - 目录

本章了解 Magento 2 的视图(view)包含区块(Block)、布局(Layouts)、模板(Templates)。视图是用来输出页面显示的,在Magento 2中视图由三部分组成区块、布局、模板。现在改造我们的Hello World模块使用视图实现之前的功能以便了解视图的工作机制。

创建视图步骤:

  • 1 创建控制器
  • 2 创建 .xml 布局文件
  • 3 创建区块
  • 4 创建 .phtml 模板文件

第一步 创建控制器

首先建一个控制器来调用 .xml 布局文件

文件: app/code/Aqrun/HelloWorld/Controller/Index/Display.php

<?php
namespace Aqrun\HelloWorld\Controller\Index;

class Display extends \Mangento\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 方法中实例化来渲染视图。

第二步 创建布局文件 .xml

在 Magento 2 模块中布局是视图的重要组成部分。布局文件是定义了页面结构的 XML 文件,文件位置 {module_root}/view/{area}/layout 。area 决定布局文件的使用位置,值可以是 frontendadminhtml

有一个特殊的布局文件所有页面会默认使用 default.xml 。其它布局文件命名格式是 {router_id}_{controller_name}_{action_name}.xml

渲染页面时 Magento 会检测对应布局文件,然后加载区块和模板。这里我们定义如下文件:

文件:app/code/Aqrun/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="Aqrun\HelloWorld\Block\Display" name="helloworld_display" template="Aqrun_HelloWorld::sayhello.phtml" />
    </referenceContainer>
</page>

上面代码中为页面定义了区块和模板:

  • 区块类: Aqrun\HelloWorld\block\Display
  • 模板文件: Aqrun_HelloWorld::sayHello.phtml
  • name: 这个属性是必须的,作为区块引用的唯一标识

第三步 创建区块

区块文件包含视图逻辑需要的一切,但不包含任何 HTML 或 CSS。

文件: app/code/Aqrun/HelloWorld/Block/Display.php

代码:

namespace Aqrun\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\Framework\View\Element\Template。这个区块里我们定义了 sayHello() 方法,会在模板文件中调用。

第四步 创建模板文件

创建名为 sayhello.phtml 的模板文件: app/code/Aqrun/HelloWorld/view/frontend/templates/sayhello.phtml

代码:

<?php
/**
 * @var \Aqrun\HelloWorld\Block\Display $block
 */

echo $block->sayHello();

在布局文件中,我们使用 Aqrun_HelloWorld::sayhello.phtml 指定模板文件,系统根据名称会到 Aqrun_HelloWorld 模块的模板文件夹查找名为 sayhello.phtml 的文件。模板文件位置为:app/code/{vendor_name}/{module_name}/view/frontend/templates/

在模板文件可以使用 $block 变量调用区块对象,如上代码我们可以调用区块的 sayHello() 方法。然后清空缓存访问 http://mag.dev/helloworld/index/display 就可以查看结果了。


在上一节创建模型中,在控制器调用了 PostFactory 模型。现在可以试着使用区块和模板显示所有数据。

编辑文件: app/code/Aqrun/HelloWorld/Block/Display.php

代码:

namespace Aqrun\HelloWorld\Block;

class Display extends \Magento\Framework\View\Element\Template
{
    protected $_postFactory;
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Aqrun\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() 方法来获取 aqrun_helloworld_post 数据表的所有数据,下面在模板中会调用这个方法。

编辑文件 app/code/Aqrun/HelloWorld/view/frontend/templates/sayhello.phtml

代码:

<?php
/**
 * @var \Aqrun\HelloWorld\Blcok\Display $block
 */
?>
<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>
<div><?=$block->sayHello()?></div>
<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){?>
    <tr>
        <td><?=$post->getPostId()?></td>
        <td><?=$post->getName()?></td>
        <td><?=$post->getPostContent()?></td>
    </tr>
    <?php }?>
</table>

修改后执行 php bin/magento cache:clean 刷新浏览器如下显示:

4-sayhello-page.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容