abstract:<?php namespace app\index\controller; use think\facade\View; use think\Controller; class Index extends Controller { public function index() { return&nbs
<?php namespace app\index\controller; use think\facade\View; use think\Controller; class Index extends Controller { public function index() { return '<h3>此处只展示控制器中的操作,由于视图代码比较简单,就不一一列举了</h3>'; } //模板渲染 public function test1() { $name = 'ma'; //直接输出变量 //return $name; //使用视图方法:display()不通过模板,直接渲染内容,支持HTML标签 // return View::display($name); // return View::display('我的姓名是:'.$name); // return View::display('我的姓名是:<span style="color:red">'.$name.'</span>'); //以上方法输出模板内容,内容不多还行,如果内容很多,就不是很方便了 //建议使用fetch(),加载指定模板文件输出 //fetch(模板表达式) //模板表达式: 模块@控制器/操作方法 //模板默认根目录是:模块/view/控制器名/模板文件名 //模板文件的后缀可自定义config/template.php,默认为html //fetch('模板表达式',[模板变量数组],[模板配置数组]) //模板参数我们一般不在控制器动态配置,而是在config/template.php中统一配置 //除了直接导入View门面类进行调用之外,其实控制器Controller类封装模板中的常用方法 //只要当前控制器类继承了Controller,就可以直接使用这些内置方法 //控制器类中有一个属性view,保存着视图类的实例对象 // return View::fetch('test1',['name'=>'ma']); // return $this->view->fetch('test1',['name'=>'ma']); //控制类Controler.php中对常用视图方法做了简化 // return $this->fetch('test1',['name'=>'ma']); //框架也内置了一个助手函数提供大家使用view() //在任何情况下都可以使用助手函数,不依赖外部是否导入了某个类 //可以把前面的use导入的所有类全部注释掉 return view('test1',['name'=>'ma']); } //模板赋值 public function test2() { //模板赋值: //1. assign() //使用assign()必须要调用View类,以后我们统一使用Controller来调用 // $name = 'ma'; // $this->view->assign('name', $name); //2.传参方式: fetch()或view()刚才已经演示过了 //3.对象方式:底是通过Controller中的二个魔术方法来实现视图类的数据注入的 $this->view->name = 'ma'; // return $this->fetch('test2'); //如果是按默认规则创建的模板文件,则模板文件名可以省略 return $this->view->fetch(); } //模板过滤与替换 public function test3() { //tp51也之前版本相比,直接删除了模板字符串替换功能,而改为模板配置参数来实现 //config/template.php: 'tpl_replace_str' => [''=>''], //不过,我建议大家在控制器使用filter()直接进行过滤替换,更简洁 //将模板中的ma换成:mathilde $this->view->assign('name','ma'); $filter = function($content) { return str_replace('ma', 'mathilde', $content); }; return $this->filter($filter)->fetch(); } //模板布局 public function test4() { /** * 一、全局配置,先开启模板布局功能 * 1. config/template.php * 2.'layout_on' => true, 'layout_name' ] = 'layout','layout_item'=>'{__REP__}' * *二、模板标签的方式 * 1. 不需要在config/template.php中开启和配置布局模板 * 2. 直接在需要使用布局模板的模板文件顶部指定布局模板文件即可: {layout name="layout" /} * {//layout name="layout" /} {//如果当前模板不需要调用布局模板,可以直接用下面的标签进行关闭} {//__NOLAYOUT__} * 三、在控制器动态配置 * 1.不需要在模板配置文件做任何配置,也不需要在当前模板中添加任何标签 * 2.当然,布局模板,还是要事先制作好的 * 3.直接调用:$this->view-engine->layout(true)开启 */ // return $this->view->fetch(); //动态开启模板布局,一切使用默认的布局参数:layout_name=layout,{__CONTENT__} // $this->view->engine->layout(true); // return $this->view->fetch(); //能否将上面二条语句进行合并,进行链式调用呢? // return $this->view->engine->layout(true)->fetch(); //必须给出完整的模板表达式: // return $this->view->engine->layout(true)->fetch('index@index/test4'); //其实@前面的模块名称是可以省略的 // return $this->view->engine->layout(true)->fetch('index/test4'); //关闭模板布局 // return $this->view->engine->layout(false)->fetch('index/test4'); //自定义模板布局参数,layout可以是任意的布局文件,被替换的内容标识符也可以自定义 return $this->view->engine->layout('layout','{__TEXT__}')->fetch('index/test4'); } //模板继承 public function test5() { /** * 1.在view/base.html: 做为被其它模板继承的基础模板文件 * 2.base.html中,需要被子模板重写的内容全部用{block name=""}进行定义 * 3.子模板中直接用{extend name="" /}继承即可 */ /* 1.子模板中,只能对基础模板中的区块block进行重写; 2.子模板中不能写其它内容,否则会直接忽略掉; 4.子模块中未重写的区块内容,将原样显示 3.子模拟中的区块顺序无所谓; 4.如果子模块中的区块内容为空,则是清除区块中的原内容 */ return $this->view->fetch(); } }
Correcting teacher:天蓬老师Correction time:2018-12-03 15:58:53
Teacher's summary:thinkphp中的模板, 与smarty非常的像, 也支持第三方模板引擎 , 其实原生 php本身就是最好的模板引擎