我遇到的问题是我将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'),
);
}
答案 0 :(得分:1)
您没有针对当前方案设置正确的“安全”验证规则。
修改模型,并确保在您的属性中填充。
在echo()中,当你回显一个属性时,它必须保存输入中的值。