【问题标题】:Yii filter not workingYii过滤器不起作用
【发布时间】:2016-05-10 14:21:24
【问题描述】:

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

我的 Yii 应用程序中有两个页面使用相同的控制器/模型,但使用不同的模型功能。我的初始页面是非常标准的“管理”页面,它使用默认的 search() 作为模型(这工作正常 - 包括过滤),但我随后做了一个辅助视图/动作,它查看一个改变的搜索功能 - 这有传递给它的 ID(从 URL 参数中提取)。这工作正常,但页面中的过滤器不起作用,这很烦人。

我认为这是因为在控制器中,我没有正确传递 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(...

谁能看到我的过滤器哪里出错了,或者我是否错过了搜索步骤?

【问题讨论】:

  • 请更新您的问题并向我们展示您的模型中的规则方法是什么样的

标签: php search yii


【解决方案1】:

如果我猜的话,那是因为在“searchByEvent”场景下,模型中的属性未声明为“安全”。如果您使用 gii 并查看模型的规则方法,您会在其中找到一个条目,在使用“搜索”场景时将所有属性标记为“安全”。您在控制器操作 ($model = new EventAttendees('searchByEvent')) 中使用了一个名为“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 方法有助于解决这个问题。

【讨论】:

  • 看起来它是两者的结合,正如您所说,我没有将 searchByEvent 场景添加到安全规则中。这并没有解决它,但是实现对 addColumnCondition 的更改确实解决了它。如果我删除这些场景规则,它就不起作用了——所以两个答案一起工作。非常感谢@georaldc 的帮助
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 2014-08-24
  • 2018-01-04
  • 2020-12-23
  • 2016-10-08
  • 2014-11-17
  • 2017-08-30
  • 2015-11-16
相关资源
最近更新 更多