minpppst / rsc

Registro, Seguimiento y Control
Other
1 stars 3 forks source link

Botones Bulk #49

Closed catu52 closed 8 years ago

catu52 commented 8 years ago

La actualización del plugin ajax-crud específicamente en el archivo ModalRemote.js cambió el envío de datos a un formulario del tipo FormData. Esto ocasiona que los datos recibidos en los controladores no se puedan procesar con una simple función json_encode(). Esto afecta las funciones actionBulkDelete(), actionBulkDesactivar() y actionBulkActivar() en los controladores.

Es necesario procesar el string recibido para obtener el id y buscar el modelo que va a ser afectado por la función de la siguiente manera:

public function actionBulkDesactivar() {
        $request = Yii::$app->request;
        $pks = explode(',',$request->post('pks')); // arreglo o llave primaria
        foreach ($pks as $pk) 
        {             
            $model = $this->findModel($pk); //se busca el modelo
            $model->desactivar();
        }        

        if ($request->isAjax) {
            /*
             *   Process for ajax request
             */
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ['forceClose' => true, 'forceReload' => 'true'];
        } else {
            /*
             *   Process for non-ajax request
             */
            return $this->redirect(['index']);
        }
    }

En el caso de los modelos con llaves compuestas hay que procesar el string recibido con más profundidad. Ejemplo de actionBulkDesactivar() en PartidaPartidaController:

public function actionBulkDesactivar() {
        $request = Yii::$app->request;        
        $arr = explode('},{',ltrim(rtrim($request->post('pks'),'}'), '{')); // arreglo o llave primaria
        foreach ($arr as $key => $value) //por cada string
        {
            $tmp = json_decode('{'.$value.'}'); //json a objeto

            $model = $this->findModel($tmp->cuenta, $tmp->partida); //se busca el modelo
            $model->desactivar();

        }

        if ($request->isAjax) {
            /*
             *   Process for ajax request
             */            
            Yii::$app->response->format = Response::FORMAT_JSON;
            //return ['pks'=>$tmp->cuenta];
            return ['forceClose' => true, 'forceReload' => 'true'];
        } else {
            /*
             *   Process for non-ajax request
             */
            return $this->redirect(['index']);
        }
    }

Se procesa el string recibido de la solicitud haciendo ltrim() para eliminar el caracter "{" al principio y rtrim() para eliminar "}" al final. Se usa explode() con el parámetro "},{" para agrupar en un arreglo y se asigna a la variable $var. Luego se recorre el arreglo para transformar el string JSON de cada elemento del arreglo en un objeto y buscar el modelo.