如何解决单击按钮如何在数据库中切换值YII2
我有一些名为“活动”的数据。数据库中的活动可以是0(不活动)或1(活动)。
我在索引页面中每行数据旁边都有一个删除按钮,并希望在单击时将活动设置为1,我希望将其设置为0。
因此,基本上,删除操作不会删除任何内容,它只是将活动值从1切换为0。我还有一些代码可以检查活动是否已设置为0,并防止进一步删除。
我该怎么办?
这是我控制器中的代码;
public function actionDelete1($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
public function actionRetire($id)
{
$model = $this->findModel($id);
$model->activity = 0;
$model->save();
return $this->redirect(['index']);
}
这是我模型中的代码:
public function canRetire($id)
{
if(!$this->checkIfRetired($id)
return true;
else return false;
}
public function checkIfRetired($id)
{
if(JobPlanning::find()->where([ 'and','activity=:activity AND
id=:id'],array(':activity'=>1,':id'=>$id))->count() >0)
return false;
else
return true;
}
还有我的索引页面中的删除按钮:
'delete' => function ($url,$model,$key) {
return $model->canRetire($model['id'])?Html::a(Html::tag('span','',['class' => "glyphicon glyphicon-trash"]),$url,['title' => Yii::t('yii','Delete'),'data' => ['method' => 'post','confirm' => Yii::t('app','Are you sure you want to delete this item?'),'params' => ['id' => $model['id'],'_csrf' => Yii::$app->request->csrfToken]]]):'';
if ($action === 'delete') {
$url = 'index.php?r=admin/jobplanning/retire&id=' . $model['id'];
return $url;
}
解决方法
然后,这只是一个软删除:没有删除任何实际的行,而是“已标记”。此代码分为两部分:
控制器
public function behaviors()
{
return [
// ....
'verbs' => [
'class' => \yii\filters\VerbFilter::className(),'actions' => [
'delete' => ['POST'],],// ....
];
}
public function actionDelete($id){
$model = $this->findModel($id);
$model->activity = 0;
if(!$model->save()){
//throw exception
}
return $this->redirect(['view','id' => $id]);
}
按钮
'delete' => function($url,$model,$key){
return $model->activity == 1
? Html::a('DELETE ICON',$url,['data-method' => 'post','data-confirm' => 'are you sure...'])
: "";
}
注意,我已经定义了使用POST方法调用时可以执行的操作,因为这将更改数据状态。您可以通过传递给data-method => 'post'
帮助函数的options
参数的Html::a()
来强制执行POST链接。
要完全防止通过ActiveRecord操作删除,请在模型类上覆盖beforeDelete
public function beforeDetete(){
return false;
}
我认为您不需要其他方法。
,您为什么不尝试以下代码?然后根据需要在视图部分中编辑代码以调用api。
public function actionRetire($id,$status)
{
$model = $this->findModel($id);
//$model->activity = !$model->activity;
$model->activity = !$status;
if($model->save())
\Yii::$app->getSession()->setFlash('success','Succesfully updated);
return $this->redirect(['index']);
}
PS:由于您不想禁用切换,因此最好将视图的状态传递给请求,从而使其成为无状态。我已经更新了代码来做到这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。