注:对于文章而言,channel_id为栏目编号,id为内容编号,用法类似。
栏目channel_id可以是一个固定值:3
{content@list cid="3"}
id可以是多个值固定值,相当于in(ids)
{channel@list id="2,4,6"}或{channel@list id="in(2,4,6)"}
id一个表达式
gt|eq|lt|egt|elt|neq|<|>|=|!=|in|notin|not in|like|not like|notlike|between|not between|notbetween
避免使用尖括号> <,因为有些编辑器会识别为html标签起止符号,代码解析错误报警告
{content@list cid="gt 5"}
注意:id只能一个条件,不支持and多条件写法,如 id="gt 3 and lt 10"是错误的
多个条件时,可以使用where
{content@list where="id gt 30 and id elt 40"}
限制输出数量,如num="3"
指定排序方式,如order="sort asc"
指定循环变量,如item="hello",默认为@前面的名称,如content。在某些情况下多列表嵌套时指定不同名称可 能有用。
指定查询字段,如fields="id,title,description",默认是所有字段。谨慎使用,有的字段在表间关联时需要。
使用缓存,如cache="index_news_7,3600"
{list cid="7" num="3" order="sort asc" item="hello" cache="index_news_7,3600"}
分页列表,使用pagesize参数后,列表会分页显示,如pagesize="5",每页显示5条记录
注意区分num和pagesize,使用num不产生分页链接
控制分页导航位置,正常情况下,分页连接跟随列表后面,可以使用links="no"列表下面的分页链接暂不显示
然后可以在其他地方输出分页链接
{content@list id="between 70 and 90" pagesize="5" links="no"}
列表赋值,可以使用assign="mylist",将列表内容赋值给变量mylist,可以在其他地方输出
{content@list where="title like '%经济%'" num="3" assign="mylist"}
读取id为100的文章内容
{content@get id="100"}
读取id为5的栏目
{channel@get id="5"}
id=""parent_id=""where=""【语法糖pid=""cid=""都相当于parent_id=""】
{channel@list}
{channel@get}
id=""channel_id=""where=""【语法糖cid=""都相当于channel_id=""】
{content@list}.....{/content@list}
{content@get/}
id=""position_id=""where=""【语法糖cid=""都相当于position_id=""】
{banner@list}.....{/banner@list}
{banner@get/}
id=""where=""
{position@list}.....{/position@list}
{position@get/}
id=""where=""
{tag@list}.....{/tag@list}
{tag@get/}
list为闭环标签
{content@list ...}
{/content@list}
get非闭环标签
{content@get ...}
内容html
或{content@get .../}
内容html
注意cid=""是语法糖
content@中等同于:channel_id=""
channel@中等同于:parent_id=""
banner@中等同于 position_id=""
{content@list cid="3"}相当于{content@list channel_id="3"}
where中会尝试替换cid为真实字段,但因为where表达式复杂,可能会替换失败。所以使用where条件时,最好使用真实字段名。
{content@list where="channel_id=3"}
其实常用的数据表,直接使用上面的标签就可完成了。但对于没有支持的其他表,可以支持使用list或get标签。
使用其他表,需要指定表名,如table="cms_content"
表达式只支持主键id="xxx"where="xxx",不支持cid="xxx"
list
循环变量默认为item,其他使用item="xxx"指定
{list table="cms_content" where="channel_id in(6,7,8)"}
get
变量默认为data,其他使用assign="xxx"指定
{get table="cms_channel" id="6"}
内容列表:默认{content@list}就行,pagesize、order等参数会自动注入后台配置,若不使用注入的,可添加对应参数覆盖
内容详情:数据会自动注入$content,不需要再使用{content@get}标签重复获取
动态页面用于是复杂,不特定的内容,自由发挥
模板存放在dynamic目录下
如dynamic/test.html目录下,访问路径为http://yourhost.com/e/test
单页必须绑定一篇文章,访问路径层级更高,一般用于突出显示的内容
如about.html,访问路径为http://yourhost.com/about.html
而普通内容访问路径为http://yourhost.com/content/a1.html
1、字符截取more($str,$len,$more='...更多')
如截取标题长度为36,若长度超过36,则显示...更多
使用方式1(管道):{$content.title|more=36,'...更多'}
或方式2(方法):{:more($content.title,36,'...更多')}
2、获取指定栏目的url:channel_url($id)
如:输出id为3的栏目的url:{:channel_url(3)}:#
3、获取指定内容的url:content_url($id)
如:输出id为3的内容的url:{:content_url(3)}:/d/3.html
4、也可以自定义其他助手方法,例如对应thinkphp框架,可以在`app/common.php`(tp5为:`application/common.php`)中定义方法
<?php
function text666($text){
return $text .' 666';
}
模板中使用:{:text666('hello')},输出为:hello 666
5、当然也可以使用内置方法:thinkphp内置方法
主题存放在网站根目录的/theme/
系统自带默认主题为default,生成路径为/,访问路径为http://yourhost.com/
可以开发多个主题,如mobile,生成路径为/m/,访问路径为http://yourhost.com/m/
主题目录结构如下:
├─channel [存放栏目模板]
├─default.html [栏目默认模板,未绑定模板的栏目使用此模]
└─.... [创建更多模板并绑定栏目]
├─common [公共片段,如头部、底部]
├─footer.html [底部]
├─header.html [头部]
├─layout.html [基础模板,继承模式时有用]
├─navi.html [导航]
└─.... [创建更多页面]
├─content [存放内容详情模板]
├─default.html [详情默认模板,未绑定模板的栏目使用此模]
└─.... [创建更多模板并绑定栏目]
├─dynamic [存放动态解析模板]
├─demo.html [演示页面]
├─search.html [搜索页面]
├─tag.html [合集页面]
└─.... [创建更多页面]
├─static [存放主题静态资源]
├─css [样式]
├─images [图片]
├─js [脚本]
└─.... [其他目录、文件]
├─about.html [单页:关于我们,可绑定一篇文章]
├─contact.html [单页:联系我们,可绑定一篇文章]
├─index.html [首页]
└─.... [创建更多单页]
页面类型说明
公共片段:供其他页面引用,使用{include}标签引用
栏目模板:默认会注入当前栏目变量`$channel`,不需要再使用{channel@get}重复读取了。直接使用{$channel.name}等标签输出栏目信息即可。使用{content@list}读取所属文章列表,一般不需要额外的参数,栏目id,分页大小、排序等都会注入栏目后台设置。若需要个性化再按需使用相关参数设置。
详情模板:默认会注入当前内容变量`$content`,不需要再使用{content@get}重复读取了。直接使用{$content.title}等标签输出文章信息即可。
动态解析模板:使用比较自由,可做栏目列表也可做详情页,或者更复杂的组合。不像[栏目模板]和[详情模板]会有默认的注入或行为,纯看标签的写法。
单页:可绑定已篇文章,绑定后和详情模板用法一样。若不绑定文章,用法和动态解析模板用法一样。
不同页面类型的区别:
详情页:访问路径为二级:/d/xx.html,全部可生成静态化。
栏目页:访问路径为二级:/c/xx.html 或 /c/xx-p.html。
可以静态化第一页,如/c/4.html、/c/c4-1.html可静态化,[/c/4-2.html....]不可静态化。
动态解析页:不可静态化,每次访问都要动态解析,并可自动注入url参数。访问路径为二级:/e/xx.html
如url:`/e/test?a=1&b=2` 动态解析页:
可在模板中使用:
{content@list cid="$a" num="$b"}
{/content@list}
安全事项,注入的参数会进行基本的strip_tags()过滤,并且查询条件不会拼接字符串。
但从谨慎的角度考虑,对于一些明确类型的参数,可进行类型转换,
如上面的参数a、b可明确为数字类型,可以使用php的`intval()`函数进行转换:
{content@list cid=":intval($a)" num=":intval($b)"}
{/content@list}
单页:绑定文章的可静态化,不绑定文章的不可静态化。访问路径为一级:/xx.html(与首页index.html同级)
栏目页默认为:[id],[id]代表栏目编号,id为2的栏目访问路径为`/c/2.html`,假如栏目名称为[新闻],那可以把[id]修改为news,那此栏目的路径为`/c/news.html`。
详情页默认为:[id],[id]代表文章编号,id为100的文章访问路径为`/d/100.html`,假如此文章属于[新闻]栏目,那可以把[id]修改为news-[id],那此文章的路径为`/d/news-100.html`
以上操作在栏目编辑的【生成设置】中操作
符串替换写法:/theme/default/css/style.css
或相对路径:../static/css/style.css、./static/css/style.css
以上路径会被替换为/theme/xxx/css/style.css
不能使用绝对路径,如:/static/css/style.css
约定规则,静态资源应放在主题所在目录的/static/目录下,并在此修改,然后发布到/theme/xxx/目录下。
不要直接修改/theme/xxx/里面的静态资源,以免被覆盖。
如你不想这样,可以像上面说的使用绝对路径/static/css/xxx.css
1、当前模板的静态资源路径@static@:/theme/default/
2、当前模板的首页路径@site_home@:/
在页面任意位置使用标签:{show@vars}将显示当前页面环境变量,这些变量在套标签时也许有用。
如当页面前环境变量为:
{
"__site_home__": "/",
"__wconf__": {
"name": "滇运安物流系统",
"keywords": "滇运安物流系统,滇运安,滇运安物流系统,物流",
"description": "滇运安物流系统",
"copyright": "Copyright © 2025. 滇运安物流系统 All rights reserved.",
"click_make_static": "123",
"click_write": "10",
"use_layout": "1",
"make_static": "0"
},
"__set_page_path__": "",
"__page_type__": "dynamic",
"html_id": "3",
"tpl_id": "1"
}
thinkphp:模板标签使用文档
演示页面不需要请删除此文件(/theme/xxx/dynamic/demo.html),重新生成路由(后台菜单-模板管理-生成路由)