簡體   English   中英

如何通過單擊按鈕切換數據庫中的值 (YII2)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM