Blogger Information
Blog 71
fans 1
comment 1
visits 86856
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
529-ThinkPHP5.1之视图模版
小威的博客
Original
2319 people have browsed it
  • 模板渲染:是控制器类在继承系统控制器基类( \think\Controller )后调用 fetch 方法

fetch 模板表达式:模块@控制器/操作方法        fetch('模板表达式',[模板变量数组],[模板配置数组])

模板默认根目录是:模块/view/控制器名/模板文件名

模板文件的后缀可自定义config/template.php,默认为html

模板参数我们一般不在控制器动态配置,而是在config/template.php中统一配置

QQ截图20180530100717.png

视图文件:tp51/application/index/view/demo1~3.html

我的姓名是:<span style="color: red;font-size: 30px;">{$name}</span><br>
{$name}的年龄是:<span style="color: green;font-size: 30px;">{$age} 岁</span><br>
{$name}的工资是:<span style="color: blue;font-size: 30px;">{$salary} 元</span>
<?php
namespace app\index\controller;
use think\facade\View; //视图类静态代理:将内部方法全部看作静态进行调用
use think\Controller;

class Index extends Controller
{
	public function index()
	{
		return '<h2 style="color:red;text-align:center">测试页面:测试成功</h2>';
	}
}

1. 使用视图方法:display()不通过模板,直接渲染内容,支持HTML标签

public function demo1()
    {
        // $name = '齐天大圣';
        //直接输出变量
        // return View::display('我的姓名是:<span style="color:red">'.$name.'</span>');
    }

2. 使用fetch(),加载指定模板文件输出

public function demo1()
    {
        //直接导入View门面类进行调用
        // return View::fetch('demo1',['name'=>'孙悟空']);

        // 控制器类中有一个属性view,保存着视图类的实例对象
        // return $this->view->fetch('demo1',['name'=>'孙悟空']);

        //控制类Controler.php中对常用视图方法做了简化
        // return $this->fetch('demo1',['name'=>'孙悟空']);
    }

3. 框架也内置了一个助手函数提供大家使用view(),在任何情况下都可以使用助手函数,不依赖外部是否导入了某个类

public function demo1()
    {
        // 框架也内置了一个助手函数提供大家使用view()
        return view('demo1',['name'=>'孙悟空','age'=>5000,'salary'=>10000]);
    }

QQ截图20180530105229.png

  • 模板赋值

除了系统变量和配置参数输出无需赋值外,其他变量如果需要在模板中输出必须首先进行模板赋值操作,

否则会抛出异常,传递数据到模板输出有下面几种方式:

  • 1. 使用assign()必须要调用View类,以后我们统一使用Controller来调用

public function demo2()
    {
        // $name = '猪八戒';
        // $age = 8000;
        // $salary = 5000;
        
        $this->view->assign('name', '猪八戒');
        $this->view->assign('age', 8000);
        $this->view->assign('salary', 5000);
        
        return $this->fetch('demo2');
     }
  •  2. 传参方式: fetch()或view()

public function demo2()
    {
        return view('demo2',['name'=>'猪八戒','age'=>8000,'salary'=>5000]);
     }
  •  3. 对象方式: 就是通过Controller中的二个魔术方法来实现视图类的数据注入的

public function demo2()
    {
        $this->view->name = '猪八戒';
        $this->view->age = 8000;
        $this->view->salary = 5000;

        //如果是按默认规则创建的模板文件,则模板文件名可以省略
        return $this->view->fetch();    
    }

QQ截图20180530130709.png

  • 模板过滤与替换

tp51也之前版本相比,直接删除了模板字符串替换功能,而改为模板配置参数来实现

 config/template.php: 'tpl_replace_str' => [''=>''],
  • 不过,建议大家在控制器使用filter()直接进行过滤替换,更简洁

public function demo3()
    {
        //将模板中的猪八戒  换成:  猪悟能        
        $this->view->assign('name', '猪八戒');
        $this->view->assign('age', 8000);
        $this->view->assign('salary', 5000);

        return $this->filter(function($content) {
            return str_replace('猪八戒', '猪悟能', $content);
        })
        ->fetch();

        //替换内容每次只能替换一个属性值
        return $this->filter(function($content) {
            return str_replace('8000', '5000', $content);
        })
        ->fetch();
    }

QQ截图20180530132841.png

  • 模板布局

  • 一、全局配置,先开启模板布局功能

1. config/template.php

2.'layout_on' => true,          'layout_name' = 'layout',      'layout_item'=>'{__REP__}'

QQ截图2018053016063444.png

  • 二、模板标签的方式

1. 不需要在config/template.php中开启和配置布局模板

2. 直接在需要使用布局模板的模板文件顶部指定布局模板文件即可: {layout name="布局模板名" /}

3. 关闭布局:{_ _NOLAYOUT_ _}

QQ截图20180530162557.png

  •  三、在控制器动态配置

 1.不需要在模板配置文件做任何配置,也不需要在当前模板中添加任何标签

 2.当然,布局模板,还是要事先制作好的

 3.直接调用:$this->view-engine->layout(true)开启

