前面我们差不多做完了前端的页面了,差一个专题的页面,其实也是一个列表页,具体就不再写了。同学们可以自己动手制作试试,有问题的同学可以在rpcms论坛发帖求助。
这一篇我们来学习如何通过钩子来扩展模板的功能,同学们也不想让自己的模板看起来平淡无奇吧,通过钩子的操作,你可以无限的丰富自己模板的功能。
今天我们就用搜索功能来了解下模板钩子的使用。我们自定义一个自己的搜索:多词搜索
一、了解模板钩子
钩子在rpcms中是扩展的基础,模板也支持钩子的操作,模板中使用钩子只需要建一个Hook.class.php的文件即可。参考《帮助文档-模板制作-模板钩子》
二、写模板钩子
在我们新建的Hook.class.php文件中写入如下代码:
<?php namespace templates\index\test; use rp\index\Base; class Hook extends Base{ /* *挂载钩子 *钩子执行方法格式:钩子所在文件的命名空间::执行方法 *return array(钩子名称=>钩子执行方法) */ public function addHook(){ $data=array( 'index_search'=>'templates\index\test\Hook::diySearch', ); return $data; } public function diySearch(){ $key=input('q'); $page=intval(input('page')) ? intval(input('page')) : 1; if(empty($key)){ redirect($this->App->baseUrl); } $keyData=strip_tags(strDeep($key)); $keyArr=explode(' ',$keyData); $keyArr2=array_map(function($v){return '%'.$v.'%';},$keyArr); $logData=(new rp\index\LogsMod)->where(array('a.title|a.content'=>array('like',$keyArr2)))->page($page)->order(array('a.upateTime'=>'desc','a.id'=>'desc'))->select(); $pageHtml=pageInationHome($logData['count'],$logData['limit'],$logData['page'],'search',$key); $key2='搜索 '.$key; $this->setKeywords(); $this->setDescription('搜索关键词“'.$key.'”的索引结果',true); $this->assign('title',$key2.'-'.$this->webConfig['webName']); $this->assign('listId',array_map(function($v){return '/'.$v.'/';},$keyArr)); $this->assign('listType','search'); $this->assign('logList',$logData['list']); $this->assign('pageHtml',$pageHtml); return $this->display('/search'); } }
要点说明:
1、为什么要继承index/Base类?
search的钩子会直接覆盖掉系统的原搜索功能,而模板中的变量赋值和模板渲染需要用到base类的方法。
2、搜索参数
q:为搜索的关键词
page:为当前页数
3、where的使用
这里我们使用了传统的like来模糊匹配,当然你可以使用regexp来实现。
三、修改下search模板
因为这里我们使用模板钩子开发了自己的一个搜索功能,而且是多词搜索的,所以模板中我们也稍微修改下,达到所有匹配词都高亮的效果。修改search.php模板数据列表中的titile和excerpt为:
<h3>{$v['title']|preg_replace=$listId,'<font style="color: #f40;">$0</font>',###|raw}</h3> <p class="desc">{$v['excerpt']|preg_replace=$listId,'<font style="color: #f40;">$0</font>',###|raw}</p>
总结:钩子可以你的模板更强大。
发表评论
评论已关闭,请移步论坛发表,立即前往