zoukankan      html  css  js  c++  java
  • ECSHOP模糊分词搜索和商品列表关键字飘红功能

    ECSHOP联想下拉框

    1、修改page_header.lbi模版文件,将搜索文本框修改为:

    复制代码
    <input name="keywords" type="text" id="keyword" value="<!--{if ($search_keywords neq "")}{$search_keywords|escape}--><!--{else}-->ecshop<!--{/if}-->" class="search-input"  onfocus="if(this.value=='ecshop'){this.value='';this.style.color='#000';}"  onblur="closediv();if(this.value==''){this.value='ecshop';this.style.color='#999';}" style="color:#999;"  onkeyup="keyupdeal(event,this.value);" onkeydown="keydowndeal(event);" onclick="keyupdeal(event,this.value);"   autocomplete="off" />
       <div id="search_suggest" style="display:none;" onmouseover='javascript:_over();' onmouseout='javascript:_out();'></div>
    复制代码

    嵌入js文件

    <script type="text/javascript" src="/js/suggest.js"></script>

    嵌入css文件

    <link href="/themes/default/images/css.css" rel="stylesheet" type="text/css">

     2、根目录添加php文件search_suggest.php文件

    二、分词搜索

    根目录增加织梦分词算法函数和词库:lib_splitword_full.php和dededic.csv

    1、修改search.php文件第196行

    /* 检查关键字中是否有空格,如果存在就是并 */
                $arr        = explode(' ', $_REQUEST['keywords']);
                $operator   = " AND ";

    改为:

    复制代码
    /*调用织梦分词功能-start*/
                require("lib_splitword_full.php");
                $sp = new SplitWord();
                $fenci=$sp->SplitRMM($_REQUEST['keywords']);
                $sp->Clear();
                /* 织梦分词后是使用空格进行划分,所以仍可使用ecshop的按照空格拆分为数组功能:检查关键字中是否有空格,如果存在就是并 */
                $arr        = explode(' ', $fenci);
                $arr        = array_reverse($arr);//将数组倒序排列,并插入完整关键字到数组末尾
                $arr[count($arr)]=$_REQUEST['keywords'];
                $arr        = array_reverse($arr);//再次将数组倒序,使完整关键字可以第一个被检索
                array_pop($arr);//删除织梦分词产生的数组最后一个元素为空格
                $operator   = " and ";//sql检索语句使用union联合检索
                $piaohong = $arr;//$arr数组在飘红的时候已经被产品列表占用了,所以另外赋值给一个数组备用。
                /*调用织梦分词功能-end*/
    复制代码

    2、修改search.php文件第382行到403行

    复制代码
     /* 获得符合条件的商品总数 */
        $sql   = "SELECT COUNT(*) FROM " .$ecs->table('goods'). " AS g ".
            "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ".
            "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock ." ) ".$tag_where." )";
        $count = $db->getOne($sql);
    
        $max_page = ($count> 0) ? ceil($count / $size) : 1;
        if ($page > $max_page)
        {
            $page = $max_page;
        }
    
        /* 查询商品 */
        $sql = "SELECT g.goods_id, g.goods_name, g.market_price, g.is_new, g.is_best, g.is_hot, g.shop_price AS org_price, ".
                    "IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS shop_price, ".
                    "g.promote_price, g.promote_start_date, g.promote_end_date, g.goods_thumb, g.goods_img, g.goods_brief, g.goods_type ".
                "FROM " .$ecs->table('goods'). " AS g ".
                "LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp ".
                        "ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' ".
                "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ".
                    "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock . " ) ".$tag_where." ) " .
                "ORDER BY $sort $order";
    复制代码

    修改为:

    复制代码
    /*sun04zh3-20130905-调用织梦分词功能-更改ecshop的sql语句采用union方式-start*/
    /*因为后面要用union生成数据集表,所以先根据拆分出的关键词,生成union所需的所有sql语句,*/
    $select = "(";
        foreach($arr AS $se => $t)
        {
    
            $select .= "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type FROM(select  click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type from".$ecs->table('goods')." where goods_name like '%$t%' order by click_count desc) AS P$se";//第一个关键词是完整关键词
            if($se==0)//插入一个当所有拆分关键词在商品名称中为and时的sql语句
            {
                $select .= " UNION SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type FROM(select  click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type from".$ecs->table('goods')." where 1  $keywords order by click_count desc) AS Pa";
            }
            if($se<count($arr)-1)//在每条select语句后增加union,最后一个不加,所以$se小于元素数量-1
            {
                $select.=" UNION ";
            }
        }
        $select.=")";
        if($select=="()")//当关键词为空时,没有拆分关键词,所以用于union的$select为空,仍需要调用goods表
        {
             $sql   = "SELECT COUNT(*) FROM ".$ecs->table("goods")." AS P " .
                "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1  " ;
        }
        else
        {
             /* 获得符合条件的商品总数 */
            $sql   = "SELECT COUNT(*) FROM $select AS P " .
                    "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1  " ;
        }
        $count = $db->getOne($sql);
    
        $max_page = ($count> 0) ? ceil($count / $size) : 1;
        if ($page > $max_page)
        {
            $page = $max_page;
        }
        if($select=="()")//当关键词为空时,没有拆分关键词,所以用于union的$select为空,仍需要调用goods表 
        {
             /* 查询商品 */
        $sql = "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type ".
                "FROM ".$ecs->table("goods")." AS P " .
                "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1  " ;
        }
        else
        {
             /* 查询商品 */
                $sql = "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type ".
                "FROM $select AS P " .
                "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1  " ;
        }
       
    复制代码

    三、搜索出的产品列表产品关键词飘红功能:

    1、修改search.php文件第473行到480行

    复制代码
    if($display == 'grid')
            {
                $arr[$row['goods_id']]['goods_name']    = $GLOBALS['_CFG']['goods_name_length'] > 0 ? sub_str($row['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $row['goods_name'];
            }
            else
            {
                $arr[$row['goods_id']]['goods_name'] = $row['goods_name'];
            }
    复制代码

    修改为:

    复制代码
    /*根据分词对产品名称进行替换-start*/
            $tihuan=$row["goods_name"];
            foreach($piaohong AS $ph_count => $ph)
            {
    
                $tihuan = str_replace($ph,"<b style='color:#d90000'>$ph</b>",$tihuan);
            }       
            $arr[$row['goods_id']]['goods_name'] = $row['goods_name'];//因为前台用到没有替换的商品名称,所以保留goods_name值
               $arr[$row['goods_id']]['tihuan'] = $tihuan;
            /*根据分词对产品名称进行替换-end*/
    复制代码

     2、修改search.dwt模板文件

    将显示商品名称的地方替换为:

    <p><a href="{$goods.url}" title="{$goods.name|escape:html}">{$goods.tihuan}</a></p>

     四、文中所有涉及的修改和要用到的文件,因为没找到上传文件的地方所有放到其他网站了。下载地址:http://download.csdn.net/detail/sun04zh3/6216851  

  • 相关阅读:
    计算机作业(四)
    计算作业(三)衡阳汽车工程学院
    数制转换
    第十一次作业——PPT内容
    第三次作业——计算机用CMD命令关机建立文件夹
    第一次作业——PC端配置详细2017级机械设计新生杨路生
    PC端配置详细 2017级机械设计新生 刘林峰
    数制转换
    计算机基础作业 17级-车辆工程-周金霖
    计算机应用基础教程作业 车辆工程 冯大昕
  • 原文地址:https://www.cnblogs.com/love1226/p/4521202.html
Copyright © 2011-2022 走看看