侧栏那块是怎么出来的:Module 的读法和自定义模块渲染
很多人改主题卡在侧栏。模板里写着 {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 再排序干净。
你主题的侧栏是自己重写的,还是在原生循环外面套了壳?