用了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 .= '' . $zbp->lang['msg']['none'] . ''; // 无
foreach ($zbp->Config('default')->template_diy as $key => $value) {
if (judgeType($value['type'],$type)) {
if ($default==$key) {
$str .= '' . $value['name'] . '';
} else {
$str .= '' . $value['name'] . '';
}
}
}
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
'
';
default_create_template_select($object->Template,$type);
echo '
// 用js移除原有的下拉选择器
echo '
$("#template").remove();
';
}
下拉框几乎是复制系统下拉框,由于没有删除系统的模板下拉框的方法,我便是用JS删除系统原有下拉选择器。这里,对JS比较熟悉的童鞋,可以用JS更好的更换模板下拉选择的内容。
好了,如此这般,就能够为你开发主题自定义模板,添加对应的名称与分类啦。关于类型定义,我简单设定几个常见类型
all全部可用|hide全部隐藏|single文章与单页通用|article文章|page单页|list列表页通用|category分类|tagTag标签|author用户页
当然,这里也把演示文件放上来,大家可以去下载来看看。有一个需要注意的地方,在ZBP1.5后,$zbp->templates 改为 $zbp->template->templates