ZBlogPHP自定义模板的名称与类型

用了zbp这么久,在开发zbp主题的时候,困扰开发者的大难题,就是如何自定义输出模板的名称与类型。

在zbp早期,是没有对模板读取备注中的模板名称,在最近的版本,zbp添加了模板中的模板名称识别。

例如:在index.php中添加

{* Template Name: 首页模板 *}

添加以后,在编辑文章或者分类时,就能在模板中,看到模板的名称了。

不过呢,这种方法是不能控制模板在对应类型的编辑中出现的,属于比较简单的通用解决方法。

zbp_dev.jpg

其实,早在今年年初,我就有研究过关于模板自定义名称和类型的解决方法,只是一直未正式使用和对外发布,仅限在几名开发者中交流过。主要起因,也是因为当时猪瞎指挥我弄备注,结果不能识别,出错了。

这套解决方案的主要构思:

为模板添加备注,然后正则读取这段备注,获得设置的名称与类型;

接入编辑页面的输出接口,加上一个模板选择下拉,同时,利用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
阅读: 1881
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
橙色阳光
https://oss.so/article/79

相关阅读

通知

暂时关闭留言功能,正在开发相关插件。
后期不再更新mylog主题,对应补偿计划中。

精品域名

出售精品域名 Yumi.La 价格面议