还在为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 发布