ThinkPHP5.1教程33.模版的布局和继承
ThinkPHP5.1教程32.模版的加载包含输出等

32.模版的加载包含输出等学习要点:1.包含文件2.输出替换3.文件加载本节课我们来学习一下模版标签中的文件的包含、输出以及加载。
一.包含文件1.使用{include}标签来加载公用重复的文件,比如头部、尾部和导航部分;2.在模版view目录创建一个public公共目录,分别创建header、footer和nav;3.然后创建Block控制器,引入控制器模版index,这个模版包含三个公用文件;{include file='public/header,public/nav'/}index{include file='public/footer'/}4.也可以包含一个文件的完整路径,包括后缀,如下:{include file="../application/view/public/nav.html"/}5.模版的标题和关键字,可以通过固定的语法进行传递;6.对于标题,在控制器先设置一下标题变量,然后设置{include}设置属性;$this->assign('title','模版');{include file='public/header'title='$title'keywords='这是一个模版!'/}7.切换到public/header.html模版页面,使用[xxx]的方式调用数据;<title>[title]</title><meta name="keywords"content="[keywords]"/>二.输出替换1.有时,我们需要调用一些静态文件,比如css/js等;2.一般来说,我们将这些静态文件存放在根目录public/static/css(或js);3.那么,直接写完整路径,比较繁长,可以把这些路径整理打包;4.在目前二级目录下,template.php中,配置新增一个参数;'tpl_replace_string'=>['__JS__'=>'static/js','__CSS__'=>'static/css',]5.如果是在顶级域名下,直接在改成/static/css即可,加一个反斜杠;6.html文件调用端,直接通过__CSS__(__JS__)配置的魔术方法调用即可;<link rel="stylesheet"type="text/css"href="__CSS__/basic.css"><script type="text/javascript"src="__JS__/basic.js"></script>7.在测试的时候,由于是更改的配置文件刷新,每次都要删除编译文件才能生效;三.文件加载1.传统方式调用CSS或JS文件时,采用link和script标签实现;2.系统提供了更加智能的加载方式,方便加载CSS和JS等文件;3.使用{load}标签和href属性来链接,不需要设置任何其它参数;{load href='__CSS__/basic.css'/}{load href='__JS__/basic.js'/}2.也支持href多属性值的写法,如下:{load href='__CSS__/basic.css,__JS__/basic.js'}3.{load}还提供了两个别名{js}、{css}来更好的实现可读性;{js href='__JS__/basic.js'}{css href='__CSS__/basic.css'}4.{js}和{css}只是别名而已,识别.js还是.css是根据后缀的;。
ThinkPHP5.1教程34.模版的一些杂项

