[英]How to toggle value in database on click of a button (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 方法調用時可訪問,因為這將更改數據的狀態。 您可以使用傳遞給Html::a()
輔助函數的options
參數的data-method => 'post'
強制 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:由於您不想禁用切換,因此最好通過請求從視圖傳遞狀態,從而使其無狀態。 我已經更新了代碼來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.