搜索作为网站上快速查询内容的工具,必不可少,织梦里面的搜索有好几种,例如,我们用织梦DEDECMS进行仿站或进行二次开发,经常用到的有高级搜索、前台搜索和织梦DEDECMS后台自定义搜索,这个教程主要简分析一下,前台搜索功能,织梦前台搜索功能与自定义搜索功能,大同小异,处理过程也差不多。
前台搜索和高级搜索如下图所示。
前台搜索
高级搜索
前台搜索可以说是高级搜索的一个简单化版,言外之意就是处理这二个提交表单的搜索关键字程序是一样的,没有错,处理搜索的程序文件都是plus/search.php。前台搜索模板是织梦DEDECMS模板头部模板head.htm,高级搜索对应的模板是,织梦模板里面的heightsearch.htm,它们的搜索结果页都是templets/default/search.htm,测试是不是这一个模板页,可以查看“搜索视图类”文件arc.searchview.class.php,在131行,找到:
$tempfile = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir']."/".$GLOBALS['cfg_df_style']."/search.htm";
这里就是定义了,高级搜索和前台搜索的搜索结果页模板,知道这个原理,我们就可以在这里自己定义自己喜欢的模板名称文件了。还可以用另一种方法来测试,高级搜索和这个前台搜索的结果模板是不是用的这个模板文件,我们只需要在这个模板search.htm里面随便写点东西,在我们搜索后,看看有没有我们刚写的东西,如果有说明,这二个都是用的同一个搜索结果页模板文件,这也是一种方法。
我们知道织梦模板都是通过织梦标签来调用数据的,但是在织梦插件里面,一般都不用织梦标签,而是用php代码,这个前后台搜索也是如此,特别是高级搜索。我们先看一下前台搜索,下面是搜索代码form表单。
这个表单里面,只用了{dede:global.cfg_cmsurl/}这么一个标签,其它都是html原生态的标签,这些没有什么好说的,最主要的是看action里面的文件search.php,这是重点,再看一下这个表单的name值,这点非常重要,因为,当用户输入关键搜索后,这些name值要一起发送到search.php里面的。
再看一下高级搜索模板heightsearch.htm里面的表单,我们会发现完全没有织梦表单,而是html标签和php程序,注意,它的action 也是search.php,这就可以肯定了,前台搜索和高级搜索都是通过search.php来处理,用户输入的关键字的。
因为前台搜索是高级搜索的简化版本,所以,我们只需要分析高级搜索,就可以了。
在分析高级搜索前,我们要注意一个问题:只要在php里require,include等包括了一个模板(或其它php文件),就相当于把这个模板(或其它php文件)里的代码复制到这个php文件,而模板文件(或其它php文件)就相当于,把这个php文件,通过require,include等作为联系,从php分害出来的一部分,虽然,分割出来了,但是由于require,include等,使得这个模板文件(或其它php文件)仍然是这个php文件的一部分,只是为了方便处理,才把它们分开的。这在php里面都是通用的,而不是织梦专有的。
就像在我们做模板时,把一个模反分成三部分:头部、中间和尾部,便于管理,试想如果一个程序文件,不分开的话,有可能,这个文件使它里面的全部代码,而另一个文件只使用它里面的部分代码,这样就使得不使用的代码也要加载一次,浪费服务器资源,也不方便。
知道上面的原理,我们打开heightsearch.php文件,你会发现只有三行代码,重点看下面这二个文件:
require_once(DEDEINC.'/typelink.class.php');
require_once(DEDETEMPLATE.'/plus/heightsearch.htm');
第一个是“栏目连接类”typelink.class.php文件,它的作用就是处理栏目的连接,例如像这样的当前位置: 主页 > 网页基础 > HTML > 连接,以及高级搜索里面的“网站栏目”、“类型”等。对于这个类文件,今天不是我们的重点,我们只需要知道,我们调用里面的一个方法GetOptionArray(0,0,0),这个方法的作用就是:获得类别列表,这里所说的类别就是栏目。对于这个方法,有兴趣的可以去研究一下。
打开高级搜索模板,heightsearch.htm,我们一一分析:
第一项:同站栏目,上面的们分析了用的是GetOptionArray(0,0,0)方法,把数据库里面的栏目表dede_arctype里面的,所有栏目都筛选出来。
第四项:内容类型,这个是把数据库里面的模型表dede_channeltype,里面的所有模型都循环出来,这种原生态的php代码调用在模板插件里面的经常用到,如果现在想调用其它的表里面的数据,我们可以通过种方法来调用。
第二项:关键字,不知道大家遇到过这种情况没有,当我们在网站上搜索时,有时候只输入了一个符号,例如:只输入了一个字母a,点搜索后,程序会提示“关键字不能小于2个字节!”,有时候我们需要一个字节的搜索,如何改呢?
修改方法:在文件search.php里面的第79行,找到if(($keyword=='' || strlen($keyword)<2) && empty($typeid)),把里面的小于2,改成小于1或者直接把strlen($keyword)<2) && 这一句去掉即可,搜索一个关键字节了。
在这个search.php文件里面,上面大部分是处理我们在高级搜索里面的搜索时,选择的条件,全是为下面这三行代码服务的:
$sp = new SearchView($typeid,$keyword,$orderby,$channeltype,$searchtype,$starttime,$pagesize,$kwtype,$mid);
$keyword = $oldkeyword;
$sp->Display();
这三行代码,就是对“搜索视图类”arc.searchview.class.php进行实例化,即创建对象,然后,把用户要搜索的关键字以及选择的条件,进行真正的处理,并显示到搜索结果页里面。在这个类里面涉及到了数据库操作,而search.php文件,则只是对搜索提交过来的参考进行基本的检验,例如输入的关键字有合不合法等。这个文件不直接与数据库打交道,而是让这个文件后面的类,进行数据库操作,这样就更加保证了程序的安全性,提高了效率。在php中
mvc里面我们称search.php为控制器,即里面的c。
这种方法我们在写程序时,也要参考一下,就是对于search.php接收到的数据,我们首先要处理,然后,再把处理后的数据交给更底层的模块处理,处理后再还给search.php,通过search.php显示到用户前面,这种思想就是mvc。
这个教程只是简单的分析了一下,高级搜索的处理过程,即对提交的搜索要求进行基本的数据检验,然后,提交给实例化的对象进行处理,对象才是真正是数据库打交道的代码,而这些代码往往都比较复杂,看上去,但如果我们细细分析一下,其实也不是多么难。
最后,要说的是,织梦DEDECMS 自定义搜索文件是advancedsearch.php,织梦可能写错了,这个也叫高级搜索,其实,这个叫自定义搜索文件,它对应的模板是advancedsearch.htm。对于自定义搜索我们会在另一个教程里分析。(责任编辑:最模板)