ThinkPHP---thinkphp视图(V)
配置文件分3类:系统配置文件,分组配置文件,应用配置文件
①系统配置文件ThinkPHP/Conf/convention.php;
②分组 / 模块 /平台配置文件Home/Conf/config.php;
③应用配置文件Common/Conf/config.php;
(1)什么是视图?
MVC中的V(view),主要负责信息的输出展示
(2)视图的创建?
创建位置:分组目录Home下的View目录下指定的控制器名目录中,然后将模板绑定到控制器的方法中,一个公共控制器中可以绑定多个模板
注意:位置问题,控制器同名
①位置是view下与控制器同名的目录中;view下一级目录为控制器,二级目录为方法(对应的模板文件)
②如果有多个模板文件,则按照上面要求进行创建
(3)视图的展示?
在smarty中展示模板用的display方法,在ThinkPHP里同样是display方法
display在ThinkPHP中的3种语法格式:
①$this->display(); 展示当前控制器下与当前请求方法名一致的模板文件
②$this->display(模板文件名--不带后缀); 展示当前控制器下指定模板文件
③$this->display(view目录下目录名/模板文件名--不带后缀); 展示指定控制器下的指定模板文件
案例:
- <?php
- namespace Admin\controller;
- use Think\Controller;
- class TestController extends Controller{
- public function test1(){
- $this->display('Person/person');//显示Person下person.html模板
- }
- }
- ?>
(4)变量分配
将变量从控制器的方法里传递到模板中展示的过程即为变量分配
在ThinkPHP中系统封装好了一个变量的分配方法,在smarty中用assign,在ThinkPHP里也是assign(分配)
语法:$this->assign('模板中变量名',$php中的变量名);
- <?php
- namespace Admin\controller;
- use Think\Controller;
- class TestController extends Controller{
- public function test1(){
- //不写date()的第二个参数,则默认为当前时间
- $time = date('Y-m-d h:i:s',time());
- $this->assign('time',$time);//变量的传递,接下来是模板文件数据展示
- $this->display();
- }
- }
- ?>
接下来是数据的展示
在smarty里展示变量,写在标记里{!-- --}。在ThinkPHP里,默认的展示变量方法与smarty类似,{$模板中变量名}
- <!DOCTYPE html>
- <html>
- <head>
- <title>test1</title>
- </head>
- <body>
- <p>
- 现在时间是:{$time}
- </p>
- </body>
- </html>
注意:①模板展示放在变量分配后,否则无法展示变量;②一般情况下两个参数的变量名是一样的,方便查找
(5)变量分隔符
ThinkPHP默认变量分隔符为{},可以在配置文件ThinkPHP/Conf/convertion.php里找到配置项
- // 布局设置
- 'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
- 'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
左右标记可以通过配置项修改,例如将左标记符改为],则在模板里的变量需要改为[$time}
(6)模板常量替换机制
①由来:实际开发中,在引入css、js、图片等文件时,往往需要些一些复杂的路径。这时可以考虑用模板常量替换机制,将复杂路径简单化
②ThinkPHP里系统默认提供了一下几个常用的模板常量(因为是模板常量,所以只能在模板中使用,不能在控制器里使用)
__MODULE__:(模块/组件),输出到分组,表示从域名后开始到分组名结束的路由。/index.php/Admin
__CONTROLLER__:(控制),输出到控制器,/index.php/Admin/Test
__ACTION__:(方法),输出到方法,/index.php/Admin/Test/test1
__PUBLIC__:表示从域名后开始找,站点根目录下Public目录路由,/public
__SELF__:当前路由,从域名后开始到路由结束,与__ACTION__区别:/index.php/Admin/Test/test1/id=10,具体输出不同。当没有参数时,__SELF__和__ACTION__相同
③模板常量来源?
这里模板常量是通过模板内容替换机制来实现的,并非是常量的定义。所以模板常量并非是常量,而是字符串。
替换机制可以查看行为文件ThinkPHP/Library/Behavior/ContentReplace.Behaviour.class.php
拓展:查看后即可得出行为文件命名,文件名.Behaviour.class.php。
- /**
- * 模板内容替换
- * @access protected
- * @param string $content 模板内容
- * @return string
- */
- protected function templateContentReplace($content) {
- // 系统默认的特殊变量替换
- $replace = array(
- '__ROOT__' => __ROOT__, // 当前网站地址
- '__APP__' => __APP__, // 当前应用地址
- '__MODULE__' => __MODULE__,
- '__ACTION__' => __ACTION__, // 当前操作地址
- '__SELF__' => htmlentities(__SELF__), // 当前页面地址
- '__CONTROLLER__'=> __CONTROLLER__,
- '__URL__' => __CONTROLLER__,
- '__PUBLIC__' => __ROOT__.'/Public',// 站点公共目录
- );
- // 允许用户自定义模板的字符串替换注意:行为文件是系统自带的,一般不建议去改动
- if(is_array(C('TMPL_PARSE_STRING')) )
- $replace = array_merge($replace,C('TMPL_PARSE_STRING'));
- $content = str_replace(array_keys($replace),array_values($replace),$content);//这步便是通过模板内容替换机制str_replace
- return $content;
其模板常量的核心就是字符串的替换str_replace
④自定义模板常量
为了后期使用方便,可以在配置文件里定义一个自定义的模板常量
配置项为TMPL_PARSE_STRING
注意:开发时尽量不要修改系统配置文件,因为系统配置文件的作用范围十分广泛。可以将需要修改的配置项,在分组、应用级别的配置文件里去定义,不要直接在系统文件里修改。
例如:放到应用配置文件Common/Conf/config.php
- <?php
- return array(
- //'配置项'=>'配置值'
- //模板常量
- 'TMPL_PARSE_STRING' => array(
- // __ROOT__.'/Public'站点公共目录,即根目录下public
- '__ADMIN__' => __ROOT__.'/Public/Admin', //定义好之后,可以通过__ADMIN__来访问静态资源路径
- )
- );
验证:模板输入__ADMIN__来验证,输出结果为/Public/Admin,表示验证成功
(5)获取模板内容
在ThinkPHP里有一个方法与display展示模板方法类似,叫做fetch()方法
$this->display();用来展示模板内容,而$this->fetch常用来获取模板内容
语法:$this->fetch();
作用:获取模板内容,返回字符串(字节长度)
- //模板常量的获取
- $str = $this->fetch();
echo '<pre>';- var_dump($str);
echo '</pre>';
注意:在ThinkPHP中封装好了一个友好的打印方法--dump()方法。语法格式:dump(需要打印的变量)
所以上诉打印语法可以换为
- dump($str);
该语法封装在系统的函数库ThinkPHP/Common/functions.php里
- /**
- * 浏览器友好的变量输出
- * @param mixed $var 变量
- * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
- * @param string $label 标签 默认为空
- * @param boolean $strict 是否严谨 默认为true
- * @return void|string
- */
- function dump($var, $echo=true, $label=null, $strict=true) {
- $label = ($label === null) ? '' : rtrim($label) . ' ';
- if (!$strict) {
- if (ini_get('html_errors')) {
- $output = print_r($var, true);
- $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
- } else {
- $output = $label . print_r($var, true);
- }
- } else {
- ob_start();
- var_dump($var);
- $output = ob_get_clean();
- if (!extension_loaded('xdebug')) {
- $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
- $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
- }
- }
- if ($echo) {
- echo($output);
- return null;
- }else
- return $output;
- }
(6)display()方法与fetch()方法对比:
display():替换模板中常量/变量→获取模板内容→输出模板内容
fetch():替换模板中常量/变量→获取模板内容
对比即可发现fetch()方法相对于display()方法只是缺少了输出模板的步骤
所以我们可以对上诉代码进行修改,手动添加输出echo()步骤,输出获取的内容即可产生和display()展示模板信息同样的效果
- //模板常量的获取
- $str = $this->fetch();
- //模板内容的输出---产生类似于display()的效果
- echo($str);
下面来看下底层实现的步骤:
①由当前控制出发开始分析,display()继承自父类控制器Controller.class.php
- class TestController extends Controller{
- public function test1(){
- //模板常量的展示
- $this->display();
- //模板常量的获取
- $str = $this->fetch();
- echo($str);
- }
- }
②分析父类控制器ThinkPHP/Library/Think/Controller.class.php,display来源于实例化Think/View
- /**
- * 架构函数 取得模板对象实例
- * @access public
- */
- public function __construct() {
- Hook::listen('action_begin',$this->config);
- //实例化视图类
- $this->view = Think::instance('Think\View');
- //控制器初始化
- if(method_exists($this,'_initialize'))
- $this->_initialize();
- }
- /**
- * 模板显示 调用内置的模板引擎显示方法
- */
- protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') {
- $this->view->display($templateFile,$charset,$contentType,$content,$prefix);
- }
③Think/View.class.php,这里的display()便是我们底层最终执行的display()
- /**
- * 加载模板和页面输出 可以返回输出内容
- * @access public
- * @param string $templateFile 模板文件名
- * @param string $charset 模板输出字符集
- * @param string $contentType 输出类型
- * @param string $content 模板输出内容
- * @param string $prefix 模板缓存前缀
- * @return mixed
- */
- public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') {
- G('viewStartTime');
- // 视图开始标签
- Hook::listen('view_begin',$templateFile);
- // 解析并获取模板内容
- $content = $this->fetch($templateFile,$content,$prefix);
- // 输出模板内容
- $this->render($content,$charset,$contentType);
- // 视图结束标签
- Hook::listen('view_end');
- }
综上,分析底层代码即可得出display()方法的前两部,实际上是通过fetch()方法实现的
(7)视图注释
回顾下HTML的注释<!--注释内容-->,普通的注释在页面源码中会被输出
在thinkPHP中的注释不会被输出
模板视图中变量的注释
- 行注释------{//注释内容}
- 块注释------{/*注释内容*/}
注释作用:提供代码可读性,方便日后项目的维护
注意:①不论行注释还是块注释,在注释里不要再加入模板变量,否则会被自动解析出来,影响注释,导致注释失败。例如:
- <body>
- {/*我是注释{$number}*/} <!--会被浏览器解析成 {/*我是注释{$number}*/} -->
- </body>
②行注释不要跨行
拓展:
经典面试题:ThinkPHP中的行注释和块注释,与HTML里的注释有什么区别?
HTML中的注释属于客户端的注释,会在浏览器的源代码被输出,而ThinkPHP里的注释属于服务器端的注释,不会被输出
(8)变量分配
变量输出:简单变量,一维数组,二维数组,对象变量
变量的分配语法相同:都是assign('模板中的变量',PHP中的变量);
①简单变量输出
上面已经总结过了,将变量从控制器的方法里传递到模板中展示的过程即为变量分配。在ThinkPHP中系统封装好了一个变量的分配方法,在smarty中用assign,在ThinkPHP里也
是assign(分配)
语法:$this->assign('模板中变量名',$php中的变量名);
②一维数组输出
- //定义一维数组
- $array = array('123','456','789');
- //变量的分配
- $this->assign('array',$array);
在PHP里数组输出具体元素可以通过下标形式输出:$array[key]
在模板中也可以通过下标形式输出数组中的数据:{$array[key]},除此外还有其他形式,下面列举出来
- 中括号形式:{$array[key]}
- 点形式:{$array.key}
总结:两种形式都可以使用,没有什么区别
③二维数组输出
- //定义二维数组
- $array = array(
- array('one','two','three'),array('four','five','six')
- );
- //变量的分配
- $this->assign('array',$array);
模板中展示数组数据,可以通过下标、中括号形式输出
④对象变量输出
对象在实例化之后,会保存到变量中,而这个变量也可以分配到模板里去
首先创建类,然后实例化类来创建对象
注意:
1. 对于多个人开发项目,函数名很容易重复。用了类之后,类之间的方法名被类分开,重名也没关系。
但是当项目更大时,类名也有可能重复。此时就要用到命名空间,来避免重名。所以创建类之前必须定义命名空间
2. 创建类文件时,必须加上文件名.class.php
Student.class.php
- <?php
- //命名空间,命名空间的写法取决于文件存放的位置。因为要放到控制器目录Admin\Controller里,所以命名空间为Admin\Controller
- namespace Admin\Controller;
- class Student{
- }
- ?>
TestController.class.php,该文件里不用引入,直接实例化类,输出
- object(Admin\Controller\Student)#6 (0) {
- }
- TestController.class.php:
<?php- namespace Admin\Controller;
- use Think\Controller;
- class TestController extends Controller{
- public function test1(){
- //实例化Student对象
- $stu = new Student();
- dump($stu);
- }
- }
- ?>
- <meta charset="utf-8">//这里为了方便,直接去入口文件添加header头,设置编码字符集,我在下面拓展里做介绍
类的实例化:
1. 之所以不用引入类就能实例化,主要因为命名空间
命名空间运行流程:当需要引入或使用元素时,默认先去当前空间下去找。而Student.class.php在当前空间下Admin\Controller,所以会找到执行。若找不到则会报错
2. 如果不写命名空间、include、require则会默认从当前空间下去查找需要的元素,若找不到则报错
拓展:设置编码字符集:
- index.php入口文件:
- //给入口文件添加header头声明字符集
- header('Content-Type:text/html;charset=utf-8')
接下来给类的属性赋值,并在方法中打印对象
- //给类的属性赋值
- $stu -> id='1';
- $stu -> name='Tony的名字';
- $stu -> age='23';
- dump($stu);
输出结果为:
- object(Admin\Controller\Student)#6 (3) {
- ["id"] => string(1) "1"
- ["name"] => string(13) "Tony的名字"
- ["age"] => string(2) "23"
- }
之后将变量分配到目标中展示→首先创建模板,模板名与方法名一致;创建好之后输出对象
回顾PHP输出对象属性: ①$obj->attr;②$obj::attr;两种方式输出对象属性。推荐使用第一种
ThinkPHP里输出属性值有两种方式:①$obj->attr;②$obj : attr;
所以ThinkPHP模板中输出变量可以用{$obj->attr}或者{$obj : attr}
注意:在ThinkPHP模板中,在输出对象属性时,不要使用.形式。因为不允许将对象作为数组使用,会报错
- Cannot use object of type Admin\Controller\Student as array 翻译为:不能使用Admin \ Controller \ Student类型的对象作为数组
错误位置 错误位置:Runtime临时文件下的65af6f45e2487d64435139e4da34a722.php即为该文件运行的临时目录,临时文件名通过md5加密
FILE: C:\site\Application\Runtime\Cache\Admin\65af6f45e2487d64435139e4da34a722.php LINE: 10
(9)系统变量
ThinkPHP里提供了以下几个系统级别的变量(可以理解为超全局变量在模板中的使用)
$Think.server;$Think.get;$Think.post;$Think.request;$Think.cookie;$Think.session;$Think.config;
下面依次介绍
$Think.server == $_SERVER获取服务器的相关信息,大约80个元素
$Think.get == $_GET获取get请求的信息
$Think.post == $_POST获取post请求的信息
$Think.request == $_REQUEST获取get和post中的信息,就是get和post的集合
$Think.cookie == $_COOKIE获取cookie信息
$Think.session == $_SESSION获取session信息
简单总结下就会发现:以上都是获取类型的变量,因为这些系统变量是用在模板中的。而目标里只能获取,不能设置
$Think.config为ThinkPHP封装的。表示获取ThinkPHP中所有配置文件的总和,如果后面指定了元素,则获取指定配置
上述7个常用系统变量语法格式相同,即{$Think.xxx.具体元素下标}。例如
- {$Think.get.id} //在模板文件里获取get请求的id
案例:
- {//输出本机所有的环境变量}
- 环境变量:{$Think.server.path}<br/>
- 获取get传值:{$Think.get.id}<br/>
- 获取get和post传值:{$Think.request.id}<br/>
- {//获取PHP的Session ID}
- PHP的session ID:{$Think.cookie.PHPSESSID}<br/>
- {//当前默认分组DEFAULT_MODULE,输出Home}
- 配置项:{$Think.config.DEFAULT_MODULE}
输出结果:
环境变量:C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\cmd;C:\PHPTutorial\MySQL;C:\AppServ\Apache24\bin;C:\AppServ\php5;C:\AppServ\MySQL\bin
获取get传值:1
获取get和post传值:1
PHP的session ID:kna70hjenfhuijnv7ca5itc423
配置项:Home
(11)视图中使用函数
在实际开发中,有些变量不能直接使用。举个例子,数据表中存储时间一般都为时间戳格式,展示的时候需要处理格式化,操作相对繁琐。这个时候便涉及到了视图中使用函数
语法格式:{$变量|函数名1|函数名2=参数1,参数2...,###}
参数说明:
$变量:模板变量;
|:变量修饰符;
函数1:要使用的第一个函数;
函数2:要使用的第二个函数;参数1:函数2的参数;
=:类似于PHP函数名后面的();
###:表示变量本身;
案例一:时间戳time()的格式化
PHP中的格式化语法:date('Y-m-d H-i-s',time()),而在模板html中的语法为
- PHP→
- $time = time();
- $this->assign('time',$time);
- $this->display();
- HTML→
- {$time|date='Y-m-d H:i:s',###}
ThinkPHP中为了不再使用变量本身,使用###来代替变量本身
注意:
1. ###:当需要使用的函数只有一个参数并且参数是变量自身时,###可以省略不写;函数有多个参数,但是其第一个参数是变量自身时,也可以省略不写;
2. 函数名对应的函数必须是PHP内置函数或函数库(分为系统函数库、自定义函数库)文件里定义好的函数;
案例二:定义一个字符串,截取前5个字符,并转换为大写
- //定义字符串、变量传递、模板展示
$str = 'aBcDeFgHiJkLmN';- $this->assign('str',$str);
- $this->display();
截取字符串:substr();字符串转化为大写strtoupper()
视图参数转换处理
- {$str|substr=###,0,5|strtoupper=###}
(12)默认值
使用场景:在论坛的个性签名处,如果用户什么都没写,一般默认会显示-----------→这个家伙很懒,什么都没留下
默认值:当某个变量不存在或为空时,便会显示默认字符或默认值
语法:{$变量名|default = 默认值},结合上面视图中函数的使用。这里可以理解为{$变量名|函数名=参数},而default为ThinkPHP封装的函数
- 个性签名:{$sign|default='这个人很懒,什么也没留下...'}
(13)运算符
加减乘除取余,自增自减
{$a+$b},{$a-$b},{$a*$b},{$a/$b},{$a%$b},{$a++}或{++$a},{$a--}或{--$a}
(14)文件引入
提出公共部分,后期维护方便
若首位公共部分不拿出来,则会造成两个问题①代码重复;②后期维护不便
PHP里引入文件可以用include和require,但在ThinkPHP只提供了一个模板标签include,可以引入公共部分代码。不能用require
PHP里require和include区别:include出错时会发出警告级别提示并继续执行;而require会生成致命错误,并停止脚本执行
语法:<include file='需要引入的模板文件'/>
案例:
- public function header(){//展示头部
- $this->display();//展示模板
- }
- public function body(){
- $this->display();
- }
- public function footer(){//展示尾部
- $this->display();
- }
先检验三个模板可以展示成功后,再进行文件的引入
文件引入注意:①相对路径是相对于入口文件来说的相对路径,而不是当前文件;
- <include file='./Application/Admin/View/Public/header.html'/> <!--公共头文件header.html,相对于入口文件index.php的相对路径-->
为什么相对路径是针对入口文件呢?
因为<include />标签是模板引擎标签,在服务器端入口文件进行解析,解析完成后才输出到浏览器。所以是相对于入口文件。
在实际开发中,因为路径过长,容易写错,但服务器端还不会报错。所以常用另外一种写法:
- <include file='View目录名/模板文件名(不加后缀)' />
例如上述路径还可以改为:
- <include file='Public/header'/> <!--目录名/模板文件名(不加后缀)-->
拓展:<include />标签还可以传递参数,语法:<include file='模板文件' 参数名='参数值' />
案例:例如网站底部常见的Copyright© 2009-2018 格式,它是随着时间变化的,所以可以传递参数。在body部分的引入尾部文件部分加上参数
- <include file='Public/header' value='2019-2020'/>
注意:参数值必须加‘’,不管数据类型是什么。否则会报XML语法错误
之后在底部文件foot.html中使用该参数[参数名]
- Copyright© [value]
注意:若参数不存在,则会原样输出到浏览器,显示为Copyright© [value]
(15)视图中数组循环遍历volist、foreach
在ThinkPHP里,系统提供了两个标签volist和foreach来实现数组在模板中的遍历操作
①volist语法:(双标签语句,所以需要闭合)
- <volist name='变量数组名(前面没有$)' id='当前遍历到的元素'>
循环体
</volist>
对比:foreach对应关系
$key可以去掉,所以可以改为
fireach($variable as $value){//这里变量数组名=$variable,id=$value
# code...
}
foreach ($variable as $key => $value) {
# code...
}
②foreach语法:
- <foreach name='变量数组名(前面没有$)' item='当前遍历到的元素'>
循环体
</doreach>
volist和foreach区别:
volist除了name和id属性对外,还支持更多属性对。如mod、key、length、offset等;而foreach标签除了上述name、item外,只支持key,其他均不支持。可以理解成foreach标签
是volist标签的简化版本。若想多样化控制输出,例如遍历数组输出偶数,或者输出第5-10的元素、为空提示等,可以使用<volist>标签控制。
实际开发里推荐使用volist标签,即使以后需要加多样化属性控制,只需在volist标签后加上属性对即可。
案例:
①一维数组遍历
- 控制器:
- //一维数组
- $array = array('one',2,3,4,5,6);
- $this->assign('array',$array);
- $this->display();
- 模板:
- <!-- 参考PHP的foreach的$value,id名随意。但在PHP里一般起名叫vol -->
- <volist name='array' id='vol'>
- {$vol},
- </volist>
或者
<foreach name='array' item='for'>
{$for}
</foreach>
②二维数组遍历
- //控制器变量传递及模板展示
- $array = array(
- array('one','two'),array('three','four')
- );
- dump($array);
- $this->assign('array',$array);
- $this->display();
- //(1)循环后逐个读取(该方法需要先知道数组构成)
- <volist name='array' id='vol'>
- {$vol.0},{$vol.1},
- </volist>
- //(2)volist嵌套循环
- <volist name='array' id='vol'>
- <volist name='vol' id='vo'>
- {$vo},
- </volist>
- </volist>
或者foreach嵌套循环
(16)if标签
PHP中if判断作用是流程控制,在ThinkPHP里同样也可以用于流程控制
语法:(注意<if></if>标签闭合)
- <if condition='条件表达式'>
- 输出结果1
- <elseif condition='条件表达式2'/>
- 输出结果2
<elseif condition='条件表达式3'/>
输出结果3- <else/>
- 输出结果
</if>
案例:php里输出当天星期的数字,将变量传递到目标中。根据if判断条件的不同,输出显示当天星期
- //控制器,根据手册查询可以得知N表示1(表示星期一)到 7(表示星期天)
- $time=date('N',time());
- dump($time);//输出string(1-7)
接下来在模板里编写if判断输出代码
- <if condition='$time == 1'>
- 今天是周一
- <elseif condition='$time == 2' />
- 今天是周二
- <elseif condition='$time == 3' />
- 今天是周三
- <elseif condition='$time == 4' />
- 今天是周四
- <elseif condition='$time == 5' />
- 今天是周五
- <elseif condition='$time == 6' />
- 今天是周六
- <else/>
- 今天是周日
- </if>
注意:ThinkPHP的elseif间没有空格,JS里有
(17)PHP标签
PHP标签指在模板中使用PHP语法格式
ThinkPHP支持两种形式标签①PHP内置的标签<?php 代码段 ?>;②ThinkPHP封装的PHP标签<php>代码段</php>
- 原始PHP标签:<?php echo tony; ?><br/>
- ThinkPHP封装的标签:<php>echo tony;</php>
注意:实际开发中不建议在模板中使用PHP标签(不管原生还是封装好的),为什么呢?
之前说过,编程的3个阶段混编、模板引擎、MVC。当前框架是遵循MVC设计规范设计的,如果在模板里加入PHP标签就变成混编,打破了MVC的设计规范
在配置项里,有一个配置项(TMPL_DENY_PHP即tmplate deny php拒绝php模板),可以禁用PHP标签。该配置项在系统配置文件ThinkPHP/Conf/convention.php里
- // 布局设置
- 'TMPL_DENY_PHP' => false, // 默认模板引擎是否禁用PHP原生代码
开启后便会禁用原生PHP代码(不建议禁用),此时在模板文件里<?php ?>原生PHP标签失效。下面来验证下,发现报错
- :(
- 模板禁用PHP代码
不建议禁用。若禁用了原生PHP标签,某些功能会异常。比如成功跳转和失败跳转,因为成功跳转和失败跳转使用了原生PHP标签,禁用的话会跳转失败
ThinkPHP---thinkphp视图(V)的更多相关文章
- ThinkPHP框架视图详细介绍 View 视图--模板(九)
原文:ThinkPHP框架视图详细介绍 View 视图--模板(九) 视图也是ThinkPHP使用的核心部分: 一.模板的使用 a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和 ...
- oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系
前言:在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后 ...
- [20190312]视图v$datafile字段OFFLINE_CHANGE#, ONLINE_CHANGE#.txt
[20190312]视图v$datafile字段OFFLINE_CHANGE#, ONLINE_CHANGE#.txt --//视图v$datafile存在2个字段OFFLINE_CHANGE#, O ...
- 动态性能视图v$mystat,v$sesstat,v$statname
视图说明: v$mystat-------> 当前会话统计 v$sesstat------> 按会话进行分组统计 v$sysstat-------> 当系统的整体统计 v$statn ...
- oracle常用视图v$mystat v$sesstat v$sysstat v$statname v$thread v$ parameter v$session v$process
这两天看了盖国强老师的<<深入浅出>>,很佩服盖老师钻研的精神.书中常用到一个查询语句,为了获取当前会话的跟踪文件路径,sql如下: SELECT d.VALUE || '/' ...
- 视图 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的差异
http://blog.csdn.net/leshami/article/details/8658205 视图v$sql,v$sqlarea,v$sqltext,v$sqltext_with_newl ...
- 【三十五】thinkphp之视图
1.模板定义 视图属于mvc中的v.一般是html结合php获取的数据提供给用户使用. 每个模板的文件都是独立的(文件名与控制器名称必须一样) 默认的模板文件规则是视图目录/[模板主题]控制器/操作名 ...
- ThinkPHP之视图模版的使用
用户发起一个请求后,服务器应该返回一个页面,而页面是由我们的视图层来控制的. 一.修改控制器 <?php namespace Home\Controller; use Think\Control ...
- ThinkPHP 前台视图实现类似于Yii的自动验证
ThinkPHP model类其实自带这个功能 可以写一个基础类继承Model 模型层代码: <?php namespace Manager\Model; use Think\Model; cl ...
- 3.ThinkPHP入门---视图
视图:MVC三大组成部分,负责信息的展示和输出 1.视图的创建 创建的位置需要是在分组目录下的view目录下余控制器同名的目录中. 2.视图的展示 在smarty和tinkphp都是使用diaplay ...
随机推荐
- 创建类模式大PK(总结)
创建类模式包含工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,它们都可以提供对象的创建和管理职责.当中的单例模式和原型模式很easy理解,单例模式是要保持在内存中仅仅有一个对象,原型模式是 ...
- 【HNOI模拟By YMD】move
Description 设P(n)为从(0,0)移动到点(n,0)的不同路径数目,移动的方式有以下三种:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)-> ...
- spark groupByKey().mapValues
>>> rdd = sc.parallelize([("bone", 231), ("bone", 21213), ("jack&q ...
- go语言---传值和传引用
go语言---传值和传引用 https://blog.csdn.net/cyk2396/article/details/78893828 1.定义: b = a; b.modify(); 如果b的修改 ...
- [POI2011]LIZ-Lollipop
https://www.zybuluo.com/ysner/note/1303462 题面 给一个只有\(1\)和\(2\)的序列,每次询问有没有一个子串的和为\(x\). \(n\leq10^6\) ...
- CentOS查看CPU、内存、网络流量和磁盘 I/O【详细】
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/swrqm/s: 每秒进行 merge 的 ...
- Spark 分布式环境--连接独立集群管理器
Spark 分布式环境:master,worker 节点都配置好的情况下 : 却无法通过spark-shell连接到 独立集群管理器 spark-shell --master spark://soyo ...
- emma中文显示乱码问题解决
在Linux中如果使用mysql的图形客户端,个人感觉Emma还不错.但是emma默认用apt-get 安装的话,emma是不支持中文的,这个需要自己修改一下了配置文件,或者直接修改emma程序源文件 ...
- Thinkphp模板标签if和eq的区别和比较
在TP模板语言中.if和eq都可以用于变量的比较.总结以下几点: 1.两个变量的比较: <if condition=”$item.group_id eq $one.group_id”> & ...
- bzoj 1833: [ZJOI2010]count 数字计数【数位dp】
非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include ...