還在爲typecho不能實現自定義頁面和路由煩惱嗎?快來看看吧

首發於: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 發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章