天天看點

還在為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/試試就試試

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

你,成功了嗎?

其他,網上目前常用的支援接口方法彙總(一般用來寫接口):

免插件方法:

在主題 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

繼續閱讀