模板制作教程:内容搜索

此模块已经关闭了搜索功能

image.png

需要在模块中开启搜索功能:

image.png


更新缓存生效!!

搜索参数多条件的写法

image.png

类似以上图片这种条件搜索,一个字段可以使用多个条件选中查询,当其中任意一个选项匹配时就显示结果,

如上图所示:当选择【带薪年假+年终奖】两个选项时,两个条件满足任意一个时就会搜索到结果。

如果要两个条件都同时满才会搜索到结果的话,需要在后台开启下图的选项:

搜索参数多条件的写法

此查询需要以下字段支持:

联动菜单: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等类型避免搜索条件

{xunruicms_img_title}


3、搜索字段不宜过多,5个以内最佳

4、尽量屏蔽蜘蛛爬虫访问搜索页面

5、最好设置一个最大搜索结果数量值,来限定只显示多少搜索数量

{xunruicms_img_title}

时间范围的搜索写法

适用于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, '字段名', '字段值', '模块目录')}

image.png

搜索关系介绍

搜索匹配方式是or关系

以上图为例,搜索匹配是【场景 or 行业 or 格式】,当他们任意一个字段满足条件是就会有结果。


字段词的匹配方式

当搜索字段词是:【宸逸】,将会在数据库中模糊匹配这个词语带有【宸逸】的就会有结果。

如果要改成这个字段必须精确等于【宸逸】时,需要在下图开启完整匹配:

搜索函数写法 dr_search_url


示例代码

在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是搜索参数数组,只能在搜索页面使用;以上字段的中文地方需要按需修改你后台自己创建的字段名称即可

注意:复选框字段,在创建选项值的时候,务必填写储存值,且储存值不可为汉字,建议为数字或者字母代替。

image

=======================

示例操作
1、新建条件字段,例如类型:

搜索函数写法 dr_search_url

并录入数据到此条件上

2、打开模板标签生成工具

搜索函数写法 dr_search_url

3、然后找到搜索模板search.html将上面的条件代码复制进去。

搜索函数写法 dr_search_url

4、搜索页面进行效果展示

搜索函数写法 dr_search_url

如上图,点击类目1一级可以筛选出后台存储的内容了,界面优化靠大家了


=========================已选条件的写法============================

搜索函数写法 dr_search_url

 
                                
                                    已经选择
                                    
                                        
                                        {if $params['order']}
                                        
                                        {/if}
                                        
                                        {loop $param_value $p $v}
                                        
                                        {/loop}
                                    
                                

栏目模型字段[联动菜单字段]搜索

在栏目模型字段里面创建一个联动菜单字段,如何进行搜索展示呢?


栏目#1的模型字段

当在栏目1中发文时,会显示以上的字段,那么如何搜索筛选呢?


需要改造几个地方

1、打开news模块的search.html搜索模板,加上搜索参数

{if $catid==1}
栏目1的字段

    联动菜单
    
        
        
        {list action=linkage code=address pid=$params.chegnshi}
        
        {/list}
    
{/if}


2、如果啊,如果,只是如果要在搜索列表里面显示上面这些字段,需要加上参数 more=1

百度地图定位搜索

需要安装官方版的<百度地图字段插件



应用场景一:在坐标范围内搜索相关的内容

1、创建模块的百度地图字段:baiduditu,记住这个名字

image.png


2、发布一篇测试内容


3、前端search.html增加搜索代码:

{dr_baidu_map_js()}

    // 百度地图定位坐标
    {if !$params.baiduditu}
    var geolocation = new BMap.Geolocation();
    geolocation.getCurrentPosition(function(r){
        if(this.getStatus() == BMAP_STATUS_SUCCESS){
            var url="{Router::search_url($params, 'baiduditu', 'xunruicms')}";
            url = url.replace('xunruicms', r.point.lng+','+r.point.lat+'|5'); // 这里的5表示附近5公里的内容
            location.href=url;
        } else {
            alert('定位失败:'+this.getStatus());
        }
    },{enableHighAccuracy: true});
    {/if}

以上代码放到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是联动菜单名称
可以随意改

代码效果:




    一级联动
    
        

        
        
        {linkage code=address pid=0}
        
        {/linkage}
    
{if $tp.child}     二级联动                                {linkage code=address pid=$tpid}                  {/linkage}      {/if}

代码共享人:https://www.xunruicms.com/user-4310.html

原文地址:https://www.xunruicms.com/wenda/11942.html



二、显示三级联动



    一级联动
    
        

        
        
        {linkage code=address pid=0}
        
        {/linkage}
    

{if $b}

    二级联动
    

        
        
        {linkage code=address pid=$b}
        
        {/linkage}
    

{/if}
{if $c}

    三级联动
    

        
        
        {linkage code=address pid=$c}
        
        {/linkage}
    

{/if}

代码共享人:https://www.xunruicms.com/user-32186.html

原文地址:https://www.xunruicms.com/wenda/12420.html


搜索关键词高亮显示 dr_keyword_highlight

让搜索结果的搜索关键词高亮显示,比如当前搜索变量是 “新闻”,那么搜索列表就高亮本词语

image.png


默认写法{$t.title}改成

{dr_keyword_highlight($t.title, $keyword)}


