
ZBlogPHP自定义模板的名称与类型
用了zbp这么久,在开发zbp主题的时候,困扰开发者的大难题,就是如何自定义输出模板的名称与类型。
在zbp早期,是没有对模板读取备注中的模板名称,在最近的版本,zbp添加了模板中的模板名称识别。
例如:在index.php中添加
{* Template Name: 首页模板 *}
添加以后,在编辑文章或者分类时,就能在模板中,看到模板的名称了。
不过呢,这种方法是不能控制模板在对应类型的编辑中出现的,属于比较简单的通用解决方法。
其实,早在今年年初,我就有研究过关于模板自定义名称和类型的解决方法,只是一直未正式使用和对外发布,仅限在几名开发者中交流过。主要起因,也是因为当时猪瞎指挥我弄备注,结果不能识别,出错了。
这套解决方案的主要构思:
为模板添加备注,然后正则读取这段备注,获得设置的名称与类型;
接入编辑页面的输出接口,加上一个模板选择下拉,同时,利用JS去掉页面上的模板选择下拉(或者,JS替换option也可以),避免出现选择模板失败。
构思有了,那么再解析一下,如何添加这些代码。添加这些代码,最大的坑点,正则识别模板的名称与类型备注,还好,这里有YT(瑜廷)大神的帮助。
1、模板注释部分:
{* type : "article" name : "测试模板" *}
注意,如果要使用这套解决方法,请务必参照这个格式添加,保证后面的正则能正常识别。
在这段注释中,第一行是type(类型),表示模板文件属于什么类型的模板;第二行是模板的名称,支持正常的中英文等字符。
2、正则识别部分:
preg_match_all('/\{\*\s*type\s*?\:\s*?\"([a-z,\d,_,-]+)\"\s*?name\s*?\:\s*?\"(.*?)\"\s*?\*\}/',$value,$temp); if (isset($temp[1][0])&&isset($temp[2][0])) { $array[$key] = array( 'type' => $temp[1][0], 'name' => $temp[2][0], ); }
代码是我从测试案例中复制出来的,$value来自系统自动读取的$zbp->templates遍历(正常屏蔽了一些系统默认不显示的模板文件)。
正则匹配出名称与类型后,我们利用生成下拉列表时,传入的编辑页面类型,生成不同的下拉列表。
3、生成模板选择的下拉函数
/** * 生成模板的option选项 * @param {string} $default 当前采用模板 * @param {string} $type 生成对应类型 默认all全局 */ function default_create_template_select($default,$type='all') { global $zbp; default_LoadTemplate(); function judgeType($tempType,$reqType) { if ($tempType=='hide') { return false; } if ($tempType == $reqType || $tempType=='all') { return true; } if (($reqType == 'article'||$reqType=='page')&&$tempType=='single') { return true; } if (($reqType == 'category'||$reqType=='tag'||$reqType=='author')&&$tempType=='list') { return true; } return false; } $str = ''; $str .= '<option value="" >' . $zbp->lang['msg']['none'] . '</option>'; // 无 foreach ($zbp->Config('default')->template_diy as $key => $value) { if (judgeType($value['type'],$type)) { if ($default==$key) { $str .= '<option value="'.$key.'" selected="selected" >' . $value['name'] . '</option>'; } else { $str .= '<option value="'.$key.'" >' . $value['name'] . '</option>'; } } } echo $str; }
这段就是生成模板下拉列表函数,主要是判断页面类型,以便在不同类型的编辑页面输出对应模板。
其它就相对简单了,接入对应的编辑页面接口,插入模板下拉选择。
4、接入编辑页面:
// 接入文章编辑页的3号接口 function default_Article_Edit_Respons3() { global $zbp,$article; default_Article_CustomMeta_Response3($article); } // 3号接口需要展示的内容 function default_Article_CustomMeta_Response3(&$object) { global $zbp; $type = (GetVars('act','GET')=='PageEdt')?'page':'article'; echo '<div id=\'template2\' class="editmod"> <label for="cmbTemplate" class="editinputname" style="max-width:65px;text-overflow:ellipsis;">模板</label> <select style="width:180px;" class="edit" size="1" name="Template" id="cmbTemplate" onChange="edtTemplate.value=this.options[this.selectedIndex].value">'; default_create_template_select($object->Template,$type); echo '</select> </div>'; // 用js移除原有的下拉选择器 echo ' <script> $("#template").remove(); </script> '; }
下拉框几乎是复制系统下拉框,由于没有删除系统的模板下拉框的方法,我便是用JS删除系统原有下拉选择器。这里,对JS比较熟悉的童鞋,可以用JS更好的更换模板下拉选择的内容。
好了,如此这般,就能够为你开发主题自定义模板,添加对应的名称与分类啦。
关于类型定义,我简单设定几个常见类型
all全部可用|hide全部隐藏|single文章与单页通用|article文章|page单页|list列表页通用|category分类|tagTag标签|author用户页
当然,这里也把演示文件放上来,大家可以去下载来看看。
有一个需要注意的地方,在ZBP1.5后,$zbp->templates 改为 $zbp->template->templates