导航菜单

Typecho主题的时候有些地方可能需要用到特定的插件
调用插件前肯定是先判断一下插件是否激活,不然就会导致中断输出了。

过程式写法

<?php $all = Typecho_Plugin::export();?>
<?php if (array_key_exists('插件名称', $all['activated'])) : ?>
这里写调用插件的方法
<?php endif; ?>

面向对象写法

这种调用方式比较粗狂,不方便检查错误,我的建议是弄成一个工具类专门调用,但是吧,有时候我又不想重复写那么多函数,怎么办呢?还好,PHP有魔术方法__get

/**
 * xiamp.net 主题必须类
 *
 * @property bool $isCommentLocationEnabled
 * @property bool $isTeMenuEnabled
 * @property bool $isAAEditorEnabled
 * @property bool $isNavMenuEnabled
 * @property bool $isLinksEnabled
 * @property bool $isTePostRatingsEnabled
 */
class XiampNetUtils extends Typecho_Widget
{
    private $_pluginsActivated;

    /**
     * 构造函数
     */
    public function __construct($request, $response, $params = null)
    {
        parent::__construct($request, $response, $params);
        $this->_pluginsActivated = Plugin::export()['activated'];
    }

    /**
     * 成员变量拦截
     *
     * @param $name
     * @return bool|mixed|string|null
     */
    public function __get($name)
    {
        if (strpos($name, 'is') === 0 && substr($name, -7) === 'Enabled') {
            // 支持 isXXXEnabled, XXX 代指插件名
            $plugin = substr($name, 2, -7);
            return $this->isPluginEnabled($plugin);
        } else {
            return parent::__get($name);
        }
    }
}

怎么调用呢,在Typecho中调用是很简单的,把AAEditor换成你想判断的插件就行。

<?php
    if (Typecho_Widget::widget('XiampNetUtils')->isAAEditorEnabled) {
        // blah blah blah
    }

如果你想利用IDE自身的纠错,每用到一个插件,就跟着上边的注释添加就行。

如果是 Typecho1.2,还是以这么调用

<?php
    if (XiampNetUtils::alloc()->isAAEditorEnabled) {
        // blah blah blah
    }

得益于 Typecho 的设计,这么调用是单例模式,和上边过程写法的性能几乎是一致的。这么写也有好处,添加一次@property属性,IDE能自动补全啊。