解决Typecho意外的加密文章403
MoOx Pjax在遇见403,404的时候都不会发生跳转,所以只能通过解决Typecho的问题来实现进入加密文章
之前有询问过Paul,他说过可以通过修改Typecho源码来实现,但是我是需要满足使用我主题的人的,总不能让别人重装个专属的吧?
我将通过插件的形式来实现,需要注意的是,如果无效,你需要重启插件,有可能是接口在activate中没有激活
Widget_Abstract_Contents
Widget_Abstract_Contents
是一个常用的接口,我们通过这个来修改Typecho(而不是修改源码)
我们需要在启动的时候添加上这个接口
/**
* 激活插件方法,如果激活失败,直接抛出异常
*
* @access public
* @return void
* @throws Typecho_Plugin_Exception
*/
public static function activate()
{
Typecho_Plugin::factory('Widget_Abstract_Contents')->filter = array('Fix403_Plugin', 'show');
}
show函数
public static function show($v, $obj) {
$tixing='请输入密码访问';
$v['titleshow'] = false;
/** 如果访问权限被禁止【就是如果需要密码】 */
if ($v['hidden']){
$v['text'] = '
!!!
<form class="protected" action="' . Typecho_Widget::widget('Widget_Security')->getTokenUrl($v['permalink']). '" method="post">'.'<p class="word">'.$tixing.'</p>'.'<p><input type="password" class="text" name="protectPassword" /><input type="hidden" name="protectCID" value="' . $v['cid'] . '" /> <input type="submit" class="submit" value="' . _t('提交') . '" /></p>'.'</form>
!!!
';
/** 跳过系统默认 */
$v['hidden'] = false;
/** 用于模板判断插件 */
$v['titleshow'] = true;
}
/** 返回数据 */
return $v;
}
接口会提供值,我们使用两个变量来接受值,之后再做其他
如果需要自定义输出文字的话,可以通过Widget_Options
来实现
Widget_Options
说Pro点就是这样子,实际上就是给个控制面板而已,这个并不需要接口,插件本来就有的功能
/**
* 获取插件配置面板
*
* @access public
* @param Typecho_Widget_Helper_Form $form 配置面板
* @return void
*/
public static function config(Typecho_Widget_Helper_Form $form)
{
$tixing = new Typecho_Widget_Helper_Form_Element_Text('tixing', NULL, NULL, _t('密码文字提醒'), _t('不填写则默认为【请输入密码访问】'));
$form->addInput($tixing);
}
那么如果使用了这里,下面也需要对应修改
$tixing = Typecho_Widget::widget('Widget_Options')->plugin('Fix403')->tixing;//获取设置参数
if(empty($tixing)){
$tixing='请输入密码访问';//如果未设置则设置默认文字
}