苹果CMS内置的`volist`、`foreach`等标签虽然能满足基础列表调用,但在面对复杂的数据统计、多表关联查询或特定字段排序时,直接使用SQL标签是最高效的解决方案。SQL标签允许开发者直接编写原生SQL语句,绕过模板引擎的解析逻辑,直接从数据库获取精准数据。
SQL标签的标准调用格式为`{m:sql name="变量名" sql="SQL语句" cache="缓存时间"}`。其中`name`属性用于定义后续循环中使用的变量名,`sql`属性即执行的SQL语句,`cache`属性(可选)以秒为单位设置缓存时间,对于高并发站点建议开启。
在使用SQL标签时,需特别注意数据表前缀。苹果CMS默认表前缀为`mac_`,如果你的系统修改了前缀,请务必在SQL语句中替换,或者使用`{table:name}`形式,系统会自动替换为正确的表前缀。
场景需求:在首页展示分类ID为1、2、3下的视频,且要求必须是今日更新的,并按照播放量倒序排列,限制显示10条。
实现代码:
{m:sql name="vod_today" sql="SELECT FROM {table:vod} WHERE vod_cid IN (1,2,3) AND TO_DAYS(vod_time.vod_time) = TO_DAYS(NOW()) ORDER BY vod_hits DESC LIMIT 10"}
{loop $vod_today $v}
{$v.vod_name}
{$v.vod_hits}次播放
{/loop}
{/m:sql}
代码解析:这里使用了`{table:vod}`自动匹配表前缀。`TO_DAYS`函数用于对比日期,确保只提取今日数据。`IN (1,2,3)`实现了多分类筛选。`$v`即为循环体内的单条数据对象,可以直接调用数据库字段。
场景需求:在视频列表中直接显示该视频所属的分类名称,而不依赖系统内置的`$type.vod_name`嵌套,通过SQL一次性解决。
实现代码:
{m:sql name="vod_list" sql="SELECT v., t.type_name FROM {table:vod} v LEFT JOIN {table:type} t ON v.vod_cid = t.type_id WHERE v.vod_status=1 ORDER BY v.vod_id DESC LIMIT 5"}
{loop $vod_list $v}
片名:{$v.vod_name}
分类:{$v.type_name}
{/loop}
{/m:sql}
操作细节:通过`LEFT JOIN`将`mac_vod`表与`mac_type`表关联。在`SELECT`中使用`v., t.type_name`,`v.`获取视频所有字段,`t.type_name`获取分类名称。这样在循环中直接使用`{$v.type_name}`即可,无需再次查询数据库,大幅降低查询次数。
当一段代码在多个模板中重复出现,或者逻辑过于复杂导致模板臃肿时,自定义标签是最佳选择。苹果CMS支持在`/template/default/html/label/`目录下创建自定义标签文件,系统会自动识别并解析。
请打开你的网站根目录,进入`template/default/html/label/`。如果不存在`label`文件夹,请手动创建。在该文件夹下新建一个文件,命名为`my_rank.html`。这个文件将用于封装一个“周榜”逻辑。

打开`my_rank.html`,输入以下代码。这段代码将接收一个参数`cid`(分类ID),并返回该分类下的一周内热门视频。
0){
$where .= " AND vod_cid = " . $cid;
}
// 查询最近7天的数据
$sql = "SELECT FROM {table:vod} $where AND vod_time > DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY vod_hits DESC LIMIT $limit";
$rc = $db -> query($sql);
?>
核心注意:在自定义标签的PHP代码块中,必须使用`$db`对象进行数据库操作,这是苹果CMS全局数据库对象。`$label`数组用于接收调用时传入的参数。
回到任意HTML模板文件(如`index.html`),使用以下代码调用刚才创建的标签。
{label:my_rank cid=1 limit=5}
操作说明:`cid=1`表示调用分类ID为1的数据,`limit=5`表示只显示5条。这种调用方式极大地简化了主模板的代码量,且修改逻辑时只需编辑`my_rank.html`一个文件即可全站生效。
在实际开发中,经常需要根据数据的特定属性展示不同的样式或内容。苹果CMS模板引擎支持在标签内部进行逻辑判断,配合PHP标签可实现复杂的业务逻辑。
场景:在视频列表中,如果“完结”状态显示绿色标签,如果是“连载中”显示红色标签,并显示连载集数。
{m:volist name=":vod('level=9')"}
{$vo.vod_name}
{if $vo.vod_state == '完结'}
{$vo.vod_state}
{elseif $vo.vod_state == '连载中'}
{$vo.vod_state} {$vo.vod_remarks}
{else}
{$vo.vod_state}
{/if}
{/m:volist}
细节提示:`$vo.vod_remarks`字段通常存储备注信息,如“更新至12集”。通过`{if}...{elseif}...{else}...{/if}`结构,可以灵活控制HTML输出。
系统默认的日期格式可能不符合设计需求,可以使用`{php:...}`标签进行即时处理。
{m:volist name=":vod('num=10')"}
{$vo.vod_name}
发布时间:{php:echo date('Y-m-d', strtotime($vo['vod_time']));}
{/m:volist}
技术解析:在`{php:}`标签中,可以直接使用PHP原生函数。这里使用`strtotime`将字符串时间转换为时间戳,再用`date`函数格式化为`年-月-日`。注意在双引号字符串中使用数组变量`$vo['vod_time']`比对象属性`$vo->vod_time`更稳定。
高阶调用必须考虑服务器性能。对于不频繁变动的数据(如排行榜、网站底部统计),强制开启缓存是必须的操作。
修改第一节的SQL调用代码,增加`cache`参数。
{m:sql name="hot_data" sql="SELECT FROM {table:vod} ORDER BY vod_hits DESC LIMIT 10" cache="3600"}
配置说明:`cache="3600"`表示该查询结果将在服务器缓存3600秒(1小时)。在这1小时内,所有用户访问该页面都直接读取缓存文件,不再执行数据库查询。这对于高并发访问的首页至关重要。
分页标签通常不建议开启长时间缓存,因为用户翻页频率较高。但对于“全站文章归档”这类冷门页面,可以设置短缓存。
{m:page name="article_list" page="$page" limit="10" url="article/index" cache="60"}
实操建议:在开发调试阶段,请将`cache`设置为`0`或删除该参数,以便实时看到代码修改效果。上线部署前,再根据数据更新频率合理设置缓存时间。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图