Yii过滤器无法正常工作

时间:2016-05-10 14:21:24

标签: php search yii

想知道是否有人可以提供帮助。

我的Yii应用程序中有两页使用相同的控制器/模型,但使用不同的模型函数。我的初始页面很标准' admin'使用默认搜索()作为模型的页面(这很好 - 包括过滤),但我后来做了一个查看更改后的搜索功能的辅助视图/操作 - 这有一个ID传入其中(拉出)来自URL params)。这工作正常,但页面中的过滤器不起作用,这很烦人。

我认为这是因为在控制器中,我没有正确传递ID变量???

这是我的一些代码;

型号:

public function searchByEvent($event_id) {
        $criteria = new CDbCriteria;

        $criteria->compare('id', $this->id, true);
        $criteria->compare('event_id', $this->event_id, true);
        $criteria->compare('status_id', $this->status_id, true);
        $criteria->compare('checkin_status_id', $this->checkin_status_id, true);
        $criteria->compare('guest_of_user_id', $this->guest_of_user_id, true);
        $criteria->compare('user_id', $this->user_id, true);
        $criteria->compare('assign_group', $this->assign_group, true);

        $criteria->with = 'user';
        $criteria->compare('user.forename', $this->user_forename, true);
        $criteria->compare('user.surname', $this->user_surname, true);
        $criteria->compare('user.company', $this->user_company, true);
        $criteria->order = 'user.surname ASC';
        $criteria->condition = "event_id = :event_id";
        $criteria->params=(array(':event_id'=>$event_id));

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

控制器:

public function actionAdminByEvent() {

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

        $this->render('webroot.themes.'.Yii::app()->name.'.views.adminEventAttend.adminByEvent', array(
            'model' => $model,
        ));
    }

查看;

$event_id = Yii::app()->getRequest()->getParam('event_id');
this->widget('booster.widgets.TbGridView', array(
    'id' => 'event-attendees-grid',
    'dataProvider' => $model->searchByEvent($event_id),
    'pager' => array(
              'class' => 'booster.widgets.TbPager',
              'displayFirstAndLast' => true,
         ),
    'filter' => $model,
    'template'=>'{summary}{pager}{items}{pager}',
    'selectableRows' => 0,
    'selectionChanged' => 'function(id){ location.href = "' . $this->createUrl('view') . '/id/"+$.fn.yiiGridView.getSelection(id);}',
    'columns' => array(...

任何人都可以看到过滤器出现问题的地方,或者我是否错过了搜索步骤?

1 个答案:

答案 0 :(得分:1)

如果我猜测,那是因为模型中的属性未被声明为"安全"当它在" searchByEvent"场景。如果您使用了gii并查看了模型的规则方法,那么您会在那里找到一个条目,将所有属性标记为" safe"当使用"搜索"场景。您使用的是另一种名为" searchByEvent"在您的控制器操作($model = new EventAttendees('searchByEvent'))中,如果您未在此方案中创建将属性标记为安全的新规则,那么您的质量分配线($model->attributes = $_GET['EventAttendees'])将因任何属性而失败,而不会出现任何情况无规则。

如果不是这种情况,你可能想要看的另一件事是改变以下内容:

$criteria->condition = "event_id = :event_id";
$criteria->params=(array(':event_id'=>$event_id));

$criteria->addColumnCondition(array('event_id' => $event_id))

您的params行可能会覆盖使用所有先前比较语句设置的所有其他参数,因为您没有将新参数合并到当前集合中。使用适当的CDbCriteria方法可以解决这个问题。