美文网首页
还在为typecho不能实现自定义页面和路由烦恼吗?快来看看吧

还在为typecho不能实现自定义页面和路由烦恼吗?快来看看吧

作者: 东京的雨不会淋湿首尔 | 来源:发表于2020-10-24 16:53 被阅读0次

    首发于:https://blog.gogobody.cn/archives/210/
    最近摸了一个typecho主题 onecircle,要用到自定义路由,于是上网查询。
    得到的信息非常之少,大部分都是只支持post 接口,

    那么我想独立展示一个拥有独立路由的页面怎么办呢?(不是官方的独立页面)请看第二节。


    原创,创建多个独立路由及页面展示方法

    首先,你得写个插件(不会的直接拿默认的helloworld 插件往里面塞函数就行)。

    第一步,在插件的active函数里加路由:

    Helper::addRoute('metasRoute', '/metas/[metatag]/', 'Widget_Archive', 'render');
    Typecho_Plugin::factory('Widget_Archive')->handleInit_1000 = array('你的插件名字(类的名字)','handleInit');
    Typecho_Plugin::factory('Widget_Archive')->handle_1000 = array('你的插件名字','handle');
    

    metasRoute 就是路由名,随便起。/metas/[metatag]/就是我们的自己定义的路由了,其中 metatag,是我们的自定义参数,当然你也可以不加,如果不需要参数的话。 'Widget_Archive', 'render' 这个不用管,照着写。
    当然别忘了在 deactivate 函数删除我们的路由

    Helper::removeRoute('metasRoute');
    

    handleInit_1000,handle_1000 是我们准备注射的函数,1000是为了防止和其他插件冲突。这里我们把两个函数分别映射到了我们自己插件的handleInit和handle。因此第二步就是写这两个函数。

    第二步,编写处理函数

    我们来编写一个最简单的展示函数,根据我们路径的输入,显示同样的输出,比如我的路由 /metas/[metatag]/,当我输入网址/metas/你好,我希望页面输出 你好。
    为插件添加两个成员函数:

    public static function handleInit($archive,$select){
    
    }
    public static function handle($type,$archive,$select){
            if ($type == 'metas'){
                $archive->setArchiveType('metamanage');
                $content = array();
                $archive->setPageRow(array_merge($content,array(
                    'metatag' => $archive->request->metatag,
                )));
            }
            return true;
    }
    

    先看第一个函数handleInit,顾名思义,做初始化工作的,第一个参数相当于Widget_Archive里的this,$select是自定义sql语句。这是一个对所有archive 页面生效的函数,在这里我没有什么特别需求,所以啥也不干。
    再看第二个函数handle,用于对我们路由的处理函数。相信到这一步,大部分人已经懂了。这里第一个参数就是我们定义的路由,我定义得就叫metas。

    $archive->setArchiveType('metamanage'); 这一步很重要,一是为了和系统的关键词分开,二是指定了我们的输出模板名字,系统会去找这个叫“metamanage.php”的文件输出。

    然后我们想给我们前台传什么样的参数呢?请看,$archive->setPageRow(array_merge($content,array( 'metatag' => $archive->request->metatag, )));,这里我只给前台传了一个叫metatag的参数,这个非常重要!,拿前面网址/metas/你好的例子来说,$archive->request->metatag相当于获取的是你好,同时在传给metatag变量,这样我们打开网址/metas/你好才能成功显示参数,不设置的话就会显示原始路由/metas/{metatag}/
    那么这两步都做好之后我们就可以....等等是不是忘了什么?我们还没有建立模板文件呢!显示个鬼啊~~~

    第三步,建立模板文件

    刚刚说了我们的文件名叫metamanage,所以在跟index.php同级的目录建立一个叫metamanage.php的文件,输出一下我们的参数试试当然这里你就可以引入你自己的各种样式balabala~

    <?php
    echo $this->request->metatag;
    

    接下来打开网址/metas/试试就试试

    你成功了吗

    你,成功了吗?


    其他,网上目前常用的支持接口方法汇总(一般用来写接口):

    免插件方法:

    在主题 themeInit里直接判断:

    function themeInit($archive){
    //  实现点赞
            if ($archive->request->agree) {
                if ($archive->request->agree == $archive->cid) {
                    exit(utils::agree($archive->cid));
                } elseif ($archive->is('index')) {
                    exit(utils::agree($archive->request->agree));
                }
                exit('error');
            }
    }
    

    写个js函数

    jquery-ajax
    $.ajax({
        url:'/',
        data:{
            agree:article-cid
        },
        type: 'post',
        success:function(res){....}
    })
    

    插件方法:

    和本文描述类似,但基本也只用来post消息。
    active中添加路由,deactive中别忘了删除~

    Helper::addRoute("test_action", "/testaction", "OneCircle_Action", 'action');
    

    写个对应类和函数,通过传不同的参数就可以实现不同的接口!

    class OneCircle_Action extends Typecho_Widget implements Widget_Interface_Do
    {
        public function action()
        {
            $request = Typecho_Request::getInstance();
            $type = $request->get('type');
            switch ($type) {
                // 用于link 解析
                case "parsemeta":
                    $url = $request->get('url');
                    $html = $this->getUrlContent($url);
                    print_r($this->getDescriptionFromContent($html, 120));
                    break;
                    }
            }
    }
    

    js访问一下:

    $.post(''/testaction,{type:'parsemeta'},function(res){
    console.log(res)
    })
    

    原创不易,感谢支持!
    顺便推一下刚写的主题 onecircle:
    demo:http://site.geekscholar.net/ github:https://github.com/gogobody/onecircle

    本文由博客群发一文多发等运营工具平台 OpenWrite 发布

    相关文章

      网友评论

          本文标题:还在为typecho不能实现自定义页面和路由烦恼吗?快来看看吧

          本文链接:https://www.haomeiwen.com/subject/zufwmktx.html