Yii框架结合sphinx,Ajax实现搜索分页功能示例

5年以前  |  阅读数:638 次  |  编程语言:PHP 

本文实例讲述了Yii框架结合sphinx,Ajax实现搜索分页功能的方法。分享给大家供大家参考,具体如下:

效果图:

控制器:


    <?php
    namespace backend\controllers;
    use Yii;
    use yii\web\Controller;
    use yii\data\Pagination;
    use SphinxClient;
    use yii\db\Query;
    use yii\widgets\LinkPager;
    use backend\models\Goods;
    class SouController extends Controller
    {
      //显示搜索页面
      public function actionIndex()
      {
        //接受搜索值
        $sou=Yii::$app->request->get('sou');
        $p1=Yii::$app->request->get('p1');
        $p2=Yii::$app->request->get('p2');
        //echo $sou.$p1.$p2;die;
        //sphinx搜索
        $cl = new SphinxClient();
        $cl -> SetServer('127.0.0.1',9312);
        $cl -> SetConnectTimeout(3);
        $cl -> SetArrayResult(true);
        if($sou)
        {
          //只搜索条件
          $cl -> SetMatchMode(SPH_MATCH_ANY);
        }
        else
        {
          //全局扫描
         $cl -> SetMatchMode(SPH_MATCH_FULLSCAN);
        }
        //设置价格(注意:创建索引时,价格属性定义为int)
        if($p1&&$p2)
        {
        $cl->SetFilterRange('price',$p1,$p2);
        }
        //搜索查询关键字
        $res = $cl->Query($sou,"mysql_goods");
        //ajax分页
        $model=new Goods();
        foreach ($res['matches'] as $key => $val)
        {
         $ids[] = $val['id'];
        }
        //查询条件数据
        $query = $model->find()->where(['id'=>$ids]);
        $countQuery = clone $query;
        $pages = new Pagination(['totalCount' => $countQuery->count(),'defaultPageSize'=>3]);
        //分页
        $models = $query->offset($pages->offset)
        ->limit($pages->limit)
        ->all();
        //关键字变红
        foreach($models as $k=>$v)
        {
          $models[$k]['goods_name']=str_replace("$sou","<font color='red'>$sou</font>",$v['goods_name']);//将关键字替换成红色字体
        }
        //显示列表,分配数据
        return $this->render('index', [
           'res' => $models,
           'pages' => $pages,
           'sou'=>$sou,
           'p1'=>$p1,
           'p2'=>$p2
        ]);
       }
    }
    ?>

视图层:


    <?php
    use yii\helpers\Html;
    use yii\widgets\ActiveForm;
    use yii\widgets\LinkPager;
    $form = ActiveForm::begin([
      'action' => 'index.php?r=sou/index',
      'method' => 'get'
    ]) ?>
    <center>
    <div id="list">
      商品名称:
      <input type="text" name="sou" value="<?php echo $sou?>">
      价格区间:
      <input type="text" name="p1" value="<?php echo $p1?>">---<input type="text" name="p2" value="<?php echo $p2?>">
      <input type="submit" value="搜索">
      <table border="1" style="width:500px;">
        <tr>
          <th>ID</th>
          <th>商品名称</th>
          <th>商品价格</th>
        </tr>
        <?php foreach($res as $key=>$v){?>
        <tr>
          <td><?php echo $v['id'];?></td>
          <td><?php echo $v['goods_name'];?></td>
          <td><?php echo $v['price'];?></td>
        </tr>
        <?php }?>
     </table>
    <!--分页-->
    <?= LinkPager::widget(['pagination' => $pages]) ?>
    </div>
    </center>
    <?php ActiveForm::end() ?>
    <!--显示-->
    <?php $this->beginBlock('test2') ?>
      $(document).on('click', '.pagination a', function(e)
      {
        //阻止page显示,看地址
        e.preventDefault();
        var href = $(this).attr('href');
        $.post(href,function(msg){
          $('#list').html(msg);
        })
      });
    <?php $this->endBlock();
    $this->registerJs($this->blocks['test2'] , yii\web\View::POS_END)
    ?>

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例