yii2-dynamicform icon indicating copy to clipboard operation
yii2-dynamicform copied to clipboard

nested dynamic form

Open epulgaron opened this issue 9 years ago • 3 comments

I am following this wiki http://wbraganca.com/yii2extensions/dynamicform-demo3/source-code I have several forms in the same index, they all work fine except the nested one,when I insert shows the blank page and the database only inserts the main model. _Cumplimiento controller: ` public function actionCreate() { $model = new Cumplimiento(); $modelsMedidas = [new Medidas]; $modelsDeficiencias = [new Deficiencias]; $modelsPHD = [new Phd]; $modelsImplicados = [[new Implicados]];

    if ($model->load(Yii::$app->request->post()) && $model->save())
    {
        //-----------Medidas Aplicadas-----
        $modelsMedidas = Model::createMultiple(Medidas::classname());
        Model::loadMultiple($modelsMedidas, Yii::$app->request->post());

        //----------Principales Deficiencias-----
        $modelsDeficiencias = Model::createMultiple(Deficiencias::classname());
        Model::loadMultiple($modelsDeficiencias, Yii::$app->request->post());

        //-----------PHD----------
        $modelsPHD = Model::createMultiple(Phd::classname());
        Model::loadMultiple($modelsPHD, Yii::$app->request->post());           

        // validate all models
        $valid = $model->validate();
        $valid = (Model::validateMultiple($modelsMedidas) || Model::validateMultiple($modelsDeficiencias)|| Model::validateMultiple($modelsPHD))&&$valid;

        if (isset($_POST['Implicados'][0][0])) {
            foreach ($_POST['Implicados'] as $indexPHD => $implicados) {
                foreach ($implicados as $indexImplicados => $implicado) {
                    $data['Implicados'] = $implicado;
                    $modelImplicados = new Implicados;
                    $modelImplicados->load($data);
                    $modelsImplicados[$indexPHD][$indexImplicados] = $modelImplicados;
                    $valid = $modelImplicados->validate();
                }
            }
        }

        if ($valid) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                if ($flag = $model->save(false))
                {
                    foreach ($modelsMedidas as $modelMedidas) {
                        $modelMedidas->mod01_id = $model->codigo;
                        if (! ($flag = $modelMedidas->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                    foreach ($modelsDeficiencias as $modelDeficiencias) {
                        $modelDeficiencias->mod01_id = $model->codigo;
                        if (! ($flag = $modelDeficiencias->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }

                    foreach ($modelsPHD as $indexPHD => $modelPHD) {

                        if ($flag === false) {
                            break;
                        }

                        $modelPHD->mod01_id = $model->codigo;

                        if (!($flag = $modelPHD->save(false))) {
                            break;
                        }

                        if (isset($modelsImplicados[$indexPHD]) && is_array($modelsImplicados[$indexPHD])) {
                            foreach ($modelsImplicados[$indexPHD] as $indexImplicados => $modelImplicados) {
                                $modelImplicados->phd_id = $modelPHD->no_registro;
                                if (!($flag = $modelImplicados->save(false))) {
                                    break;
                                }
                            }
                        }
                    }
                }
                if ($flag) {
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->codigo]);
                }
            } catch (Exception $e) {
                $transaction->rollBack();
            }
        }
    } 
    else {
        return $this->render('create', [
            'model' => $model,
            'modelsMedidas' => (empty($modelsMedidas)) ? [new Medidas] : $modelsMedidas,
            'modelsDeficiencias' => (empty($modelsDeficiencias)) ? [new Deficiencias] : $modelsDeficiencias,
            'modelsPHD' => (empty($modelsPHD)) ? [new Phd] : $modelsPHD,
            'modelsImplicados' => (empty($modelsImplicados)) ? [[new Implicados]] : $modelsImplicados,
        ]);
    }
}

