Typecho判断插件是否激活
做Typecho主题的时候有些地方可能需要用到特定的插件。调用插件前肯定是先判断一下插件是否激活,不然就会导致中断输出了。
过程式写法
<?php $all = Typecho_Plugin::export();?>
<?php if (array_key_exists('插件名称', $all['activated'])) : ?>
这里写调用插件的方法
<?php endif; ?>
面向对象写法
这种调用方式比较粗狂,不方便检查错误,我的建议是弄成一个工具类专门调用,但是吧,有时候我又不想重复写那么多函数,怎么办呢?还好,PHP有魔术方法__get
。
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);
}
}
public function isPluginEnabled($plugin): bool
{
return array_key_exists($plugin, $this->_pluginsActivated);
}
}
怎么调用呢,在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能自动补全啊。