完善Typecho插件

在插件挂载中,我们挂载了插件,并编写了rray('NewTest_Action', 'send'),次类代码,这个就是我们今天要写的,行动代码。

  1. 首先需要定义一个方法spend,在该方法中我们通过系统配置拿到接口调用地址。
  2. 调用地址,并传入指定参数

有了上面的思路,我们开始正式编写代码

新建Action类

新建一个Action.php

class NewTest_Action extends Typecho_Widget implements Widget_Interface_Do
{
    
     public function action()
    {
    }
}

action类需要继承Typecho_Widget,并实现Widget_Interface_Do的接口。

接下来添加spend方法,百度搜索调用企业微信接口php都是采用CURL,我们用typecho自带的http类使用。

        /**
     * 准备数据
     * @param $contents 文章内容
     * @param $class 调用接口的类
     * @throws Typecho_Plugin_Exception
     */
    public static function send($contents, $class)
    {

        //如果文章属性为隐藏或滞后发布
        if ('publish' != $contents['visibility'] || $contents['created'] > time()) {
            return;
        }

        //获取系统配置
        $options = Helper::options();

        //判断是否配置好API
        if (is_null($options->plugin('NewTest')->api)) {
            throw new Typecho_Plugin_Exception(_t('api未配置'));
        }

        //获取文章类型
        $type = $contents['type'];

        //获取路由信息
        $routeExists = (NULL != Typecho_Router::get($type));

        //生成永久连接
        $path_info = $routeExists ? Typecho_Router::url($type, $contents) : '#';
        $permalink = Typecho_Common::url($path_info, $options->index);

        //调用post方法
        self::post($permalink);
    }

   /**
     * 发送数据
     * @param $url 准备发送的url
     * @param $group 分组信息
     */
    public static function post($url, $group=null)
    {
        $options = Helper::options();

        //获取API
        $api = $options->plugin('NewTest')->api;

        //准备数据
        if (is_array($url)) {
            $urls = $url;
        } else {
            $urls = array($url);
        }

        try {
            //为了保证成功调用,老高先做了判断
            if (false == Typecho_Http_Client::get()) {
                throw new Typecho_Plugin_Exception(_t('对不起, 您的主机不支持 php-curl 扩展而且没有打开 allow_url_fopen 功能, 无法正常使用此功能'));
            }

           $arr = [
            'msgtype'=>'text',
            'text'=>[
                'content'=>'这里是消息内容!',
                'mentioned_mobile_list'=>['@all']
                ]
            ];
            //发送请求
            $http = Typecho_Http_Client::get();
            $http->setData(json_encode($arr,true));
            $http->setHeader('Content-Type', 'application/json'); // 设置相应头
            $json = $http->send($api);
          
        } catch (Typecho_Exception $e) {
    
        }

        self::logger($log);
    }
    

然后就能去后台编写文章,测试测试了

注意事项

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
        )

)

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

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

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

同route一样,在卸载插件时不要忘了移除action!
最后修改:2024 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