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

2020-10-24  本文已影响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 发布

上一篇下一篇

猜你喜欢

热点阅读