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