本来百度原本就提供自动推送js,但是不知道为什么他就把他关了,而写个js用处也不是太大。)主要还是想自定义一个美丽的站点地图测试一些自己的能力

然后中途就遇到了一些问题

1.列表过长,需要设置分页

尝试了一下这个没成功。。。

2.Typecho路由设置

/**
 * 增加路由
 *
 * @access public
 * @param string $name 路由名称
 * @param string $url 路由路径
 * @param string $widget 组件名称
 * @param string $action 组件动作
 * @param string $after 在某个路由后面
 * @return integer
 */
public static function addRoute($name, $url, $widget, $action = NULL, $after = NULL)
{
// some code here...

思否-老高@PHPer

获取配置

# 获取系统配置
Helper::options();

# 获取指定插件配置
Helper::options()->plugin('BaiduSubmit');

# 获取当前插件配置
Helper::options()->plugin(str_replace('_Plugin','',__CLASS__));

路径安全

用于生成安全的URL,带有token验证,如果牵扯到action等核心操作时会用到。系统在验证请求是会用到 $this->widget('Widget_Security')->protect()去验证来源token。

$s = Helper::security();
echo $s->index('/');

# 输出类似 http://www.phpgao.com/?_=ce4a9617aa228bb85ba696c9ba9784be

强行删除某插件

此方法用于卸载插件失败时的替补方法,老高一般将此方法写入 HELLO_WORLD插件的 render方法里,这样刷新以下后台,出问题的插件就被卸载了。

Helper::removePlugin('BaiduSubmit');

路由增删

如果你的插件需要给系统添加一个新的路由,那么此方法就能派上用场!

路由表保存在表 typecho_options 中的 routingTable中。

比如老高的插件BaiduSubmit,就用此方法为系统添加了一个 http://yourweb/baidu_sitemap.xml的路由。

/**
 * 增加路由
 *
 * @access public
 * @param string $name 路由名称
 * @param string $url 路由路径
 * @param string $widget 组件名称
 * @param string $action 组件动作
 * @param string $after 在某个路由后面
 * @return integer
 */
Helper::addRoute('baidu_sitemap', '/baidu_sitemap.xml', 'BaiduSubmit_Action', 'sitemap');
不要忘记在卸载的时候调用 Helper::removeRoute('baidu_sitemap');删除刚才添加的路由!

Action

有心的同学应该能够发现,后台发送文章的form表单的action地址为类似 http://web/action/contents-post-edit?_=xxx,这个链接表示什么意思呢?请听老高分解!

Action是typecho中的一类操作,它对应一条特殊的路由/action/,也就是路由表中的 $table[0]['do'],具体内容如下

 [do] => Array
(
        [url] => /action/[action:alpha]
        [widget] => Widget_Do
        [action] => action
        [regx] => |^/action/([_0-9a-zA-Z-]+)[/]?$|
        [format] => /action/%s
        [params] => Array
            (
                [0] => action
            )

    )

从路由表能够看出,下一步我们需要找到类 Widget_Do。我们能在该类中找到系统默认的action对应关系!

    private $_map = array(
        'ajax'                      =>  'Widget_Ajax',
        'login'                     =>  'Widget_Login',
        'logout'                    =>  'Widget_Logout',
        'register'                  =>  'Widget_Register',
        'upgrade'                   =>  'Widget_Upgrade',
        'upload'                    =>  'Widget_Upload',
        'service'                   =>  'Widget_Service',
        'xmlrpc'                    =>  'Widget_XmlRpc',
        'comments-edit'             =>  'Widget_Comments_Edit',
        'contents-page-edit'        =>  'Widget_Contents_Page_Edit',
        'contents-post-edit'        =>  'Widget_Contents_Post_Edit',
        'contents-attachment-edit'  =>  'Widget_Contents_Attachment_Edit',
        'metas-category-edit'       =>  'Widget_Metas_Category_Edit',
        'metas-tag-edit'            =>  'Widget_Metas_Tag_Edit',
        'options-discussion'        =>  'Widget_Options_Discussion',
        'options-general'           =>  'Widget_Options_General',
        'options-permalink'         =>  'Widget_Options_Permalink',
        'options-reading'           =>  'Widget_Options_Reading',
        'plugins-edit'              =>  'Widget_Plugins_Edit',
        'themes-edit'               =>  'Widget_Themes_Edit',
        'users-edit'                =>  'Widget_Users_Edit',
        'users-profile'             =>  'Widget_Users_Profile'
    );

由此映射关系我们知道,当我们需要发布文章的时候(contents-post-edit),就去调用 Widget_Contents_Post_Edit的action方法即可。

当我们要添加action对应关系的时候,就可以调用 Helper:addAction()执行添加,系统就会添加一条 'new_action' => 'some_action'

新增的动作保存在表 typecho_options 中的 actionTable中。

需要提醒的是,当我们添加一条action后,需要让其实现类 some_action实现 Widget_Interface_Do的接口,即必须有实现 public function action(),否则调回失败。

同route一样,在卸载插件时不要忘了移除action!

菜单 & 面板

这个很好理解,不再赘述。

手动配置

当我们需要更自由的配置功能时,可以在Plugin.php文件中添加 public static function configHandle($config)方法,当后台保存插件设置的时候就会调用此方法而不是默认的简单保存配置。

helper::configPlugin('BaiduSubmit', $config);

3.Typecho 插件的配置信息没有找到

image.png

____Class____改为插件名称

Moleft

解决 Typecho 插件的配置信息没有找到

避免踩坑展开目录

入坑 Typecho 已经一个多月了,在这期间 Typecho 的插件也开发了两个 (其实我现在正在开发第三个,就不告诉你是个采集插件),然后大大小小的坑也踩了不少,其实最深的坑还是启用插件时提示 “插件的配置信息没有找到”,这个具体原因就是因为首次启用插件时,在 config() 里面获取配置信息,这当然是获取不到的,我们复现一个这个错误。

先写插件展开目录

在写一个插件肯定是没那个精力了,我们就稍微改一下官方的 HelloWorld 插件吧,首先我们先启用报错,在 Plugins.php 最上面加入下面的代码,这样的话我们就可以看到错误信息了,不然就是 Server Error

define('__TYPECHO_DEBUG__', true);

然后我们找到 config 这个函数,复现一下具体错误,我们加一个获取插件配置的代码,然后保存。

$setting = $options = Typecho_Widget::widget('Widget_Options')->plugin('HelloWorld');
echo "<script>alert(\"{$setting->word}\")</script>";

然后我们启用一下插件,看看会不会报错。

image.png
果不其然,真的报错了,有的时候在 config() 函数里面获取配置信息是为了更好的显示插件的某些配置,所以说这个对我们来说真的很重要,经过我多方摸索,最后找到了解决办法。

如何解决展开目录

其实解决方法也是灰常简单的,只需要加一个捕捉异常,就可以跳过这个坑 (傻傻的我为什么早没有想到呢),我们来修改一下代码,我们加一个 try catch,保存之后在重新启用插件。

try {
    $setting = $options = Typecho_Widget::widget('Widget_Options')->plugin('HelloWorld');
    echo "<script>alert(\"{$setting->word}\")</script>";
} catch (Exception $e) {
    echo "<script>alert(\"获取配置失败\")</script>";
}

重新启用插件之后果然没有报错,所以说这个方法是可行的,其他的思路我暂时没有,如果你们有好的方法可以在下面评论。

4. function static

action不能使用static

最后修改:2021 年 02 月 12 日 01 : 18 PM
如果觉得我的文章对你有用,请随意赞赏!