` what could be wrong?

epulgaron avatar Feb 08 '16 21:02 epulgaron

I solved, my mistake, i forget delete the foreing keys from the models, nice done wbraganca!!!

epulgaron avatar Feb 08 '16 21:02 epulgaron

now the update give me a blank page, could anyone help me? ` public function actionUpdate($id) { $model = $this->findModel($id); $modelsResolucion = $model->resolucions; $modelsMedidas = $model->medidas; $modelsDeficiencias = $model->deficiencias; $modelsPHD = $model->phds; $modelsImplicados = []; $oldImplicados = [];

  if (!empty($modelsPHD)) {
        foreach ($modelsPHD as $indexPHD => $modelPHD) {
            $implicados = $modelPHD->implicados;
            $modelsImplicados[$indexPHD] = $implicados;
            $oldImplicados = ArrayHelper::merge(ArrayHelper::index($implicados, 'phd_id'), $oldImplicados);
        }
    }     

 if ($model->load(Yii::$app->request->post())/* && $model->save()*/)
    {
        //-----------resolucion--------------
        $oldIDsResolucion = ArrayHelper::map($modelsResolucion, 'mod01_id', 'mod01_id');
        $modelsResolucion = Model::createMultiple(Resolucion::classname(), $modelsResolucion);
        Model::loadMultiple($modelsResolucion, Yii::$app->request->post());
        $deletedIDsResolucion = array_diff($oldIDsResolucion, array_filter(ArrayHelper::map($modelsResolucion, 'mod01_id', 'mod01_id')));

        //--------medidas aplicadas--------------
        $oldIDsMedidas = ArrayHelper::map($modelsMedidas, 'id', 'id');
        $modelsMedidas = Model::createMultiple(Medidas::classname(), $modelsMedidas);
        Model::loadMultiple($modelsMedidas, Yii::$app->request->post());
        $deletedIDsMedidas = array_diff($oldIDsMedidas, array_filter(ArrayHelper::map($modelsMedidas, 'id', 'id')));

        //--------------------principales deficiencias------------------
        $oldIDsDeficiencias = ArrayHelper::map($modelsDeficiencias, 'mod01_id', 'mod01_id');
        $modelsDeficiencias = Model::createMultiple(Deficiencias::classname(), $modelsDeficiencias);
        Model::loadMultiple($modelsDeficiencias, Yii::$app->request->post());
        $deletedIDsDeficiencias = array_diff($oldIDsDeficiencias, array_filter(ArrayHelper::map($modelsDeficiencias, 'mod01_id', 'mod01_id')));

        //-----------------phd/implicados----------------------      
            // reset
            $modelsImplicados = [];

            $oldPHDIDs = ArrayHelper::map($modelsPHD, 'mod01_id', 'mod01_id');
            $modelsPHD = Model::createMultiple(app\models\Phd::classname(), $modelsPHD);
            Model::loadMultiple($modelsPHD, Yii::$app->request->post());
            $deletedPHDIDs = array_diff($oldPHDIDs, array_filter(ArrayHelper::map($modelsPHD, 'mod01_id', 'mod01_id')));

            if (Yii::$app->request->isAjax) 
        {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ArrayHelper::merge(
                ActiveForm::validateMultiple($modelsResolucion),
                ActiveForm::validateMultiple($modelsMedidas),
                ActiveForm::validateMultiple($modelsDeficiencias),
                ActiveForm::validateMultiple($modelsPHD),
                ActiveForm::validate($model)
            );
        }

            // validate all models
            $valid = $model->validate();
            $valid = (Model::validateMultiple($modelsResolucion) || Model::validateMultiple($modelsMedidas) || Model::validateMultiple($modelsDeficiencias)|| Model::validateMultiple($modelsPHD))&& $valid;

            $implicadosIDs = [];
                if (isset($_POST['Implicados'][0][0]))
                {
                    foreach ($_POST['Implicados'] as $indexPHD => $implicados) {
                        $implicadosIDs = ArrayHelper::merge($implicadosIDs, array_filter(ArrayHelper::getColumn($implicados, 'phd_id')));
                        foreach ($implicados as $indexImplicados => $implicado) {
                            $data['Implicados'] = $implicado;
                            $modelImplicados = (isset($implicado['phd_id']) && isset($oldImplicados[$implicado['id']])) ? $oldImplicados[$implicado['phd_id']] : new Implicados;
                            $modelImplicados->load($data);
                            $modelsImplicados[$indexPHD][$indexImplicados] = $modelImplicados;
                            $valid = $modelImplicados->validate();
                        }
                    }
                }

            $oldImplicadosIDs = ArrayHelper::getColumn($oldImplicados, 'phd_id');
            $deletedImplicadosIDs = array_diff($oldImplicadosIDs, $implicadosIDs);

            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        if (!empty($deletedIDsResolucion)) {
                            Resolucion::deleteAll(['mod01_id' => $deletedIDsResolucion]);
                        }
                        foreach ($modelsResolucion as $modelResolucion) {
                            $modelResolucion->mod01_id = $model->codigo;
                            if (! ($flag = $modelResolucion->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }
                        if (!empty($deletedIDsMedidas)) {
                            Medidas::deleteAll(['mod01_id' => $deletedIDsMedidas]);
                        }
                        foreach ($modelsMedidas as $modelMedidas) {
                            $modelMedidas->mod01_id = $model->codigo;
                            if (! ($flag = $modelMedidas->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }
                        if (!empty($deletedIDsDeficiencias)) {
                            Deficiencias::deleteAll(['mod01_id' => $deletedIDsDeficiencias]);
                        }
                        foreach ($modelsDeficiencias as $modelDeficiencias) {
                            $modelDeficiencias->mod01_id = $model->codigo;
                            if (! ($flag = $modelDeficiencias->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }


                        if (! empty($deletedImplicadosIDs)) {
                            Implicados::deleteAll(['phd_id' => $deletedImplicadosIDs]);
                        }

                        if (! empty($deletedPHDIDs)) {
                            Phd::deleteAll(['mod01_id' => $deletedPHDIDs]);
                        }

                        foreach ($modelsPHD as $indexPHD => $modelPHD) {

                            if ($flag === false) {
                                break;
                            }

                            $modelPHD->mod01_id = $model->codigo;

                            if (!($flag = $modelPHD->save(false))) {
                                break;
                            }

                            if (isset($modelsImplicados[$indexPHD]) && is_array($modelsImplicados[$indexPHD])) {
                                foreach ($modelsImplicados[$indexPHD] as $indexImplicados => $modelImplicados) {
                                    $modelImplicados->phd_id = $modelPHD->no_registro;
                                    $modelImplicados->mod01_id = $modelPHD->mod01_id;
                                    if (!($flag = $modelImplicados->save(false))) {
                                        break;
                                    }
                                }
                            } 
                        } 
                    }
                    if ($flag) {
                        $transaction->commit();
                        return $this->redirect(['view', 'id' => $model->codigo]);
                    }
                    else {
                    $transaction->rollBack();
                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }

    else {
        return $this->render('update', [
            'model' => $model,
            'modelsResolucion' => (empty($modelsResolucion)) ? [new Resolucion] : $modelsResolucion,
            'modelsMedidas' => (empty($modelsMedidas)) ? [new Medidas] : $modelsMedidas,
            'modelsDeficiencias' => (empty($modelsDeficiencias)) ? [new Deficiencias] : $modelsDeficiencias,
            'modelsPHD' => (empty($modelsPHD)) ? [new Phd] : $modelsPHD,
            'modelsImplicados' => (empty($modelsImplicados)) ? [[new Implicados]] : $modelsImplicados
        ]);
    }
  }
}

`

epulgaron avatar Feb 15 '16 16:02 epulgaron

I solved, my mistake, i forget delete the foreing keys from the models, nice done wbraganca!!!

can you give me the deleted foreign keys from the models example?

lazarustharub avatar Feb 07 '19 07:02 lazarustharub