zoukankan      html  css  js  c++  java
  • 织梦dedecms实现按照字母搜索的实现方法

    目前织梦dedecms v5.7已正式发布,但在实际的使用环境中往往我们需要进行一些特定功能的实现,比如按照字母搜索等,下面我们来说一下该功能是如何实现的,主要的方法就是提取发布资源中第一个字母,存储到数据表中,然后进行索引。

    DedeCMS 基于PHP和MySQL技术开发,可同时使用于Windows、Linux、Unix平台,环境需求如下:

    1、Windows 平台:
    IIS/Apache + PHP4/PHP5 + MySQL3/4/5
    如果在windows环境中使用,建议用DedeCMS提供的DedeAMPZ套件以达到最佳使用性能。

    2、Linux/Unix 平台
    Apache + PHP4/PHP5 + MySQL3/4/5 (PHP必须在非安全模式下运行)

    建议使用平台:Linux + Apache2.2 + PHP5.2 + MySQL5.0

    织梦版本为5.7 GBK 其他没有测试
    在进行本操作之前 要先备份数据库
    首先 要添加数据库字段
    ALTER TABLE `dede_archives` ADD `fpy` VARCHAR( 40 ) NOT NULL AFTER `weight` ;
    用于保存标题的第一个字母的拼音
    打开dede/templets/article_add.htm大概在136行 (</td>上面)添加以下代码提示是否保存
    <input name="F_PY" type="checkbox" id="S_PY" class="np" value="1" checked="checked">保存拼音
    同理在article_edit.htm也需要添加
    打开dede/article_add.php 在102行以下添加$fpy=$F_PY==1 ? str_replace('_','',GetPinyin(stripslashes

    ($title),1)) : '';用于获得标题的拼音 找到191行 ,对刚新建的字段进行赋值,相信大家都会的:
    将原来的 $query = "INSERT INTO `dede_archives`

    (id,typeid,typeid2,sortrank,flag,ismake,channel,arcrank,click,money,title,shorttitle,color,writer,sour

    ce,litpic,pubdate,senddate,mid,voteid,notpost,description,keywords,filename,dutyadmin,weight) VALUES

    ('$arcID','$typeid','$typeid2','$sortrank','$flag','$ismake','$channelid','$arcrank','$click','$money'

    ,'$title','$shorttitle','$color','$writer','$source','$litpic','$pubdate','$senddate','$adminid','$vot

    eid','$notpost','$description','$keywords','$filename','$adminid','$weight');";
    改为
    $query = "INSERT INTO dede_archives`

    (id,typeid,typeid2,sortrank,flag,ismake,channel,arcrank,click,money,title,shorttitle,color,writer,sour

    ce,litpic,pubdate,senddate,mid,voteid,notpost,description,keywords,filename,dutyadmin,weight,fpy)

    VALUES

    ('$arcID','$typeid','$typeid2','$sortrank','$flag','$ismake','$channelid','$arcrank','$click','$money'

    ,'$title','$shorttitle','$color','$writer','$source','$litpic','$pubdate','$senddate',

    '$adminid','$voteid','$notpost','$description','$keywords','$filename','$adminid','$weight','$fpy');";

    你应该能看懂的。

    到此 在你添加文章的时候 标题拼音会自动保存的。


    接下来 就要看search.php了
    为了 调用方便 我写了个标签 只需要在调用的地方添加 {dede:letter /} (include/tablib) 新建letter.lib.php
    <?php
    if(!defined('DEDEINC'))
    {
    exit("Request Error!");
    }
    function lib_letter(&$ctag,&$refObj)
    {
    global $dsql,$sqlCt,$cfg_soft_lang,$cfg_indexurl;
    $attlist="letter|A,row|26";
    FillAttsDefault($ctag->CAttribute->Items,$attlist);
    extract($ctag->CAttribute->Items, EXTR_SKIP);

    $letter='';
    $le_end=64+$row;
    for($i=65;$i<=$le_end;$i++){
    $letter.="<a href='$cfg_indexurl/plus/search.php?keyword=".strtolower(chr

    ($i))."&searchtype=pytitle'>".chr($i)."</a> ";
    }
    return $letter;
    }
    ?>

    最后也是最关键的一部 更改search.php 默认的是不能小于2个字符的
    找到plus/search.php
    将if(($keyword=='' || strlen($keyword)<2) && empty($typeid))
    {
    ShowMsg('关键字不能小于2个字节!','-1');
    exit();
    }改为if($searchtype<>'pytitle'){
    if(($keyword=='' || strlen($keyword)<2) && empty($typeid))
    {
    ShowMsg('关键字不能小于2个字节!','-1');
    exit();
    }
    }即可

    找到include/arc.searchview.class.php
    首先要设置sql语句 函数GetKeywordSql
    找到if($this->SearchType=="title"){
    $kwsqls[] = " arc.title LIKE '%$k%' ";
    }else{
    $kwsqls[] = " CONCAT(arc.title,' ',arc.writer,' ',arc.keywords) LIKE '%$k%' ";
    }改为:
    if($this->SearchType=="title"){
    $kwsqls[] = " arc.title LIKE '%$k%' ";
    }else if($this->SearchType=='pytitle'){
    $kwsqls[] = " CONCAT(arc.title,' ',arc.keywords,' ',arc.fpy) LIKE '%$k%' ";
    }else{
    $kwsqls[] = " CONCAT(arc.title,' ',arc.writer,' ',arc.keywords) LIKE '%$k%' ";
    }

    在此函数下 添加函数:
    function Getletter($num=26,$t,$k){
    global $cfg_indexurl;
    $le_end=64+$num;
    for($i=65;$i<=$le_end;$i++){
    if(ord(strtoupper($k))==$i){
    $letter.="<a style='background:#000;color:#fff'

    href='$cfg_indexurl/plus/search.php?keyword=".strtolower(chr($i))."&searchtype=pytitle'>".chr

    ($i)."</a> ";
    continue;
    }
    $letter.="<a href='$cfg_indexurl/plus/search.php?keyword=".strtolower(chr

    ($i))."&searchtype=pytitle'>".chr($i)."</a> ";
    }
    return $letter;
    }
    作用就是 让当前搜索的字母 加亮显示

    设置search的底层模板的标签 display函数
    在 else if($tagname=="likewords")
    {
    $this->dtp->Assign($tagid,$this->GetLikeWords($ctag->GetAtt('num')));
    }下添加
    else if($tagname=='letter' and $this->SearchType=='pytitle'){
    $this->dtp->Assign($tagid,$this->Getletter($num=26,$this->SearchType,$this-

    >Keyword));
    }

    到此 结束,哈哈,,其实也不是很难的。记住千万要记得备份你原来的程序啊!

     相关文章:http://www.ithov.com/master/115647.shtml

  • 相关阅读:
    OGG for sqlserver engryption && insert/delete
    MySQL中SQL_CALC_FOUND_ROWS的用法
    VMWARE 虚拟机新增硬盘,格式化分区,并挂载
    Mycat实战之数据迁移(oracle -- mysql)
    MYCAT实战之分片迁移
    mycat实战之性能测试
    Mycat实战之主键数据库自增方式
    对象的创建与克隆
    c#调用c++的dll,错误篇
    java 模拟消息的发送功能
  • 原文地址:https://www.cnblogs.com/langtianya/p/2686821.html
Copyright © 2011-2022 走看看