34.模版的一些杂项学习要点:1.原样输出2.模版注释3.标签扩展本节课我们来学习一下模版中最后的一些杂项知识点。
一.原样输出1.有时,我们需要输出类似模版标签或语法的数据,这时会被模版解析;2.此时,我们就使用模版的原样输出标签{literal};{literal}变量标签形式:{$name}{/literal}二.模版注释1.对于在HTML页面中的标签,用HTML注释是无效的,需要模版定义的注释;{//$name}{/*$name*/}{/*多行注释*/}2.注释和{符号之间不能有空格,否则无法实现注释隐藏;3.生成编译文件后,注释的内容会自动被删除,不会显示;三.标签扩展1.标签库分为内置和扩展标签,内置标签库是Cx标签库,就是我们一直用的;2.标签库源文件在:根目录下thinkphp/library/think/template/taglib;3.其中TagLib.php是标签解析基类,Cx.php是标签库解析类,继承自TagLib;4.通读源代码,我们发现,基本都是我们之前所学习的标签,用法也很简单;{eq name='xxx'}yyy{/eq}5.因为Cx是内置标签,使用的时候是非常简洁的形式,如果是扩展标签则如下格式:{cx:eq name='xxx'}yyy{/cx:eq}6.如果自己定义一个扩展的标签库,可以按照Cx.php,在它旁边创建Html.php;class Html extends TagLib{//定义标签列表protected$tags=[//标签定义:attr属性列表close是否闭合(0或者1,默认1)'font'=>['attr'=>'color,size','close'=>1] ];//闭合标签public function tagFont($tag,$content){$parseStr='<span style="color:'.$tag['color'].';font-size:'.($tag['size']*10).'px">'.$content.'</span>';return$parseStr;}}7.对于,扩展标签,我们需要在模版中引入这个标签,并使用扩展标签;{taglib name="html"}{html:font color='red'size='10'}我是ThinkPHP{/html:font}8.如果想把这个扩展标签库移到应用目录区,比如:application\taglib;9.我们这个时候,需要在template.php配置一下预加载标签;//预先加载的标签库'taglib_pre_load'=>'app\taglib\Html',10.最后,需要更改一下Html.php的命名空间;namespace app\taglib;。
THINKPHP5.1Config的配置与获取详解

THINKPHP5.1Config的配置与获取详解⾸先需要在控制器内引⼊Config类,这⾥使⽤5.1新增的facade,通过facade可以静态的调⽤原本需要被继承才能使⽤的⽅法。
获取配置:namespace app\index\controller;use think\facade\Config;class index{public function index(){//获取所有配置内容,返回的是个Arraydump(Config::get());//获取app中的配置内容,返回的是个Arraydump(Config::get('app.'));//获取app中的配置内容,返回的是个Arraydump(Config::pull('app'));//获取app中的debug中的配置内容dump(Config::get('app.app_debug'));}}// app是默认的⼀级配置项,app_debug是在app配置项下的,所以app.是可以省略的,但是// 像template.type中的template.就不能省略,⼀旦省略了就变为了默认的app下的type了获取配置之前最好先判断配置是否存在:namespace app\index\controller;use think\facade\Config;class index{public function index(){//判断template下的type项是否存在,返回true或者falsedump(Config::has('template.type'));}}动态设置配置namespace app\index\controller;use think\facade\Config;public function set(){dump(Config::get('app_debug'));Config::set('app_debug',false);dump(Config::get('app_debug'));}助⼿函数public function helper(){// 获取配置dump(config('database.hostname'));// ⽤'?'判断配置是否存在dump(config('?database.hostname'));// 设置配置config('database.hostname','localhost');// 获取配置dump(config('database.hostname'));// 还是推荐使⽤静态类Config::的⽅法来获取或者设置配置// 更容易被IDE⽀持// 任何的助⼿函数,都不依赖传⼊的类,⽐如config助⼿函数// 不依赖Config类}}到此这篇关于THINKPHP5.1 Config的配置与获取详解的⽂章就介绍到这了,更多相关THINKPHP5.1 Config配置内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
ThinkPHP(6)——模板技术

ThinkPHP(6)——模板技术
ThinkPHP是一款开源的MVC框架,其模板技术是其核心特点之一、ThinkPHP6相比于前几个版本,在模板技术方面进行了一系列的优化和升级,使得开发人员能够更加高效地进行模板编写和管理。
本文将从模板的
基本概念、模板语法、模板继承以及模板布局等方面进行详细介绍。
除了以上这些基本的模板技术,ThinkPHP6还提供了很多其他的模板
功能。
比如模板变量的赋值和获取、模板常量的定义和使用、模板页面片
段的缓存等。
这些功能都能够帮助开发者更加方便地管理和处理模板文件,提高开发效率。
总之,ThinkPHP6的模板技术是其重要特点之一,通过了解和使用模
板技术,开发者可以更好地组织和管理页面的展示,提高开发效率。
希望
本文可以对读者在学习和使用ThinkPHP6的过程中有所帮助。
ThinkPHP5.1教程31.模版的条件判断标签

大于 50 {else}
小于 50 {/if}
5. {if}标签中的条件判断支持 PHP 写法,比如函数和对象调用; {if strtoupper($user->name) == 'MR.LEE'} 确认李先生 {/if}
三.范围标签 1. 范围标签:{in}和{notin},判断值是否存在或不存在指定的数据列表中; {in name='number' value='10,20,30,40,50'}存在{/in} {in name='number' value='10,20,30,40,50'} 存在数据列表中 {else/} 不存在数据列表中 {/in}
存在数据区间中 {else/}
不存在数据区间中 {/between}
4. between 中的 value 只能是两个值,表示一个区间,第三个值会无效; 5. 区间不但可以表达数字,也可以是字母,比如 a-z,A-Z;
四.是否存在标签 1. 是否存在:{present}和{notpresent}判断变量是否已经定义赋值(是否存在); {present name='user'}存在{/present} {present name='user'} user 已存在 {else/} user 不存在 {/present}
31. 模版的条件判断标签
学习要点: 1.switch 标签 2.IF 标签 3.范围标签 4.是否存在标签
本节课我们来学习一下模版标签中的条件判断标签。
一.switch 标签 1. 使用{switch}...{/switch}可以实现多个条件判断; {switch number} {case 1}1{/case} {case 5}5{/case} {case 10}10{/case} {default/}不存在 {/switch}
thinkphp 模板路径

thinkphp 模板路径ThinkPHP是一款基于MVC模式开发的PHP开发框架,它提供了强大的模板引擎,让开发者可以快速、高效地构建动态网页。
在ThinkPHP中,模板文件的路径是非常重要的,因为它决定了在视图层中如何引用和使用模板文件。
接下来,我将详细地介绍ThinkPHP模板路径的使用方法。
在ThinkPHP中,模板文件一般都存放在视图层的目录中,该目录默认为"/Application/模块名/View/控制器名/"。
其中,"模块名"是指当中的模块,"控制器名"是指当前的控制器。
开发者可以根据实际情况自定义模块和控制器的名称。
在模板文件中,可以使用不同的方式来引用或包含其他模板文件。
下面是一些常见的模板引用方式:1. 直接引用:在模板文件中,可以直接使用相对路径或绝对路径的方式来引用其他模板文件。
相对路径是相对于当前模板文件的路径进行引用,而绝对路径则是相对于项目根目录的路径进行引用。
2. 使用include语句:在模板文件中,可以使用include语句来引用其他模板文件。
include语句可以接受一个文件路径作为参数,并将该文件内容包含到当前模板中。
例如,在当前模板中引用其他的模板文件,可以使用如下的语句:phpinclude '/Application/模块名/View/控制器名/模板名.html';这样就可以在当前的模板中引用其他模板文件了。
3. 使用extend和block语句:在ThinkPHP中,模板文件可以通过extend和block语句来继承和重写其他模板文件。
extend语句用于指定所要继承的模板文件,block语句用于定义模板文件中的块。
例如,在子模板中继承父模板的内容,并重写其中的某一块,可以使用如下的语句:phpextend '/Application/模块名/View/控制器名/模板名.html';block 名称...endblock其中,"名称"是要重写的块的名称。
超好用的thinkphp5.0thinkphp5.1分页插件!详细使用步骤(内附代码)

超好⽤的thinkphp5.0thinkphp5.1分页插件!详细使⽤步骤(内附代码)效果tp5.0使⽤⽅法page下载地址: 提取码:s75k1,把page⽂件夹整个⽬录复制到⽬录extend下2,修改默认配置 app/config.php把⾥⾯的'paginate' => ['type' => 'page\Page',//修改这个原始为bootstrap'var_page' => 'page','list_rows' => 5,],3,控制器中 ,参考⼀下$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$delList=Db::table('staff')->where($where)->order('id asc')->paginate(4,false,['query'=>$request->param()]);4,视图中{$delList->render()}tp5.1使⽤⽅法1,把page⽂件夹整个⽬录复制到⽬录extend下2,控制器中的⽅法public function index(Request $request){$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$list=Db::table('staff')->where($where)->order('id asc')->paginate(12,false,['query'=>$request->param(),'type' => 'page\Page','var_page' => 'page']); $page=$list->render();//paginate第⼀个参数为每页显⽰的条数//paginate第⼆个参数为简单模式或总数//paginate第三个参数为分页的条件也可以写数组//总条数$allData=Db::table('staff')->where('status',1)->count();$this->assign('list',$list);$this->assign('page',$page);$this->assign('count',$allData);return $this->fetch('staff-list');}3,视图中,⼀定要写raw,具体含义看⽂档{$page|raw}Page.php 如下图<?phpnamespace page;// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2017 All rights reserved.// +----------------------------------------------------------------------// | Licensed ( /licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: zhangyajun <448901948@>// +----------------------------------------------------------------------use think\Paginator;class Page extends Paginator{//⾸页protected function home() {if ($this->currentPage() > 1) {return "<a href='" . $this->url(1) . "' title='⾸页'>⾸页</a>";} else {return "<p>⾸页</p>";}}//上⼀页protected function prev() {if ($this->currentPage() > 1) {return "<a href='" . $this->url($this->currentPage - 1) . "' title='上⼀页'>上⼀页</a>";} else {return "<p>上⼀页</p>";}}//下⼀页protected function next() {if ($this->hasMore) {return "<a href='" . $this->url($this->currentPage + 1) . "' title='下⼀页'>下⼀页</a>";} else {return"<p>下⼀页</p>";}}//尾页protected function last() {if ($this->hasMore) {return "<a href='" . $this->url($this->lastPage) . "' title='尾页'>尾页</a>";} else {return "<p>尾页</p>";}}//统计信息protected function info(){return "<p class='pageRemark'>共<b>" . $this->lastPage ."</b>页 <b>" . $this->total . "</b>条数据</p>";}/*** 页码按钮* @return string*/protected function getLinks(){$block = ['first' => null,'slider' => null,'last' => null];$side = 3;$window = $side * 2;if ($this->lastPage < $window + 6) {$block['first'] = $this->getUrlRange(1, $this->lastPage);} elseif ($this->currentPage <= $window) {$block['first'] = $this->getUrlRange(1, $window + 2);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);} elseif ($this->currentPage > ($this->lastPage - $window)) {$block['first'] = $this->getUrlRange(1, 2);$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);} else {$block['first'] = $this->getUrlRange(1, 2);$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);}$html = '';if (is_array($block['first'])) {$html .= $this->getUrlLinks($block['first']);}if (is_array($block['slider'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['slider']);}if (is_array($block['last'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['last']);}return$html;}/*** 渲染分页html* @return mixed*/public function render(){if ($this->hasPages()) {if ($this->simple) {return sprintf('%s<div class="pagination">%s %s %s</div>',$this->css(),$this->prev(),$this->getLinks(),$this->next());} else {return sprintf('%s<div class="pagination">%s %s %s %s %s %s</div>',$this->css(),$this->home(),$this->prev(),$this->getLinks(),$this->next(),$this->last(),$this->info());}}}/*** ⽣成⼀个可点击的按钮** @param string $url* @param int $page* @return string*/protected function getAvailablePageWrapper($url, $page){return '<a href="' . htmlentities($url) . '" title="第"'. $page .'"页" >' . $page . '</a>';}/*** ⽣成⼀个禁⽤的按钮** @param string $text* @return string*/protected function getDisabledTextWrapper($text){return '<p class="pageEllipsis">' . $text . '</p>';}/*** ⽣成⼀个激活的按钮** @param string $text* @return string*/protected function getActivePageWrapper($text){return '<a href="" class="cur">' . $text . '</a>';}/*** ⽣成省略号按钮** @return string*/protected function getDots(){return$this->getDisabledTextWrapper('...');}/*** 批量⽣成页码按钮.** @param array $urls* @return string*/protected function getUrlLinks(array$urls){$html = '';foreach ($urls as$page => $url) {$html .= $this->getPageLinkWrapper($url, $page); }return$html;}/*** ⽣成普通页码按钮** @param string $url* @param int $page* @return string*/protected function getPageLinkWrapper($url, $page){if ($page == $this->currentPage()) {return$this->getActivePageWrapper($page);}return$this->getAvailablePageWrapper($url, $page); }/*** 分页样式*/protected function css(){return ' <style type="text/css">.pagination p{margin:0;cursor:pointer}.pagination{height:40px;padding:20px 0px;}.pagination a{display:block;float:left;margin-right:10px;padding:2px 12px;height:24px;border:1px #cccccc solid;background:#fff;text-decoration:none;color:#808080;font-size:12px;line-height:24px;}.pagination a:hover{color:#077ee3;background: white;border:1px #077ee3 solid;}.pagination a.cur{border:none;background:#077ee3;color:#fff;}.pagination p{float:left;padding:2px 12px;font-size:12px;height:24px;line-height:24px;color:#bbb;border:1px #ccc solid;background:#fcfcfc;margin-right:8px;}.pagination p.pageRemark{border-style:none;background:none;margin-right:0px;padding:4px 0px;color:#666;}.pagination p.pageRemark b{color:red;}.pagination p.pageEllipsis{border-style:none;background:none;padding:4px 0px;color:#808080;}.dates li {font-size: 14px;margin:20px 0}.dates li span{float:right}</style>';}}-----------------------------------------------------------------------优化如下:。
thinkPHP5.1模型User设计

thinkPHP5.1模型User设计创建⼀个User类,再引⼊think\Model,让User类继承Model例:<?phpnamespace app\index\model;use think\Model;class User extends Model{}注:模型会⾃动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采⽤驼峰法命名,并且⾸字母⼤写 数据表前缀在database.php的prefix设置,前缀定义例: think_模型设置:默认逐渐为id,要修改主键名,需要在模型中设置属性:$pk=主键设置当前模型对应的完整数据表名称:$table=表名称设置当前数据库连接:$connection=数据库属性描述name模型名(默认为当前不含后缀的模型类名)table数据表名(默认⾃动获取)pk主键名(默认为id)connection数据库连接(默认读取数据库配置)query模型使⽤的查询类名称field模型对应数据表的字段列表(数组)模型初始化:<?phpnamespace app\index\model;use think\Model;class User extends Model{// 模型初始化protected static function init(){//TODO:初始化内容}}模型初始化⽅法通常⽤于注册模型的事件操作。
注:init必须是静态⽅法,并且只在第⼀次实例化的时候执⾏开启⾃动写⼊时间戳字段:配置⽂件: 'auto_timestamp'=>true 'auto_timestamp'=>'datetime'模型类内部: $autoWriteTimestamp=true $autoWriteTimestamp='datetime'设置时间格式'datetime_format' => '\org\util\DateTime',定义时间戳:<?phpnamespace app\index\model;use think\Model;class User extends Model{// 定义时间戳字段名protected$createTime = 'create_at'; protected$updateTime = 'update_at';}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
33.模版的布局和继承
学习要点:
1.模版布局
2.模版继承
本节课我们来学习一下模版中布局的方法,以及模版继承。
一.模版布局
1.默认情况下,不支持模版布局功能,需要在配置文件中开启;
2.在配置文件template.php中,配置开始模版布局功能;
'layout_on'=>true,
3.此时,执行上一节课的模版控制器,会发现提示缺少模版layout.html;
4.这个默认的布局文件,是可以更改的,位置和名字均可配置;
'layout_name'=>'public/layout',
5.我们清空上一节课index.html的模版代码,只写一个“主体”二字;
6.然后将所有的代码拷贝到layout.html的布局模版中去,删除本身的“主体”;
7.然后执行index.html模版时,怎么将主体嵌入到layout.html中去?
8.使用{__CONTENT__}类似魔术方法的标签来引入index.html“主体”内容;
{include file='public/header,public/nav'title='$title'
keywords='这是一个模版!'/} {include file="../application/view/public/nav.html"/}
{__CONTENT__}
{include file='public/footer'/}
9.你可以更改{__CONTENT__},只要在配置文件中配置;
'layout_item'=>'{__REPLACE__}'
10.再强调:再测试的时候,如果更改了配置文件,务必删除temp下编译文件再刷新;
11.上面说的是第一种,配置文件下来开启布局,而第二种方式则不需要开启直接使用;
12.首先,你必须关闭第一种配置,我这里就直接注释掉了,然后使用{layout}标签;
13.只要在index.html的最上面加上如下代码,即可实现模版布局;
{layout name="public/layout"repalce='[__CONTENT__]'}
14.第三种,直接在控制器端执行layout(true)方法即可,false表示临时关闭;
$this->view->engine->layout(true);
15.这种方法,虽然不需要配置文件开启,但如果不用默认的路径,还是要配置路径等;
二.模版继承
1.模版继承是另一种布局方式,这种布局的思路更加的灵活;
2.首先,我们要创建一个public/base.html的基模版文件,文件名随意;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{$title}</title>
</head>
<body>
</body>
</html>
3.创建一个新的方法extend载入新的模版extend.html,然后加载基模版;
{extend name='public/base'}
{extend name='../application/view/public/base.html'}
4.对于模版基类里的变量{$title},直接在控制器设置传值即可;
$this->assign('title','模版');
5.在基模版base.html中,设置几个可替换的区块部分,{block}标签实现;
{block name='nav'}nav{/block}
{block name='include'}{include file='public:nav'}{/block}
{block name='footer'}@ThinkPHP版权所有{/block}
6.在extend.html模版中,改变nav,变成自己所需要的部分;
{block name='nav'}
<ol>
<li>首页</li>
<li>分类</li>
<li>关于</li>
</ol>
{/block}
7.在base.html中,{include}可以加载内容,而在extend.html可以改变加载;
{block name='include'}{include file='public:header'}{/block}
8.在base.html中已设置的内容,可以通过{__block__}加载到extend.html中;
{block name='footer'}
本站来自:{__block__}|翻版必究
{/block}。