模板制作教程:内容搜索
此模块已经关闭了搜索功能
需要在模块中开启搜索功能:
更新缓存生效!!
搜索参数多条件的写法
类似以上图片这种条件搜索,一个字段可以使用多个条件选中查询,当其中任意一个选项匹配时就显示结果,
如上图所示:当选择【带薪年假+年终奖】两个选项时,两个条件满足任意一个时就会搜索到结果。
如果要两个条件都同时满才会搜索到结果的话,需要在后台开启下图的选项:
此查询需要以下字段支持:
联动菜单:Linkage 联动菜单多选:Linkages 复选框:Checkbox 单选按钮:Radio 下拉选择:Select
搜索条件写法:
{php $field = dr_field_options($ci->module['field']['danxuananniu']['id']);} {loop $field $value $name} {/loop}
判断是否选择:
{if dr_is_double_search($params.字段名称, "当前值")} 选中了 {/if}
传入值写法:
{Router::search_url($params, '字段名称', dr_get_double_search($params.字段名称, "当前值"))}
搜索值写法原理:
关键字A|关键字B
多个条件用|符号分开。
搜索条件的字段优化
内容搜索是网站中最消耗查询资源的,如果字段没有优化好,会导致整个网站速度变慢
字段优化技巧
1、参与搜索的字段创建字段索引
通过phpmyadmin工具为参与搜索的字段,排序字段,搜索url出现的字段,创建合理的索引关系
2、尽量使用int类型的字段搜索,char和text等类型避免搜索条件
3、搜索字段不宜过多,5个以内最佳
4、尽量屏蔽蜘蛛爬虫访问搜索页面
5、最好设置一个最大搜索结果数量值,来限定只显示多少搜索数量
时间范围的搜索写法
适用于search.html模板写法
{Router::search_url($params, '时间字段', "开始时间,结束时间")}
相关例子:
1、查询2012-1-1到2019-1-1的内容地址
{Router::search_url($params, 'updatetime', "2012-1-1,2019-1-1")}
updatetime是内容的更新时间
inputtime是内容的发布时间
2、查询2012年至今的内容地址
{Router::search_url($params, 'updatetime', "2012-1-1")}
内容模块搜索框写法
注意:s的news参数是指定模块目录
单击搜索按钮就进入搜索界面,逻辑很简单,表单美化你们去处理
搜索函数写法 dr_search_url
搜索函数:
{Router::search_url($params, '字段名', '字段值', '模块目录(search页面可以省略)')}
支持多个参数传递:
{Router::search_url($params, ['字段名1', '字段名2'], ['字段值1', '字段值2'], '模块目录(search页面可以省略)')}
如果在首页或者非search页面使用这个函数必须加上第四个参数:模块目录
{Router::search_url($params, '字段名', '字段值', '模块目录')}
搜索关系介绍
搜索匹配方式是or关系
以上图为例,搜索匹配是【场景 or 行业 or 格式】,当他们任意一个字段满足条件是就会有结果。
字段词的匹配方式
当搜索字段词是:【宸逸】,将会在数据库中模糊匹配这个词语带有【宸逸】的就会有结果。
如果要改成这个字段必须精确等于【宸逸】时,需要在下图开启完整匹配:
示例代码
在cms的demo/search.html 模块自带很多搜索示例的写法,例如:
{list action=linkage code=联动菜单字段的联动菜单code值 pid=$params.联动菜单字段英文名} {/list}{php $field = dr_field_options($ci->module['field']['单选字段英文名']['id']);} {loop $field $value $name} {/loop}{php $field = dr_field_options($ci->module['field']['单选字段英文名']['id']);} {loop $field $value $name} {/loop}{php $field = dr_field_options($ci->module['field']['复选字段英文名']['id']);} {loop $field $value $name} {/loop}{php $field = dr_field_options($ci->module['field']['复选字段英文名']['id']);} {loop $field $value $name} {/loop}{php $field = dr_field_options($ci->module['field']['下拉字段英文名']['id']);} {loop $field $value $name} {/loop}{php $price=array('0,500'=>'500以内','500,1000'=>'500到1000','1000,2000'=>'1000到2000','2000,3000'=>'2000到3000','3000,0'=>'3000以上');} {loop $price $i $t} {/loop}{php $zhxgm = explode(',', $params.zhxgm);}
注意:$params是搜索参数数组,只能在搜索页面使用;以上字段的中文地方需要按需修改你后台自己创建的字段名称即可
注意:复选框字段,在创建选项值的时候,务必填写储存值,且储存值不可为汉字,建议为数字或者字母代替。
=======================
示例操作1、新建条件字段,例如类型:
并录入数据到此条件上
2、打开模板标签生成工具
3、然后找到搜索模板search.html将上面的条件代码复制进去。
4、搜索页面进行效果展示
如上图,点击类目1一级可以筛选出后台存储的内容了,界面优化靠大家了
=========================已选条件的写法============================
{if $params['order']}
{/if}
{loop $param_value $p $v}
{/loop}
栏目模型字段[联动菜单字段]搜索
在栏目模型字段里面创建一个联动菜单字段,如何进行搜索展示呢?
栏目#1的模型字段
当在栏目1中发文时,会显示以上的字段,那么如何搜索筛选呢?
需要改造几个地方
1、打开news模块的search.html搜索模板,加上搜索参数
{if $catid==1} 栏目1的字段{/if}{list action=linkage code=address pid=$params.chegnshi} {/list}
2、如果啊,如果,只是如果要在搜索列表里面显示上面这些字段,需要加上参数 more=1
百度地图定位搜索
需要安装官方版的<百度地图字段插件>
应用场景一:在坐标范围内搜索相关的内容
1、创建模块的百度地图字段:baiduditu,记住这个名字
2、发布一篇测试内容
3、前端search.html增加搜索代码:
{dr_baidu_map_js()}
以上代码放到search标签外面,用于定位当前的浏览器IP坐标
如果自己组装搜索坐标范围的话,可以参考以下的搜索参数说明:
&百度地图字段名称=经度lng,纬度lat|范围值
范围值单位是km
4、在search标签内,显示距离多少米
{if $params.baiduditu}{dr_distance($t.baiduditu_lng.','.$t.baiduditu_lat, $params.baiduditu)}{/if}
场景二:按当前定位的坐标显示最近的内容
1、页面顶部增加一下数据
pos_map = [ 'lng' => $lng, 'lat' => $lat, ]; } ?>
2、search标签的order改写为 order=baiduditu
联动搜索条件显示上下级菜单一并显示
一、显示二级联动
cscz是字段名称 address是联动菜单名称 可以随意改
代码效果:
{if $tp.child}{linkage code=address pid=0} {/linkage}{/if}{linkage code=address pid=$tpid} {/linkage}
代码共享人:https://www.xunruicms.com/user-4310.html
原文地址:https://www.xunruicms.com/wenda/11942.html
二、显示三级联动
{if $b}{linkage code=address pid=0} {/linkage}{/if} {if $c}{linkage code=address pid=$b} {/linkage}{/if}{linkage code=address pid=$c} {/linkage}
代码共享人:https://www.xunruicms.com/user-32186.html
原文地址:https://www.xunruicms.com/wenda/12420.html
搜索关键词高亮显示 dr_keyword_highlight
让搜索结果的搜索关键词高亮显示,比如当前搜索变量是 “新闻”,那么搜索列表就高亮本词语
默认写法{$t.title}改成
{dr_keyword_highlight($t.title, $keyword)}
自定义样式规则:
{dr_keyword_highlight($t.title, $keyword, '[value]')}
栏目模型字段参与搜索
category_search_field 的详细参数说明文档
1、Select、Radio、Checkbox字段自动获取并显示条件方法
当栏目模型字段参与搜索时必须开启参与搜索按钮
那么search.html的条件写法是:
{category_search_field module=MOD_DIR catid=$catid}{/category_search_field}{loop $t.data $v} {/loop}
2、手动显示条件方法
栏目模型字段显示,必须与栏目catid成对出现,要想使用模型字段搜索,那么必须有catid参数
换句话来说就是搜索的url参数中必须存在catid的栏目id号,才能使他的所属模型字段搜索条件生效!
比如调用栏目catid=1下面的附加字段 属性 作为搜索条件
{if $catid && $catid == 1}{/if}{php $field = dr_field_options($ci->module['category_data_field']['danxuananniu']['id']);} {loop $field $value $name} {/loop}
再比如调用栏目id=1或者=2怎么写:
{if $catid && in_array($catid, [1, 2])}
将用户表字段作为搜索条件
需求环境:
使用用户信息表的自定义字段作为模块内容的搜索条件,用户表字段不能与模块内容字段重复,当用户自定义字段是aaa,那么aaa字段就不能出现在内容模块里面被定义。
例如用户表自定义字段:区域,如下图
需求是把这个字段放在内容模块搜索条件,目的是搜索在这个区域的用户发布的内容
1、打开搜索文件模板.demo/search.html
由于例子是select字段,我们就复制demo模块的现成的select字段示例代码
2、找到demo模块自带的select字段示例代码
3、将上面代码复制一段出来
为例区分,我改了一个名词
4、然后将字段换成用户表的字段名称 quyu
需要修改地方已经标注就出来了
5、预览效果
首页调用模块的条件搜索
搜索函数:
{Router::search_url($params, '字段名', '字段值', '模块目录(首页时必须填写)')}
默认情况下cms的搜索条件是显示在模块的search专用页面上,例如:http://demo4.xunruicms.com/demo/search.html
如果想把这些条件选项放在首页,需要对调用参数做一定的修改
例如上例子的单选字段为例,其他字段方法参考一样的
1、首先确定这个模块目录是什么,我们例子以demo模块为例
2、然后又确定条件字段是什么,我们以【单选字段为例】,找到模块的自定义界面,找到id号码
3、在demo/search.html可以看出这个字段的默认调用方法是这样写的
4、把这段例子代码复制到首页模板中,index.html
做一些改变:
{php $field = dr_field_options(126);} {loop $field $value $name} {/loop}
只改变id号,和模块目录值
5、这时候就可以在首页看到搜索条件了,点击这个条件链接就会跳转到demo模块的搜索页面上去了!!
热门搜索词的写法技巧
类似这种搜索词如何定义和调用呢?这种有多种方案可选,比如用最基本的网站表单实现它
1、创建搜索词的网站表单
2、定义一些字段
3、一般情况下需要定义以下字段,具体看你的需求
title : 搜索词 color: 颜色值
4、更新缓存,然后刷新后台界面,去内容管理中,录入一些词语
5、前端调用这些词
{form form=sousuoci order=displayorder,id} {$t.title} {/form}
其中demo需要改成具体的模块目录哦!!
自定义搜索页面模板
搜索页面模板默认是search.html,宸逸cms支持按栏目设置不同的搜索模板,例如栏目1可以设置searchA.html,栏目2可以设置searchB.html。
设置方法:
1、进入栏目管理类界面,进入某个栏目的修改界面
2、进入模板设置界面,找到内容搜索界面
3、输入任意文件名称,例如searchA.html
这样,当搜索url中出现了栏目是1的栏目时,就会自动加载searchA.html模板了
/index.php?s=模块目录&c=search&catid=这个栏目编号
如果没有加栏目参数,就任然加载默认模板search.html
按字段值显示不同的搜索模板文件
需要让模块的自定义字段中的某一个字段值显示不同的搜索模板界面,例如在模块自定义字段里面定义了一个分类字段叫做fenlei,类型是select,选项有
文件类|1 图片类|2 文档类|3
当选择文件类参数搜索时,就加载search_1.html,当选择图片类搜索时就加载search_2.html 等等
实现步骤:
1、在搜索设置种,选择本字段
选择上面的字段,例如fenlei,保存后台
2、当前台访问时,最终效果:
index.php?s=news&c=search :这种地址就加载news/search_default.html模板
index.php?s=news&c=search&fenlei=1 :这种地址就加载news/search_1.html模板
index.php?s=news&c=search&fenlei=2 :这种地址就加载news/search_2.html模板
当访问时候发现模板仍然加载的默认模板的话,这时候需要开启开发者模式,然后继续访问一次,后台会产生日志,如下:
栏目列表页面与搜索页面的关系
当需要在栏目页面下使用条件搜索时,这时候条件搜索函数URL会跳转到其搜索URL上,搜索功能始终在搜索页面上使用,
那么如果我想在栏目列表上直接跳转到搜索怎么办呢?
进入模块搜索设置,开启继承栏目页
这样访问栏目页就自动定位到搜索了
如果需要为栏目设置不同的搜索模板的话,进入栏目的修改界面设置模板
通过以上设置后,栏目模板将会无效了,只保留栏目搜索功能。
那么如果我想保留栏目列表,同时满足搜索怎么办?
1、进入模块搜索设置,关闭继承栏目页,不让他继承了
2、这时候访问栏目url就成功访问栏目列表模板了,但你还需要做一个搜索模板用于搜索参数的跳转后的模板
意思是,这种模式下,会做两个模板。
Ajax多条件的搜索效果
使用场景:在任意网页进行ajax无刷新请求搜索效果
实现原理:
通过现有的搜索url加入参数:ajax_page=新的模板名称.html,这时候cms会按照模板返回新内容,以便ajax做返回输出处理。
一、准备工作:
先创建AJAX搜索结果输出的模板文件。注:因为搜索是按照模块内容进行搜索,所以需要提前按照模块创建搜索结果输出模板。
假设有个新闻模块,模块名称为:news,创建模板的路径为:
PC端:/template/pc/default/home/news/myajax.html
移动端:/template/mobile/default/home/news/myajax.html
myajax.html 可以根据自己的需要随意修改名称。
二、搜索结果模板内容:
{search module=MOD_DIR id=$searchid total=$sototal order=$params.order catid=$catid page=1 pagesize=10 urlrule=$urlrule} 文章标题:{$t.title}
标题截断:{dr_strcut($t.title, 20)}
文章连接:{$t.url}
缩略图:{dr_thumb($t.thumb, 100, 90)}
栏目名称:{dr_cat_value(MOD_DIR,$t.catid, 'name')}
栏目连接:{dr_cat_value('news',$t.catid, 'url')}
更新时间:{$t.updatetime}
{/search}
三、通过URL进行AJAX搜索:
URL连接参数: 请求地址:/index.php?s=news&c=search&catid=1&ajax_page=myajax.html&page=1 参数介绍: s = 模块名称 catid = 模块内的栏目ID,非必填 c = search (固定,不可更改) ajax_page = 搜索结果输出模板(准备工作内创建的模板) page = 请求的分页编号
四、测试AJAX搜索结果:
这个就是自定义的搜索结果输出模板的内容
五、拼接AJAX
模板内获取栏目id: url: "/index.php?s=shop&c=search&catid={$catid}&ajax_page=myajax.html&page=1&keyword=关键词",
红色为当前栏目id
六、实现下拉自动加载