## 内容列表:list
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| cid | int/var | 是 | 0 | 分类ID,cid和mid最少传一个 |
| mid | int/var | 是 | 0 | 模型ID,cid和mid最少传一个 |
| orderby | string | 否 | id desc | 结果排序 |
| attr | string/array | 否 | | 扩展属性筛选 |
| keyword | string/var | 否 | | 通过关键字搜索title |
| limit | int | 否 | 20 | 返回结果条数 |
| pagesize | int | 否 | 0 | 分页大小 |
| field | string | 否 | | 设置返回的字段 |
| flag | string | 否 | | 通过推荐旗帜筛选内容 |
| tag | string | 否 | | 通过标签筛选内容 |
| where | string/array | 否 | | 自定义查询条件 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码:栏目页调用当前栏目数据
```
{hisi:list cid="$category['id']"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:通过cid调用内容
```
{hisi:list cid="39"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:通过标签调用文章
```
{hisi:list mid="2" tag="两会" limit="10"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:调用10条置顶文章,按浏览量降序排列
```
{hisi:list mid="2" flag="top" limit="10" orderby="views desc"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:自定义查询条件
```
{hisi:list mid="2" where="'cid = 39'"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:获取扩展模型的某个字段
```
{hisi:list mid="2" field="intro,author"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
```
>[info] 示例代码:文章列表页
```
<!--列表数据-->
{hisi:list cid="39" pagesize="20" field="intro,author"}
<li>[{$i}] <a href="{$r['url']}">{$r['title']}</a></li>
{/hisi:list}
<!--分页代码-->
{$pages|raw}
```
## 栏目列表:category
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| cid | int/string | 是 | 0 | 分类ID,cid、pid、mid最少传一个,多个cid用英文逗号分隔,示例:'1,2,3' |
| pid | int | 是 | 0 | 父ID,cid、pid、mid最少传一个 |
| mid | in | 是 | 2 | 模型ID,cid、pid、mid最少传一个 |
| level | int | 否 | 0 | 返回层级数,0为不限制 |
| limit | int | 否 | 0 | 返回数据条数限制(同时传入pid参数时有效),0为不限制 |
| field | string | 否 | | 设置返回的字段 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码:调用某个分类下面的子分类(只调用2级)
```
{hisi:category cid="39" level="2"}
<li>[{$i}] <a href="{$r['url']}">{$r['name']}</a></li>
{hisi:loop data="$r['childs']" id="rr"}
<li>. <a href="{$rr['url']}">{$rr['name']}</a></li>
{/hisi:loop}
{/hisi:category}
<!--打印完整结果集-->
{:print_r($hisiCategory)}
```
>[info] 示例代码:调用某个模型下面的所有分类
```
{hisi:category mid="2"}
<li>[{$i}] <a href="{$r['url']}">{$r['name']}</a></li>
{hisi:loop data="$r['childs']" id="rr"}
<li>. <a href="{$rr['url']}">{$rr['name']}</a></li>
更多层级嵌套.....
{/hisi:loop}
{/hisi:category}
```
>[info] 示例代码:调用某个分类下面的所有子分类,并获取更多字段
```
{hisi:category cid="39" field="image"}
<li>[{$i}] <a href="{$r['url']}"><img src="{$r['image']}"></a></li>
{hisi:loop data="$r['childs']" id="rr"}
<li>. <a href="{$rr['url']}"><img src="{$rr['image']}"></a></li>
{/hisi:loop}
{/hisi:category}
```
## 标签:tag
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| mid | int/var| 是 | | 指定模型ID |
| orderby | string | 否 | search\_count desc | 排序 |
| limit | int | 否 | 10 | 限制返回数量 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码:调用文章模型下面搜索量最大的10个标签
```
{hisi:tag mid="2" limit="10" orderby="search_count desc"}
<li><a href="{$r['url']}">{$r['name']}</a></li>
{/hisi:tag}
```
## 碎片块:block
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| name | string | 是 | | 碎片名称 |
>[info] 示例代码
```
{hisi:block name="footer" /}
```
## 导航:nav
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| group | string | 否 | | 返回指定分组 |
| limit | int | 否 | 10 | 限制返回数量 |
| cache | bool | 否 | false | 缓存结果集 |
| type | string | 否 | pc | 终端类型(pc,wap) |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码
```
{hisi:nav cache="true"}
<li><a href="{$r['url']}" target="{$r['target']}">{$r['title']}</a></li>
<!--如果有子导航的话-->
{hisi:loop data="$r['childs]" id="rr"}
<li>. <a href="{$rr['url']}" target="{$rr['target']}">{$rr['title']}</a></li>
{/hisi:loop}
{/hisi:nav}
<!--指定分组获取-->
{hisi:nav group="home" cache="true"}
<li><a href="{$r['url']}" target="{$r['target']}">{$r['title']}</a></li>
<!--如果有子导航的话-->
{hisi:loop data="$r['childs]" id="rr"}
<li>. <a href="{$rr['url']}" target="{$rr['target']}">{$rr['title']}</a></li>
{/hisi:loop}
{/hisi:nav}
```
## 友情链接:link
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| type | string | 是 | | 类型,可选值:image,text,all |
| group | string | 否 | | 返回指定分组 |
| orderby | string | 否 | sort asc | 排序 |
| limit | int | 否 | 10 | 限制返回数量 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码
```
{hisi:link type="all"}
<li><a href="{$r['url']}" target="{$r['target']}">{$r['title']}</a></li>
{/hisi:link}
<!--指定分组获取-->
{hisi:link group="home"}
<li><a href="{$r['url']}" target="{$r['target']}">{$r['title']}</a></li>
{/hisi:link}
<!--获取图片友链-->
{hisi:link type="image"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:link}
```
## 幻灯片:slide
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| type | string | 否 | pc | 类型,可选值:pc,wap |
| group | string | 否 | | 返回指定分组 |
| orderby | string | 否 | sort asc | 排序 |
| limit | int | 否 | 10 | 限制返回数量 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码:获取电脑端的幻灯片
```
{hisi:slide type="pc" limit="5"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:slide}
<!--指定分组获取-->
{hisi:slide group="home" type="pc" limit="5"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:slide}
```
>[info] 示例代码:获取移动端的幻灯片
```
{hisi:slide type="wap" limit="5"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:slide}
```
## 当前位置:position
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| cid | int/var | 是 | 0 | 当前分类ID |
| sep | string | 否 | > | 分隔符 |
>[info] 示例代码
```
{hisi:position cid="40" sep=" / "}
<!--返回结果示例-->
你的位置:首页 / 文章 / 国内文章
```
## 推荐:rec
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| name | string | 是 | | 调用名称 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码
```
<!--单层推荐调用-->
{hisi:rec name="pic\_channel"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:rec}
<!--多层推荐调用-->
{hisi:rec name="pic\_channel"}
<div class="floor">
<h3>{$r\['title'\]}</h3>
<ul>
{hisi:loop data="$r\['childs'\]" id="rr"}
<li><a href="{$r['url']}" target="{$r['target']}"><img src="{$r['image']}" alt="{$r['title']}"></a></li>
{/hisi:loop}
</ul>
</div>
{/hisi:rec}
```
## 栏目类型:type
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| tid | int | 是 | | 类型ID |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码
```
{hisi:type tid="$category['type_id']"}
<dl class="attr-dl">
<dt>{$r['name']}:</dt>
<dd>
<a href="{:attr_url($r['id'], '', '')}" class="{:empty(input('get.attr'.$r['id'])) ? 'active' : ''}">全部</a>
{hisi:loop data="$r['values']" id="rr"}
{:attr_url($r['id'], $rr['id'], $rr['name'])}
{/hisi:loop}
</dd>
</dl>
{/hisi:type}
```
## 表单:form
| 属性名 | 类型 | 必须 | 默认 | 说明
| --- | --- | --- | --- | --- |
| name | string | 是 | | 表单名称 |
| id | string | 否 | r | 当前循环变量 |
| key | string | 否 | key | 当前循环键名 |
| index | string | 否 | i | 当前循环的序号变量名 |
>[info] 示例代码
```
<form class="layui-form" action="/cms/api/form_save" method="post">
{hisi:form name="test"}
{switch $r['type']}
{case radio}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline">
{foreach name=":parse_attr($r['options'])" id="vv" key="kk"}
<input type="radio" name="{$r['name']}" title="{$vv}" value="{$kk}" {if ($kk == $r['value'])}checked{/if} />
{/foreach}
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case checkbox}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline">
{foreach name=":parse_attr($r['options'])" id="vv" key="kk"}
<input type="checkbox" name="{$r['name']}[]" value="{$kk}" title="{$vv}" {if (in_array($kk, parse_attr($r['value'])))}checked{/if}> {$vv}
{/foreach}
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case select}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline">
<select name="{$r['name']}">
<option value="">请选择...</option>
{foreach name=":parse_attr($r['options'])" id="vv" key="kk"}
<option value="{$kk}" {if ($kk eq $r['value'])}selected{/if}>{$vv}</option>
{/foreach}
</select>
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case file}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline upload">
<button type="button" class="layui-btn layui-btn-primary layui-upload" lay-data="{accept:'file', data: {timestamp: '{:date('Y-m-d H:i:s')}', sign: '{:md5(date('Y-m-d H:i:s').config('module_cms.api_secret_key'))}', fid: '1', field: '{$r['name']}'}}">点此上传{$r['title']}</button>
<input type="hidden" class="upload-input" name="{$r['name']}" />
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case image}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline upload">
<button type="button" class="layui-btn layui-btn-primary layui-upload" lay-type="image" lay-data="{accept:'image', data: {timestamp: '{:date('Y-m-d H:i:s')}', sign: '{:md5(date('Y-m-d H:i:s').config('module_cms.api_secret_key'))}', fid: '1', field: '{$r['name']}'}}">点此上传{$r['title']}</button>
<input type="hidden" class="upload-input" name="{$r['name']}" />
<img src="" onerror="this.src='__ADMIN_IMG__/theme.png';" style="border-radius:5px;border:1px solid #ccc" width="36" height="36">
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case password}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline">
<input type="password" class="layui-input" name="{$r['name']}" value="{$r['value']}" />
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/case}
{case hidden}
<input type="hidden" name="{$r['name']}" value="{$r['value']}" />
{/case}
{default /}
<div class="layui-form-item">
<label class="layui-form-label">{$r['title']}</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="{$r['name']}" value="{$r['value']}" />
</div>
<div class="layui-form-mid layui-word-aux">{$r['tips']}</div>
</div>
{/switch}
{/hisi:form}
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="hidden" name="fid" value="{$hisiFormFid}" />
<input type="hidden" name="timestamp" value="{:date('Y-m-d H:i:s')}" />
<input type="hidden" name="sign" value="{:md5(date('Y-m-d H:i:s').config('module_cms.api_secret_key'))}" />
<button type="submit" class="layui-btn layui-btn-normal" lay-submit="" lay-filter="formSubmit">提交</button>
</div>
</div>
</form>
<!--当前示例是基于layui,所以下面必须引入layui-->
<script type="text/javascript" src="__PUBLIC_JS__/layui/layui.js"></script>
<script type="text/javascript">
layui.use(['jquery', 'form', 'layer', 'upload'], function(){
var $ = layui.jquery, form = layui.form, layer = layui.layer, upload = layui.upload;
form.on('submit(formSubmit)', function(data) {
var that = $(this), _form = that.parents('form'), text = that.text();
that.prop('disabled', true).text('提交中...');
$.ajax({
type: "POST",
url: _form.attr('action'),
data: _form.serialize(),
success: function(res) {
that.text(res.msg);
if (res.code == 0) {
that.prop('disabled', false).removeClass('layui-btn-normal').addClass('layui-btn-danger');
setTimeout(function(){
that.removeClass('layui-btn-danger').addClass('layui-btn-normal').text(text);
}, 3000);
} else {
that.text('保存成功');
setTimeout(function(){
location.reload();
}, 3000);
}
}
});
return false;
});
upload.render({
elem: '.layui-upload'
,url: '/cms/api/upload'
,method: 'post'
,before: function(input) {
layer.msg('上传中...', {time:3000000});
},done: function(res, index, upload) {
var obj = this.item;
if (res.code == 0) {
layer.msg(res.msg);
return false;
}
layer.closeAll();
var input = $(obj).parents('.upload').find('.upload-input');
if ($(obj).attr('lay-type') == 'image') {
input.siblings('img').attr('src', res.data.file).show();
}
input.val(res.data.file);
$(obj).parents('.upload').find('button').text('上传成功');
}
});
});
</script>
```
- 序言
- 环境配置
- 下载及安装
- 目录结构
- 系统配置
- 多语言
- 命令行(pro版)
- 自动生成模块或插件(build)
- 生成模块
- 生成插件
- 自动生成增删改查(crud)
- 第一步:创建数据表
- 第二步:使用crud指令生成
- 自动生成类库文件(make)
- 生成控制器文件(make:controller)
- 生成模型文件(make:model)
- 生成逻辑文件(make:logic)
- 生成服务文件(make:service)
- 生成验证器文件(make:validate)
- 构建器(pro版)
- 表单构建器(form)
- 表单属性设置
- 添加表单项
- 文本框(text)
- 隐藏域(hidden)
- 密码框(password)
- 文本域(textarea)
- 单文件(file)
- 多文件(files)
- 单图(image)
- 多图(images)
- 开关(switch)
- 单选(radio)
- 多选(checkbox)
- 下拉框(select)
- 标签(tag)
- 日期时间(datetime)
- 颜色选择器(color)
- 富文本编辑器(editor)
- 滑块(slider)
- 评分(rate)
- 穿梭框(transfer)
- 进度条(progress)
- 树形(tree)
- 联动(linkage)
- 自定义html(html)
- 分隔线(line)
- 文字(txt)
- 下拉框增强版(select+)
- 数据表格(table)
- 添加表单分组(group)
- 栅格布局(grid)
- 触发器(trigger)
- 通用上传方法
- 表格构建器(table)
- 表格基础配置
- 添加表头工具栏
- 添加表格筛选
- 页面提示(pageTips)
- 引入 JS 文件
- 引入 CSS 文件
- 渲染额外 JS 代码
- 渲染额外 CSS 代码
- 模块开发
- 1.生成模块
- 2.创建菜单
- 3.创建控制器
- 后台通用方法
- 插件开发
- 1.新建插件
- 2.插件配置
- 3.插件控制器
- 4.插件模板
- 5.插件钩子
- 模板替换变量
- 公共函数库
- 后台通用JS方法
- 常见问题
- 官方模块
- CMS内容管理模块
- 目录结构
- 模板标签
- API接口
- 栏目页/内容页
- 小程序发布
- 官方插件
- 第三方登录
- excel插件
- 万能采集
- 采集规则
- 采集内容