自定义样式规则:

{dr_keyword_highlight($t.title, $keyword, '[value]')}


栏目模型字段参与搜索

 category_search_field 的详细参数说明文档



{xunruicms_img_title}

1、Select、Radio、Checkbox字段自动获取并显示条件方法


当栏目模型字段参与搜索时必须开启参与搜索按钮

image.png


那么search.html的条件写法是:




{category_search_field module=MOD_DIR catid=$catid}

 {$t.name}
 
  
  {loop $t.data $v}
   
  {/loop}
 
{/category_search_field}


2、手动显示条件方法

栏目模型字段显示,必须与栏目catid成对出现,要想使用模型字段搜索,那么必须有catid参数

换句话来说就是搜索的url参数中必须存在catid的栏目id号,才能使他的所属模型字段搜索条件生效!

比如调用栏目catid=1下面的附加字段 属性 作为搜索条件

{if $catid && $catid == 1}


 单选字段
 
  
  
  {php $field = dr_field_options($ci->module['category_data_field']['danxuananniu']['id']);}
  {loop $field $value $name}
  
  {/loop}
 

{/if}

再比如调用栏目id=1或者=2怎么写:

{if $catid && in_array($catid, [1, 2])}


将用户表字段作为搜索条件

需求环境:

使用用户信息表的自定义字段作为模块内容的搜索条件,用户表字段不能与模块内容字段重复,当用户自定义字段是aaa,那么aaa字段就不能出现在内容模块里面被定义。


例如用户表自定义字段:区域,如下图

image

需求是把这个字段放在内容模块搜索条件,目的是搜索在这个区域的用户发布的内容


1、打开搜索文件模板.demo/search.html

由于例子是select字段,我们就复制demo模块的现成的select字段示例代码


2、找到demo模块自带的select字段示例代码

image


3、将上面代码复制一段出来

image

为例区分,我改了一个名词


4、然后将字段换成用户表的字段名称 quyu

image

需要修改地方已经标注就出来了


5、预览效果

image

首页调用模块的条件搜索

搜索函数:

{Router::search_url($params, '字段名', '字段值', '模块目录(首页时必须填写)')}

默认情况下cms的搜索条件是显示在模块的search专用页面上,例如:http://demo4.xunruicms.com/demo/search.html

image


如果想把这些条件选项放在首页,需要对调用参数做一定的修改

例如上例子的单选字段为例,其他字段方法参考一样的

1、首先确定这个模块目录是什么,我们例子以demo模块为例

2、然后又确定条件字段是什么,我们以【单选字段为例】,找到模块的自定义界面,找到id号码

image

3、在demo/search.html可以看出这个字段的默认调用方法是这样写的

image

4、把这段例子代码复制到首页模板中,index.html

做一些改变:



    单选字段
    
        
        
        {php $field = dr_field_options(126);}
        {loop $field $value $name}
        
        {/loop}
    

image

只改变id号,和模块目录值

5、这时候就可以在首页看到搜索条件了,点击这个条件链接就会跳转到demo模块的搜索页面上去了!!

热门搜索词的写法技巧

image

类似这种搜索词如何定义和调用呢?这种有多种方案可选,比如用最基本的网站表单实现它


1、创建搜索词的网站表单

image

2、定义一些字段

image

3、一般情况下需要定义以下字段,具体看你的需求

title : 搜索词
color: 颜色值

image

4、更新缓存,然后刷新后台界面,去内容管理中,录入一些词语

image


5、前端调用这些词

{form form=sousuoci order=displayorder,id}
{$t.title}
{/form}

其中demo需要改成具体的模块目录哦!!

自定义搜索页面模板

搜索页面模板默认是search.html,宸逸cms支持按栏目设置不同的搜索模板,例如栏目1可以设置searchA.html,栏目2可以设置searchB.html。


设置方法:

1、进入栏目管理类界面,进入某个栏目的修改界面

{xunruicms_img_title}


2、进入模板设置界面,找到内容搜索界面

{xunruicms_img_title}


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、在搜索设置种,选择本字段

{xunruicms_img_title}

选择上面的字段,例如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模板

当访问时候发现模板仍然加载的默认模板的话,这时候需要开启开发者模式,然后继续访问一次,后台会产生日志,如下:

{xunruicms_img_title}

栏目列表页面与搜索页面的关系

当需要在栏目页面下使用条件搜索时,这时候条件搜索函数URL会跳转到其搜索URL上,搜索功能始终在搜索页面上使用,

那么如果我想在栏目列表上直接跳转到搜索怎么办呢?

进入模块搜索设置,开启继承栏目页

这样访问栏目页就自动定位到搜索了


如果需要为栏目设置不同的搜索模板的话,进入栏目的修改界面设置模板

{xunruicms_img_title}


通过以上设置后,栏目模板将会无效了,只保留栏目搜索功能。


那么如果我想保留栏目列表,同时满足搜索怎么办?

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搜索结果:

这个就是自定义的搜索结果输出模板的内容

微信截图_20220416105128


五、拼接AJAX

模板内获取栏目id: url: "/index.php?s=shop&c=search&catid={$catid}&ajax_page=myajax.html&page=1&keyword=关键词",

红色为当前栏目id


六、实现下拉自动加载