首页 / 开发文档 / 导航菜单与栏目

导航菜单与栏目

后台自定义的导航条、栏目树、以及「取一个栏目」—— 页面顶部那条菜单和面包屑靠它们。

适用范围:页头页脚(导航条)、列表页与详情页(当前栏目)。

三个标签的分工

{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}直接子栏目个数
没找到答案? 可以在 联系我们 留言说明使用场景,我们会补充进文档。