zhong21jia 2012-02-09 21:32:31 4735次浏览 0条回复 0 0 0

今天吧!发现一个YII框架小挂件CGridView的问题,如下使用的话一点都不安全! 还是先讲讲在发现问题之前使用CGridView出现的问题吧! 我手上有个项目,需要用到筛选机制。

[attach]615[/attach]

问题如下: 我也遇到了同样的问题,每次查询时用post提交查询条件,然后在动作中把值写入form,form验证后进行查询,创建page实例后显示。这样查询没有问题,当换页时参数得不到页面显示空白。我想有可能是get方式传入得不到,于是在动作中判断是否有查询条件语句改为empty($_REQUEST['form']),结果还是不可以,page生成的url不会把第一次post提交的查询条件写入。于是搜索源代码在CPageination.php文件中修改createPageUrl方法,由原来的$params=($this->route==='')?$_GET:array();改为$params=($this->route==='')?$_REQUEST:array();结果试验成功!整个原理就是第一次查询由用户点击页面查询按钮以post方式提交查询条件,再由page对象生成页码url(其中包括post提交来的查询条件,这就必须得改刚才我说的那段代码)。点击页码按钮就后就以get方式提交,由于action中是判断$_REQUEST所以没有问题可以接收到。不知道这样行不行,我测试用没有问题,只是url太长,有一些不必要的信息。

[attach]616[/attach][attach]616[/attach]引用地址:http://www.yiiframework.com/forum/index.php/topic/3214-yii查询条件分页的问题/

[attach]617[/attach]

[attach]618[/attach]

下一页的连接没有带上查询的参数,点击下页的时候出现了筛选之外的数据。

解决办法:

在构建筛选条件代码中如下写:

//构建查询条件
if (isset($_POST['Sms'])) {
if (empty($_POST['Sms']['period_start']) && empty($_POST['Sms']['period_end']) && empty($_POST['Sms']['keyword'])) {} 
else {
    $criteria = Sms::model()->getSmsAdmin();
    $model->dbCriteria = $criteria;
    $_GET['condition'] = $criteria->condition;
}
}

模型中:

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('title', $this->title, true);
    $criteria->compare('content', $this->content, true);
    $criteria->compare('poster_id', $this->poster_id);
    $criteria->compare('receiver_id', $this->receiver_id);
    $criteria->compare('read_type', $this->read_type);
    $criteria->compare('send_time', $this->send_time, true);

    if (isset($_GET['condition']) && !empty($_GET['condition'])) {
        $criteria->condition = $_GET['condition'];
    }
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
    ));
}

[attach]619[/attach] [attach]620[/attach]

问题解决,但随之而来的问题又来了!

如下:

[attach]621[/attach]

下一页的连接中出现了数据库字段。因为是GET传值,这样是非常不安全的! 试着用POST传值,但下一页的连接就不能附带传值了!

有人这么修改过, 不知道是否可以解决该问题!

[attach]622[/attach] [attach]623[/attach]

再说说为什么出现如上问题吧! CGridView中点击下一页时,会调用动作后,再执行模型里的search方法! 但是search方法是一个不带参数的CDbCriteria实例,所以点击下一页的时候会把筛选参数, 也就是$criteria->condition属性重新赋值为空, 所以进行筛选查找时,下一页的视图会显示筛选之外的数据! 解决办法可以把

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'sms-grid',
    'dataProvider' => $model->search(),

中的 dataProvider 属性 使用其他的方法赋值, 就不会出现如上问题。 例子链接:http://blog.csdn.net/cypbkd/article/details/6527319 http://yiiframework.diandian.com/?tag=DAO方式查询分页代码

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册