首页、列表页、详情页的标签组合

把标签按页面类型组合起来:首页取推荐与热门,列表页做分页,详情页接上下篇、相关内容和评论。

标签本身不难,难的是知道每种页面该放哪些。下面按页面类型给出可直接套用的骨架,参数说明见标签手册。

首页

首页没有“当前栏目”,arclist 建议用 flag、tag 或 typeid 限定范围,否则取到的是全站内容。

<header>
  {djm:nav mode="tree" depth="2" row="100"}{/djm:nav}
</header>

{djm:arclist row="6" flag="recommend" orderby="published_at" orderdir="desc"}
  <article>
    <h2><a href="[field:url/]">[field:title/]</a></h2>
    <p>[field:summary/]</p>
  </article>
{/djm:arclist}

{djm:hotlist row="5" orderby="views" startday="30"}
  <a href="[field:url/]">[field:title/]</a>
{/djm:hotlist}

列表页

列表页用 list 读取当前栏目,paginate="1" 创建分页上下文,pagelist 必须和它成对出现。

<div class="crumbs">{djm:crumbs separator=" / "/}</div>
<h1>{djm:field.name/}</h1>

{djm:list row="12" paginate="1" orderby="published_at" orderdir="desc"}
  <a href="[field:url/]">[field:title/]</a>
{/djm:list}

{djm:pagelist pagesize="7" prevtext="上一页" nexttext="下一页"/}

一页里不要放两个 paginate="1" 的循环,分页上下文会互相覆盖。需要侧栏“最新内容”时用 arclist 且不要开 paginate。

详情页

详情页的字段直接用 {djm:field.},正文走 raw="1",底部依次接上下篇、相关内容和评论。

<h1>{djm:field.title/}</h1>
<time>{djm:date field="published_at" format="Y-m-d"/}</time>
<div class="prose">{djm:field.ext.body raw="1"}</div>

{djm:prenext type="pre" prenone="已经是第一篇"/}
{djm:prenext type="next" nextnone="已经是最后一篇"/}

{djm:related row="6" exclude="1"}
  <a href="[field:url/]">[field:title/]</a>
{/djm:related}

{djm:comments row="20"}
  <p>[field:body/]</p>
{/djm:comments}

{djm:commentform/}

搜索页

<p>关键词:{djm:var.search.keyword/}</p>

{djm:search row="15" highlight="1" paginate="1" none="没有找到相关内容"}
  <a href="[field:url/]">[field:title/]</a>
{/djm:search}

{djm:pagelist/}

highlight="1" 会把命中的词包进 <mark>,标题要输出到属性时改用 title_plain,避免标签混进 alt。

栏目单页

在后台给栏目配置了正文或自定义字段时,单页模板可以直接读取:

<h1>{djm:field.intro_title/}</h1>
<div class="prose">{djm:var.page_content raw="1"}</div>

自定义字段的富文本同样按已清洗 HTML 输出,图片会自动补 /storage/ 前缀。

继续阅读

主题开发 模板标签的作用域、转义与调试 主题开发 列表、分页与上下篇的进阶用法 主题开发 模板标签怎么用:从手册到页面组合 主题开发 主题结构、校验与打包发布

讨论