0

我正在和 Yii 一起做一个项目。我目前正在后端工作。我正在控制器中实现一个函数,该函数应该加载模型,更改数据库中的值(从 0 变为 1 的 tinyint),然后重定向到另一个 url。我想以与使用 CRUD 生成器生成的“删除”函数相同的方式使用此函数。因此,在“删除”功能上启发了自己,我正在尝试将这个用于“接受”功能:

    public function actionAccept($id) {
    if(Yii::app()->request->isPostRequest)
    {
        $model = $this->loadModel($id);
        $model->testimonial_accepted = '1';
        $model->save();

        // if AJAX request we should not redirect the browser
        if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }

我在视图中调用“接受”函数,如下所示:

     array('label'=>'Accept Client', 'url'=>'#', 'linkOptions'=>array('submit'=>array('accept','id'=>$model->id),'confirm'=>'Are you sure you want to accept this item?')),

运行时,没有错误。它加载了正确的模型,但不会更改数据库中的值(testimonial_accepted)。你知道为什么吗?我究竟做错了什么?

提前致谢,

苏皮里奥斯。

4

2 回答 2

0

在您的链接中,路径应采用以下形式,<controller>/<action>因此假设您的控制器名称是,foo那么您应该说:

array('submit'=>array('foo/accept','id'=>$model->id)

我同意@Boris,你应该使用更新,而且数据操作代码最好在模型中遵循 MVC 最佳实践,所以它看起来像这样:

控制器:

        $model = $this->loadModel($id);
        $model->acceptTestimonial(); // a model function
        $this->redirect(array('action_you_choose'));

模型:

public function acceptTestimonial()
{
    $this->testimonial_accepted = '1';
    $this->update(array('testimonial_accepted'));
}
于 2012-08-06T12:42:02.693 回答
0

首先,检查这是否有效:

$model->save( false );

如果它有效,这意味着模型的数据没有被保存,因为验证失败(例如检查模型的规则并最终定义新的场景)。

在这种情况下,我认为使用update而不是save方法更合适:

$model->setAttribute( 'testimonial_accepted', 1 );
$model->update( array( 'testimonial_accepted' ) );
于 2012-08-06T12:11:08.623 回答