Yii在TbGridView中搜索不过滤数据集

时间:2014-02-02 09:50:48

标签: php search yii

我遇到的问题是我将User表中的数据子集返回到视图。使用TbGridView我应该能够输入一个搜索词,这个数据应该被我的搜索词过滤,但数据不会被过滤。简单地重新调整相同的数据。过滤无效。

我在我的用户控制器中有一个操作,显示以前登录过的用户列表。操作是

public function actionLoginhistory() {

            $model=new User();
            $model->unsetAttributes();  // clear any default values
            if(isset($_GET['User'])) {
                    $model->attributes=$_GET['User'];
            }


            $this->render('loginlist', array(
                    'model'=>$model,
                    ));
    }

这会将正确的数据集返回给我的视图。问题是,当我尝试通过在“交易名称”列或“电子邮件”列中键入搜索词来过滤数据时,将返回相同的数据集。视图代码为:

$this->widget('bootstrap.widgets.TbGridView', array(
'type' => 'striped bordered condensed',
'dataProvider' => $model->searchlogin(), 
'filter'=>$model,
'ajaxUpdate'=>false, 
'enablePagination'=>true,
'summaryText'=>'Displaying {start}-{end} of {count} results.',
'template' => "{summary}{items}{pager}",
'htmlOptions'=>array('style' => 'width:500px;margin-left: 130px;',),
'columns' => array(
    array('name' => 'real_name', 'header'=> 'Trading Name','htmlOptions'=>array('width'=>'50%'),
        'type'=>'raw',
        'value' =>'CHtml::link($data->real_name, array("contractors/viewalldocuments","id"=>$data->username))',
        ),
    array('name' => 'email', 'header' => 'Email','htmlOptions'=>array('width'=>'30%')),
    array('name' => 'last_login', 'header' => 'Last Login', 'filter'=>false, 'htmlOptions'=>array('width'=>'20%'), 'value' => 'date("d-m-Y", strtotime($data->last_login))'),
))

);

返回的数据集来自User模型 - 代码为:

 public function searchlogin()
    {

            $criteria=new CDbCriteria;
            $criteria->compare('real_name', $this->real_name);
            $criteria->condition = 'last_login IS NOT NULL AND user_type_id=4';


            return new CActiveDataProvider('User', array(
                    'pagination' => array(
         'pageSize' => 80,
    ),
                    'criteria'=>$criteria,
            ));
    }

如果我更改我的视图代码以使用标准搜索功能,则会返回用户表中的每个用户,并且数据将按搜索词过滤掉。因此,如果我将视图中的一行更改为

'dataProvider' => $model->search(),

然后返回每个用户,但数据将按搜索词过滤。模型中的标准搜索功能在用户模型中是指

public function search()
    {

            $criteria=new CDbCriteria;
            $criteria->compare('real_name',$this->real_name,true);
            $criteria->compare('username',$this->username,true);
            $criteria->compare('email',$this->email,true);
            $criteria->compare('last_login',$this->last_login,true);


            return new CActiveDataProvider($this, array(
                    'pagination' => array(
         'pageSize' => 80,
    ),
                    'criteria'=>$criteria,
            ));
    }

这应该是非常直接和简单的。您应该能够在模型中拥有多个搜索功能 - 我已经看了好几天了,我无法解决问题。我将不胜感激任何帮助。当我输入搜索词时,代码会生成我期望的URL

  ?

的index.php R =用户%2Floginhistory&安培;用户%5Breal_name%5D =试验&安培;用户%5Bemail%5D =安培; User_page = 1

我的模型中的这些规则是否因为具有3种不同的搜索功能而错误。我不清楚你的回答,但我会感激你的帮助。

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array('user_type_id, real_name, username, password, active', 'required'),
        array('active', 'numerical', 'integerOnly'=>true),
        array('user_type_id', 'length', 'max'=>11),
        array('real_name, email', 'length', 'max'=>200),
        array('email', 'email'),
        array('username, email', 'unique'),
        array('username', 'length', 'max'=>100),
        array('password', 'passwdAttr'),
        // The following rule is used by search().
        // Please remove those attributes that should not be searched.s
        array('real_name, username, email', 'safe', 'on'=>'search'),
    );
}

1 个答案:

答案 0 :(得分:1)

您没有针对当前方案设置正确的“安全”验证规则。

修改模型,并确保在您的属性中填充。

在echo()中,当你回显一个属性时,它必须保存输入中的值。