侧栏那块是怎么出来的:Module 的读法和自定义模块渲染

· zblog · 阅读 16
摘要

很多人改主题卡在侧栏。模板里写着 {foreach $sidebar as $module},但不知道这个 $sidebar 从哪来、里面装了什么。 它是 $zbp->modules 按 SidebarID 筛出来的 Module 数组。

很多人改主题卡在侧栏。模板里写着 {foreach $sidebar as $module},但不知道这个 $sidebar 从哪来、里面装了什么。

它是 $zbp->modules 按 SidebarID 筛出来的 Module 数组。

先说 Module 对象里的东西。$module->FileName 是模块的标识,$module->Name 是给人看的名字,$module->Content 才是内容。类型不同,Content 的含义不一样。

四种类型。

ul 类型,就是分类列表、归档列表这种。它的 Content 是空的,渲染靠 $module->GetList() 返回的字符串,已经是拼好的 <li> 了。直接在模板里 {$module->GetList()} 输出就行。

div 类型,用户自定义 HTML 模块。Content 里存的是原始 HTML,得原样输出,不能转义。这里转义就等于把用户的 div 变成一堆文字。

那个 <li> 列表我踩过一次:GetList 返回的字符串已经带了外层 ul,你在模板里再包一层 ul,就变成 ul 套 ul,样式全乱。

还有两种,标签云和友情链接,本质是 div 的变形,Content 里是拼好的 HTML。

按 FileName 区分渲染。

实际写模板时不会只输出了事。常见需求:分类模块要换成折叠面板,归档模块要保持原样,自定义模块要加个外框。

写法是按 FileName 判断。

{if $module->FileName=='catalog'} 走一套,{if $module->FileName=='archives'} 走另一套,剩下的兜底输出 Content。这个兜底很重要,不然用户新加个模块,前台就什么都不显示,他会以为是主题坏了。

顺序和显隐。

顺序不是模板决定的,是后台「模块管理」里存的 SaveOption。主题层改顺序没用,重启模板就回去了。

显隐也一样。想让某个模块只在首页出现,判断条件写在模板里,但这只是视觉隐藏——数据照样加载。真要省性能,得在 Filter_Plugin_Index_Begin 里把对应模块从 sidebar 数组移出去。

自己造一个模块。

主题专属模块,比如「热门标签」这种官方没有的,不用建后台模块,直接在 include.php 里 new 一个 Module 对象,塞进 sidebar 数组就行。

关键是把它插在哪个位置。数组顺序就是显示顺序,用 array_splice 按索引插,比一个个 push 再排序干净。

你主题的侧栏是自己重写的,还是在原生循环外面套了壳?