首页 > 模板开发 > 正文

模板制作新手教程(十)-高级搜索之自定义搜索功能

  • 更新时间:2021-01-18 22:17:26
  • 36阅读
  • 0评论

前面我们差不多做完了前端的页面了,差一个专题的页面,其实也是一个列表页,具体就不再写了。同学们可以自己动手制作试试,有问题的同学可以在rpcms论坛发帖求助。


这一篇我们来学习如何通过钩子来扩展模板的功能,同学们也不想让自己的模板看起来平淡无奇吧,通过钩子的操作,你可以无限的丰富自己模板的功能。

今天我们就用搜索功能来了解下模板钩子的使用。我们自定义一个自己的搜索:多词搜索

2021-01-18_181700.jpg


一、了解模板钩子

钩子在rpcms中是扩展的基础,模板也支持钩子的操作,模板中使用钩子只需要建一个Hook.class.php的文件即可。参考《帮助文档-模板制作-模板钩子


二、写模板钩子

在我们新建的Hook.class.php文件中写入如下代码:

<?php
namespace template/index/test;

use rp/index/Base;

class Hook extends Base{
	
	/*
	*挂载钩子
	*钩子执行方法格式:钩子所在文件的命名空间::执行方法
	*return array(钩子名称=>钩子执行方法)
	*/
	public function addHook(){
		$data=array(
			'index_search'=>'template/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 rpindexLogsMod)->where(array('a.title|a.content'=>array(array('like',$keyArr2,'or'),array('like',$keyArr2,'or'))))->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>',###}</h3>
<p class="desc">{$v['excerpt']|preg_replace=$listId,'<font style="color: #f40;">$0</font>',###}</p>


总结:钩子可以你的模板更强大。

0 位网友评论:

欢迎 来评论

请填写验证码
Top