控制器文件:tp51/application/index/controller/index.php

  • 动态开启模板布局,一切使用默认的布局参数:layout_name=layout,{__CONTENT__}

    public function demo4()
    {
        //动态开启模板布局,一切使用默认的布局参数:layout_name=layout,{__替换符__}
        //$this->view->engine->layout(true);
        
        $this->view->engine->layout('layout','{__REPLACE__}');
        return $this->view->fetch();
        
        简化链式调用 1
        return $this->view //调用视图对象
               ->engine    //模板引擎对象
               ->layout(true)  //开启模板布局
               ->fetch('index/demo4');  //渲染模板
       
       简化链式调用 2
       return $this->view
                    ->engine
                    ->layout('layout','{__REPLACE__}')
                    ->fetch('index/demo4');       
       
       //关闭模板布局
      // return $this->view->engine->layout(false)->fetch('index/demo4'); 
    }
  • 自定义模板布局参数,layout可以是任意的布局文件,被替换的内容标识符也可以自定义

头部文件:tp51/application/index/view/hebox/header.html

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<style type="text/css">
		.muin {
			width: 100%;
			height: 50px;
			background:#E09600;
			line-height: 50px;
		}
		.muin ul {
			width: 800px;
			margin: auto;
		}
		.muin ul li{
			list-style: none;
			float: left;
			text-align: center;
			margin-right: 50px;
		}
		.muin a{
			text-decoration: none;
			color: #fff;
			font-size:18px;
			font-weight: bold;
		}
	</style>
</head>
<body>
	<div class="muin">
		<ul>
			<li><a href="">首页</a></li>
			<li><a href="">日记</a></li>
			<li><a href="">相册</a></li>
			<li><a href="">说说</a></li>
			<li><a href="">留言</a></li>
			<li><a href="">应用</a></li>
			<li><a href="">游戏</a></li>
			<li><a href="">动态</a></li>
			<li><a href="">资料</a></li>
		</ul>
	</div>
</body>
</html>
运行实例 »

点击 "运行实例" 按钮查看在线实例

底部文件:tp51/application/index/view/hebox/footer.html

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<style type="text/css">
	    .footer{
	    	width: 100%;
	    	height: 80px;
	    	background: #F8DB4F;
	    	padding: 20px 0;
	    }
		.link {
			text-align: center;
		}
        .link a {
        	text-decoration: none;
        	color: #403e39;
        	margin: 10px 3px;
        }
        .link a:hover{
        	color: #cc8f14;
        }
        p {margin-top: 5px;}
	</style>
</head>
<body>
	<div class="footer">
		<div class="link">
			<a href="">空间手机版</a><span> | </span>
			<a href=""> 黄钻贵族</a><span> | </span>
			<a href="">官方Qzone</a><span> | </span>
			<a href="">QQ互联</a><span> | </span>
			<a href="">认证服务</a><span> | </span>
			<a href="">腾讯博客</a><span> | </span>
			<a href="">腾讯客服</a><span> | </span>
			<a href="">QQ空间服务协议</a><span> | </span>
			<a href="">Complaint Guidelines</a><span> | </span>
			<a href="">粤网文[2017]6138-1456号</a>
			<p>Copyright © 2005 - 2018 Tencent.<a href="">All Rights Reserved.</a></p>
			<p>腾讯公司 <a href="">版权所有</a></p>	
		</div>
	</div>
</body>
</html>
运行实例 »

点击 "运行实例" 按钮查看在线实例

布局文件:tp51/application/index/view/layout.html

{include file="hebox/header" /}
{__REPLACE__}
{include file="hebox/footer" /}

QQ截图20180530162809.png

  • 模板继承

一. 在view/base.html: 做为被其它模板继承的基础模板文件,也可以叫父模板

1. 基础模板中,应该只有block标签,而不应该有其它的标签;

2. 基础模板中,写在block标签之外内容,会原样输出到子模板中 

二. base.html中,需要被子模板重写的内容全部用{block name=""}进行定义

{block name="beader"}
{include file="hebox/header" /}
{/block}

三. 子模板中直接用{extend name="" /}继承即可

{extend name="base" /}

清除基础模板中name区块的内容

{block name="name"}{/block}

1.子模板中,只能对基础模板中的区块block进行重写;

2.子模板中不能写其它内容,否则会直接忽略掉;

4.子模块中未重写的区块内容,将原样显示

3.子模拟中的区块顺序无所谓;

4.如果子模块中的区块内容为空,则是清除区块中的原内容

基础文件(父模块):tp51/application/index/view/base.html

{block name="header"}
{include file="hebox/header" /}
{/block}

{block name="main"}主体部分{/block}

{block name="text"}新主体你们喜欢吗?{/block} <br>

{block name="footer"}
{include file="hebox/footer" /}
{/block}

继承文件(子模块):tp51/application/index/view/demo5.html

{extend name="base" /}

{//修改头部}
{block name="header"}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
.muin {
width: 100%;
height: 50px;
background:#000;
line-height: 50px;
color:#fff;
text-align: center;
font-size: 20px;
font-weight: bold;
}
</style>
</head>
<body>
<div>我是导航条</div>
</body>
</html>
{/block}

{//更新主体部分}
{block name="main"}
<div style="height:300px;background: red;line-height: 300px;">
<h1 style="font-size: 50px;text-align: center;margin: 0;color:#fff;">我是新的主体部份</h1>
</div>
{/block}

{//继承父模块的内容 {__block__}}
{block name="text"}{__block__}<span style="font-size: 50px;text-align: center;margin: 0;color:red;">很喜欢!!</span>{/block}

{//清除底部}
{block name="footer"}{/block}

QQ截图20180530174225.png

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post