首發于:https://blog.gogobody.cn/archives/210/
最近摸了一個typecho主題 onecircle,要用到自定義路由,于是上網查詢。
得到的資訊非常之少,大部分都是隻支援post 接口,
那麼我想獨立展示一個擁有獨立路由的頁面怎麼辦呢?(不是官方的獨立頁面)請看第二節。
原創,建立多個獨立路由及頁面展示方法
首先,你得寫個插件(不會的直接拿預設的helloworld 插件往裡面塞函數就行)。
第一步,在插件的 active
函數裡加路由:
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