【问题标题】:Yii - controller - function to change a flag/boolean on dbYii - 控制器 - 更改 db 上的标志/布尔值的功能
【发布时间】:2012-08-06 08:46:03
【问题描述】:

我正在与 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)。你知道为什么吗?我做错了什么?

提前致谢,

Supialios。

【问题讨论】:

  • 检查 $model->save() 函数是否返回 true ,即有任何验证错误。或者作为一种解决方法使用 $model->save(false)
  • 请注意,Yii 提供了检查请求是否为 AJAX 请求的功能:Yii::app()->request->isAjaxRequest。此外,如果您只想使用 POST 方法执行操作,则可以在控制器的 filters() 方法返回的数组中指定 'postOnly + accept'。通过这种方式,您可以进一步简化代码。

标签: php object frameworks model yii


【解决方案1】:

首先,检查这是否有效:

$model->save( false );

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

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

$model->setAttribute( 'testimonial_accepted', 1 );
$model->update( array( 'testimonial_accepted' ) );

【讨论】:

    【解决方案2】:

    在您的链接中,路径应采用<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'));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 2012-05-17
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2014-04-12
      相关资源
      最近更新 更多