我正在和Yii一起做一个项目。我现在正在后台工作。我在控制器中实现了一个函数,该函数应该加载一个模型,更改数据库中该特定模型的值(从0变为1的tinyint),并重定向到另一个url。我希望以与CRUD生成器生成的"delete"函数相同的方式使用此函数。因此,在"删除"功能上激励自己,我正在尝试这个"接受"功能:
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.');
}
我在一个视图中调用"accept"函数,如下所示:
array('label'=>'Accept Client', 'url'=>'#', 'linkOptions'=>array('submit'=>array('accept','id'=>$model->id),'confirm'=>'Are you sure you want to accept this item?')),
运行时,没有错误。它加载了正确的模型,但不会更改数据库中的值(recommendation_accepted)。你知道为什么吗?我做错了什么?
提前感谢
苏皮亚里奥斯。
首先,检查这是否有效:
$model->save( false );
如果有效,这意味着由于验证失败,模型的数据不会被保存(例如,检查模型的规则并最终定义新的场景)。
在这种情况下,我认为使用更新而不是保存方法更合适:
$model->setAttribute( 'testimonial_accepted', 1 );
$model->update( array( 'testimonial_accepted' ) );
在您的链接中,路径应该是<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'));
}