集合字段自动解析(autoparse)
自动为 tags、checkbox、transfer、articlecheckbox、imgupload、fileupload 等集合类型字段添加 _array 后缀数组属性,前台模板可直接循环输出,无需手动 explode 解析。
问题背景
1CMS 中集合类型输入框的数据以 ; 或 | 分隔存储:
| 输入框 | 存储格式 | 示例 |
|---|---|---|
| imgupload(图集) | 路径1;路径2;路径3 |
/upload/a.png;/upload/b.png |
| fileupload(文件集) | 路径1;路径2;路径3 |
/files/doc.pdf;/files/xls.xlsx |
| tags(单列) | 值1;值2;值3 |
1.jpg;2.jpg;3.jpg |
| tags(多列) | 列1|列2;列1|列2 |
张三|25;李四|30 |
| checkbox | 值1;值2;值3 |
red;green;blue |
| transfer | 值1;值2;值3 |
1;3;5 |
| articlecheckbox | 值1;值2;值3 |
101;102;103 |
前台模板调用时必须手动解析:
{* 以前:需要原生PHP手动解析 *}
{php}$pics=explode(';',$article.pics);{/php}
{loop $pics as $pic}
<img src="{$pic}">
{/loop}
解决方案
安装本插件后,集合类型字段会自动附带 _array 后缀的数组属性,模板中直接使用即可:
{* 现在:直接使用 _array 后缀 *}
{loop $article.pics_array as $pic}
<img src="{$pic}">
{/loop}
自动解析
插件通过监听钩子自动工作,无需任何配置。
文章字段
当 cms:article:get 返回文章列表时,自动为集合类型字段添加 _array 属性:
{* 图集字段(imgupload) *}
{* 原始值 pics = "/upload/a.png;/upload/b.png;/upload/c.png" *}
{loop $pics_array as $pic}
<img src="{$pic}">
{/loop}
{* 单列 tags 字段 *}
{* 原始值 tags = "tag1;tag2;tag3" *}
{loop $article.tags_array as $tag}
<span>{$tag}</span>
{/loop}
{* 多列 tags 字段(如2列:图片|链接) *}
{* 原始值 banners = "a.jpg|/about/;b.jpg|/contact/" *}
{loop $article.banners_array as $row}
<a href="{$row.1}"><img src="{$row.0}"></a>
{/loop}
{* checkbox 字段 *}
{* 原始值 colors = "red;green;blue" *}
{loop $article.colors_array as $color}
<span class="tag-{$color}">{$color}</span>
{/loop}
栏目变量
当 cms:channel:get 返回栏目信息时,同样自动添加 _array 属性:
{* 栏目变量中的集合类型 *}
{loop $.banners_array as $banner}
<img src="{$banner}">
{/loop}
{* 跨栏目调用 *}
{$channel=cms:channel:get(66618101)}
{loop $channel.pics_array as $pic}
<img src="{$pic}">
{/loop}
兼容说明
- 原始字符串值不变,
$article.pics仍返回"/upload/a.png;/upload/b.png" _array是新增属性,不影响已有模板代码- 仅前台生效,后台管理页面不受影响
手动解析方法
如果不想依赖自动钩子,或需要自定义解析,可使用以下模板方法:
split — 解析分隔字符串
{* 默认分号分隔 *}
{$pics=autoparse:split($article.pics)}
{* 自定义分隔符 *}
{$tags=autoparse:split($article.tags,|)}
splitTags — 解析 tags 多列格式
{* 单列 *}
{$items=autoparse:splitTags($article.pics)}
{* 多列(2列) *}
{$rows=autoparse:splitTags($article.info,2)}
{loop $rows as $row}
姓名:{$row.0}, 年龄:{$row.1}
{/loop}
channelVar — 解析指定栏目集合变量
{* 获取并解析栏目ID为66618101的pics变量 *}
{$pics=autoparse:channelVar(66618101,pics)}
{loop $pics as $pic}
<img src="{$pic}">
{/loop}
{* 使用当前栏目ID *}
{$pics=autoparse:channelVar($.id,pics)}
支持的输入框类型
| 输入框 | 标识 | 自动解析 | 手动方法 |
|---|---|---|---|
| 图片上传(图集) | imgupload | ✅ | split |
| 文件上传(文件集) | fileupload | ✅ | split |
| 多项文本框 | tags | ✅ | splitTags |
| 多选框 | checkbox | ✅ | split |
| 穿梭框 | transfer | ✅ | split |
| 文章多选框 | articlecheckbox | ✅ | split |
要求
- 1CMS ≥ 5.x
- PHP ≥ 5.6