首發(fā)于:https://blog.gogobody.cn/archives/210/
最近摸了一個(gè)typecho主題 onecircle陵像,要用到自定義路由就珠,于是上網(wǎng)查詢。
得到的信息非常之少醒颖,大部分都是只支持post 接口妻怎,
那么我想獨(dú)立展示一個(gè)擁有獨(dú)立路由的頁面怎么辦呢?(不是官方的獨(dú)立頁面)請(qǐng)看第二節(jié)泞歉。
原創(chuàng)逼侦,創(chuàng)建多個(gè)獨(dú)立路由及頁面展示方法
首先,你得寫個(gè)插件(不會(huì)的直接拿默認(rèn)的helloworld 插件往里面塞函數(shù)就行)腰耙。
第一步榛丢,在插件的active
函數(shù)里加路由:
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,是我們的自定義參數(shù)选侨,當(dāng)然你也可以不加掖鱼,如果不需要參數(shù)的話。 'Widget_Archive', 'render' 這個(gè)不用管援制,照著寫戏挡。
當(dāng)然別忘了在 deactivate 函數(shù)刪除我們的路由
Helper::removeRoute('metasRoute');
handleInit_1000,handle_1000 是我們準(zhǔn)備注射的函數(shù)隘谣,1000是為了防止和其他插件沖突增拥。這里我們把兩個(gè)函數(shù)分別映射到了我們自己插件的handleInit和handle啄巧。因此第二步就是寫這兩個(gè)函數(shù)。
第二步掌栅,編寫處理函數(shù)
我們來編寫一個(gè)最簡單的展示函數(shù)秩仆,根據(jù)我們路徑的輸入,顯示同樣的輸出猾封,比如我的路由 /metas/[metatag]/
澄耍,當(dāng)我輸入網(wǎng)址/metas/你好
,我希望頁面輸出 你好晌缘。
為插件添加兩個(gè)成員函數(shù):
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;
}
先看第一個(gè)函數(shù)handleInit齐莲,顧名思義,做初始化工作的磷箕,第一個(gè)參數(shù)相當(dāng)于Widget_Archive里的this选酗,$select
是自定義sql語句。這是一個(gè)對(duì)所有archive 頁面生效的函數(shù)岳枷,在這里我沒有什么特別需求芒填,所以啥也不干。
再看第二個(gè)函數(shù)handle空繁,用于對(duì)我們路由的處理函數(shù)殿衰。相信到這一步,大部分人已經(jīng)懂了盛泡。這里第一個(gè)參數(shù)就是我們定義的路由闷祥,我定義得就叫metas。
$archive->setArchiveType('metamanage');
這一步很重要傲诵,一是為了和系統(tǒng)的關(guān)鍵詞分開凯砍,二是指定了我們的輸出模板名字,系統(tǒng)會(huì)去找這個(gè)叫“metamanage.php”的文件輸出掰吕。
然后我們想給我們前臺(tái)傳什么樣的參數(shù)呢果覆?請(qǐng)看,$archive->setPageRow(array_merge($content,array( 'metatag' => $archive->request->metatag, )));
殖熟,這里我只給前臺(tái)傳了一個(gè)叫metatag
的參數(shù)局待,這個(gè)非常重要!菱属,拿前面網(wǎng)址/metas/你好
的例子來說钳榨,$archive->request->metatag相當(dāng)于獲取的是你好
,同時(shí)在傳給metatag變量纽门,這樣我們打開網(wǎng)址/metas/你好
才能成功顯示參數(shù)薛耻,不設(shè)置的話就會(huì)顯示原始路由/metas/{metatag}/
。
那么這兩步都做好之后我們就可以....等等是不是忘了什么赏陵?我們還沒有建立模板文件呢饼齿!顯示個(gè)鬼啊~~~
第三步饲漾,建立模板文件
剛剛說了我們的文件名叫metamanage,所以在跟index.php同級(jí)的目錄建立一個(gè)叫metamanage.php
的文件缕溉,輸出一下我們的參數(shù)試試當(dāng)然這里你就可以引入你自己的各種樣式balabala~
<?php
echo $this->request->metatag;
接下來打開網(wǎng)址/metas/試試就試試
你,成功了嗎?
其他考传,網(wǎng)上目前常用的支持接口方法匯總(一般用來寫接口):
免插件方法:
在主題 themeInit里直接判斷:
function themeInit($archive){
// 實(shí)現(xiàn)點(diǎn)贊
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');
}
}
寫個(gè)js函數(shù)
jquery-ajax
$.ajax({
url:'/',
data:{
agree:article-cid
},
type: 'post',
success:function(res){....}
})
插件方法:
和本文描述類似,但基本也只用來post消息证鸥。
active中添加路由僚楞,deactive中別忘了刪除~
Helper::addRoute("test_action", "/testaction", "OneCircle_Action", 'action');
寫個(gè)對(duì)應(yīng)類和函數(shù),通過傳不同的參數(shù)就可以實(shí)現(xiàn)不同的接口枉层!
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)
})
原創(chuàng)不易泉褐,感謝支持!
順便推一下剛寫的主題 onecircle:
demo:http://site.geekscholar.net/ github:https://github.com/gogobody/onecircle
本文由博客群發(fā)一文多發(fā)等運(yùn)營工具平臺(tái) OpenWrite 發(fā)布