Yii中后台搜索功能
后台有时数据多了需要添加搜索功能,我也是初学者,也不知道实现的方式对不对。后台的话我都是用bootstrap生成的,要比Yii本身自动生成的页面好看多了。下面还是说下我是如何简单的实现搜索功能的。
1.视图中添加搜索表单
<?php /** @var BootActiveForm $form */ $form = $this->beginWidget(‘bootstrap.widgets.TbActiveForm‘, array( ‘id‘=>‘searchForm‘, ‘type‘=>‘search‘, )); ?> <?php echo $form->textFieldRow($customers, ‘name‘, array(‘class‘=>‘input-medium‘, ‘prepend‘=>‘<i class="icon-search"></i>‘)); ?> <?php $this->widget(‘bootstrap.widgets.TbButton‘, array(‘buttonType‘=>‘submit‘, ‘label‘=>‘搜索‘,‘htmlOptions‘=>array(‘id‘=>‘search_customer‘))); ?> <?php $this->endWidget(); ?>
视图样式如下:
2.后台数据是以表格形式展示的,用到的是bootstrap里的TbGridView
<?php $this->widget(‘bootstrap.widgets.TbGridView‘, array( ‘id‘=>‘customers-grid‘, ‘type‘=>‘bordered ‘, ‘dataProvider‘=>$customers->search(), // ‘filter‘=>$customers, ‘columns‘=>array( ‘name‘, // array(‘name‘=>‘customerproduct.subscribe_capital‘,‘header‘=>‘认缴出资额‘,‘value‘=>‘CustomerProduct::showTotal($data->id)‘), array(‘name‘=>‘history_buy_amount‘,‘value‘=>‘CustomerProduct::showHistoryMoney($data->id)‘), array(‘name‘=>‘amount_on_hand‘,‘value‘=>‘CustomerProduct::showOnhandMoney($data->id)‘), array(‘name‘=>‘visit.addtime‘,‘header‘=>‘最近被访问时间‘,‘value‘=>‘Visit::showVisitDate($data->id)‘), array(‘name‘=>‘status‘, ‘type‘=>‘html‘, ‘value‘=>‘Customer::showStatus($data->status, $data->id)‘,‘visible‘=> Yii::app()->user->checkAccess(‘admin‘)), array(‘name‘=>‘employee_id‘, ‘type‘=>‘html‘, ‘value‘=>‘Customer::isDivided($data->employee_id, $data->id)‘,‘visible‘=> Yii::app()->user->checkAccess(‘admin‘)), array(‘name‘=>‘channel.cname‘, ‘header‘=>‘渠道用户‘,‘visible‘=> Yii::app()->user->checkAccess(‘admin‘)),
那么我们搜索后的数据是如何展示的呢?也就是说怎么查询出来数据,让GridView发生变化呢?
首先看上面代码中的dataProvider,是由model调用search方法获取的,那么我们再追踪到search函数。
public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->compare(‘id‘, $this->id); $criteria->compare(‘username‘,$this->username,true); $criteria->compare(‘name‘,$this->name,true); $criteria->compare(‘gender‘,$this->gender); $criteria->compare(‘age‘,$this->age); $criteria->compare(‘email‘,$this->email,true); $criteria->compare(‘mychat‘,$this->mychat); $criteria->compare(‘telephone‘,$this->telephone,true); $criteria->compare(‘status‘,$this->status); $criteria->compare(‘logintime‘,$this->logintime,true); $criteria->compare(‘channel_id‘,$this->channel_id,true); if(isset(Yii::app()->user->name)&&Yii::app()->user->getState(‘roles‘)!=‘admin‘){ $this->employee_id= User::model()->find(array(‘select‘=>‘id‘,‘condition‘=>"username=‘".Yii::app()->user->name."‘"))->id; } $criteria->compare(‘employee_id‘,$this->employee_id,true); // $criteria->with = array( ‘channel‘); // $criteria->together = true; return new CActiveDataProvider($this, array( ‘criteria‘=>$criteria, ‘pagination‘=>array( ‘pageSize‘=>10 ), )); }
注意到上面代码中的compare函数,它是用来生成查询条件的,$criteria
->compare(
‘name‘
,
$this
->name,true);
就相当于‘where name like "%.$this->name.‘%"‘,好了现在我们应该知道了,只要改变这个查询的条件,就能查询出相应的name为多少的数据。
那么在控制器里我们可以获取填入的查询条件:
//客户列表 public function actionIndex(){ $model=new Customer(‘search‘); $model->unsetAttributes(); // clear any default values if(isset($_POST[‘Customer‘])){ $model->name=$_POST[‘Customer‘][‘name‘];//这里获取查询的关键字,把它赋给属性name } if(isset($_GET[‘Customer‘])) $model->attributes=$_GET[‘Customer‘]; $this->render(‘index‘,array( ‘customers‘=>$model, )); }
这样的话,最终展示到视图中的就是由这个关键字所查询出的数据,但是结果发现表格中的数据还是没有改变。后来发现还得写一段js代码,在视图(index.php)中:
<script type="text/javascript"> $(function(){ $(‘#search_customer‘).click(function(){ var data=$(this).serialize(); $.fn.yiiGridView.update(‘customers-grid‘, {data: data}); }); }); </script>
这段js相当于一个ajax请求,当点击搜索后,post给控制器Customer/index一个参数,在控制器里获取并赋给model的属性name,从而改变search函数中查询条件,即‘where name like "%‘.$this->name.‘%"‘,最终获取的是name为这个关键字的数据,展示到视图就是查询出来的数据了。
文章来自:http://php2013.blog.51cto.com/7147744/1359910