一个可用的模板至少包含这些文件:
templates/你的模板名/
├── info.json 模板元信息(必填)
├── header.html 公共头部
├── footer.html 公共页脚
├── index.html 首页
├── list.html 列表页
├── detail.html 详情页
├── page.html 单页
├── 404.html 错误页
├── style.css 样式
├── sa.js 交互脚本(可选)
└── lang/
├── cn.php 中文词条
└── en.php 英文词条
模板目录位于 Web 根之外,浏览器无法直接访问源文件;样式与脚本通过模板资源路由输出。
{
"name": "hardware",
"title": "五金定制零件外贸询盘模板",
"type": "template",
"version": "1.0.0",
"cms_min_version": "1.0.0",
"description": "深色工业风,含加工能力、材质表与 RFQ 询盘联动。",
"author": "LeadoCMS",
"is_free": false,
"price": 199
}
name 必须与目录名一致version 与 cms_min_version 必须是 x.y.z 语义化版本is_free 为 false 时 price 必须大于 0样式和脚本用 {lc:template} 前缀,它会输出当前模板的资源地址:
<link rel="stylesheet" href="{lc:template}style.css">
<script src="{lc:template}sa.js" defer></script>
不要写死 /templates/default/,换模板后就会 404。
{lc:include file="header.html" /} 引入片段{lc:template} 模板资源前缀{lc:breadcrumb} 面包屑{lc:contentlist num="9" page="1"} ... {/lc:contentlist} 内容循环{lc:item.url}、{lc:item.title}、{lc:item.image}、{lc:item.description len="80"} 循环内字段{lc:pagedList} 分页条,{lc:pageinfo} 分页信息{lc:category.title}、{lc:category.description}、{lc:category.body raw="1"} 当前栏目{lc:related num="3"} 相关内容{lc:nav} 导航、{lc:langlist} 语言切换、{lc:hreflang} 多语言互链{lc:site.email}、{lc:site.phone} 站点配置项{lc:phrase.xxx} 界面词条只支持结构化比较,不支持写表达式:
{lc:if field="item.image" op="notempty"}
<img src="{lc:item.image}" alt="{lc:item.title}" loading="lazy">
{lc:else /}
<div class="card-ph">暂无图片</div>
{/lc:if}
op 支持 ==、!=、>、<、empty、notempty,默认是 ==。
也可以拿词条做条件,用来实现「某个词条留空则整块不输出」:
{lc:if field="phrase.cert_note" op="notempty"}
<p class="cert-note">{lc:phrase.cert_note}</p>
{/lc:if}
lang/cn.php 与 lang/en.php 是纯 PHP 数组:
<?php
return [
'brand_sub' => '精密制造 · 全球交付',
'request_quote' => '立即询价',
'side_lead_t' => '交期',
];
模板里用 {lc:phrase.key} 取值。缺键时回退到默认语言,不会报错。
在系统设置的「模板」一项里改模板名即可切换。切换后要重新静态化一次。
模板之间只共享数据,不共享样式,所以换模板不会丢内容。