导航菜单与栏目
后台自定义的导航条、栏目树、以及「取一个栏目」—— 页面顶部那条菜单和面包屑靠它们。
适用范围:页头页脚(导航条)、列表页与详情页(当前栏目)。
三个标签的分工
{naicha:navs}type(top/foot)、num;后台「导航管理」里自己配的那一条。页头页脚的主导航都用它。行内写 {navitem.name} {navitem.url} {navitem.target} {navitem.type} {navitem.sort}{naicha:nav}num(默认 20);站点的栏目树(不是后台配的导航)。行内同 sort 的字段,另有 {nav.children}(子栏目数组,再套一层 {naicha:loop from="nav.children" as="c"}){naicha:sort}id(默认当前栏目);取一个栏目。行内写 {sort.name} {sort.intro} {sort.url} {sort.alias} {sort.cover} {sort.seo_title} {sort.seo_keywords} {sort.seo_desc} {sort.type} {sort.template}。取不到栏目时整块不输出栏目字段(一条不漏)
下面这张表是 {naicha:sort} / {naicha:nav} 循环体里全部能取到的字段。
每个栏目就是「栏目表的一行」,所以栏目表有的列,模板里都能取 —— 包括平时用不到的。
{sort.id}栏目 id(拿它去 {naicha:url type="list" cid="…"});—{sort.pid}父栏目 id。0 表示它是一级栏目 —— 判断「是不是顶级」看它;—{sort.name}栏目名称;—{sort.alias}栏目别名(拼地址、做锚点用);空串{sort.url}栏目地址(已带语言前缀,别再自己拼);—{sort.type}栏目类型:list 列表 / page 单页;—{sort.template}这个栏目指定的模板文件(空 = 走主题默认);空串{sort.detail_template}这个栏目的内容用哪套详情版式;空串{sort.cover}栏目大图(相对路径,模板里拼图要留神多级地址);空串{sort.intro}栏目简介(列表页那句导语);空串{sort.seo_title}栏目的 SEO 标题;空串,回落用 {naicha:site name="title"}{sort.seo_keywords}栏目的 SEO 关键词;空串{sort.seo_desc}栏目的 SEO 描述;空串{sort.sort}后台填的排序值(越小越前);—{sort.status}是否显示(1/0);—{sort.lang}栏目属于哪个语言(空串 = 不限语言);空串{nav.children}子栏目数组(只有 {naicha:nav} 有),配 {naicha:loop} 再展开一层;空数组⚠️ {sort.cover} 是相对路径(如 uploads/2026xx/a.jpg)。
在 /list/cid-3 这种多层地址下直接塞进 src 会变成 /list/uploads/…,图全裂 ——
要用就自己在前面补 /,或者干脆用 {naicha:asset} 那类生成好的地址。
导航条字段
{navitem.id}导航项 id{navitem.name}导航文字{navitem.url}跳转地址(后台填的,不做语言前缀处理 —— 填什么就是什么){navitem.target}打开方式(_self / _blank){navitem.type}属于哪一条导航条(top / foot){navitem.sort}排序值顶部导航(带当前项高亮)
<!-- [页头] 后台自定义导航 + 当前路径比较 -->
{naicha:navs type="top" num="10"}
<a href="{navitem.url}" target="{navitem.target}"
class="{naicha:if var="navitem.url" eq="{currentPath}"}on{/naicha:if}">{navitem.name}</a>
{/naicha:navs}
高亮靠 {currentPath} 和导航项的 url 比 ——
引擎把两者都规范化过,所以带不带结尾斜杠都能对上。
栏目树(两级)
<!-- [页头] 用栏目树做下拉菜单 -->
{naicha:nav num="8"}
<a href="{nav.url}">{nav.name}</a>
{naicha:if var="nav.children" notempty="1"}
<ul class="sub">
{naicha:loop from="nav.children" as="c"}
<li><a href="{c.url}">{c.name}</a></li>
{/naicha:loop}
</ul>
{/naicha:if}
{/naicha:nav}
列表页与详情页的「当前栏目」
<!-- [列表页] 页面大标题直接用当前栏目 -->
<div class="page-head">
<h1>{sort.name}</h1>
<p>{sort.intro}</p>
</div>
<!-- [详情页] 面包屑用 crumbs 数组 -->
<nav class="crumb">
<a href="/">首页</a>
{naicha:loop from="crumbs" as="c"}
<span>/</span><a href="{c.url}">{c.name}</a>
{/naicha:loop}
</nav>
取某个指定栏目
<!-- [任意] 按 id 取固定栏目(首页的「关于我们」入口)-->
{naicha:sort id="7"}
<a href="{sort.url}">{sort.name}</a>
{/naicha:sort}
取不到栏目时整块不输出 —— 栏目被删掉后页面不会留一个空壳,也不会报错。
栏目自定义字段(后补的)
{sort.def1} {sort.def2} {sort.def3}三个自由字段,
后台「栏目管理」里填,模板里随便怎么用:副标题、英文名、角标文案都行。留空就不输出内容有内容模型的字段引擎,栏目没有 —— 所以给了这三个。要挂的东西超过三个, 那多半该建成一个内容模型,而不是继续往栏目上堆。
父栏目 / 顶级栏目 / 计数(后补的)
{sort.parentname} {sort.parenturl}父栏目(一级栏目这两个是空串){sort.topname} {sort.topurl}顶级栏目(自己就是一级时,等于自己){sort.rows}这个栏目下已发布的内容条数{sort.soncount}直接子栏目个数