yii2-dynamicform
yii2-dynamicform copied to clipboard
nested dynamic form
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?
I solved, my mistake, i forget delete the foreing keys from the models, nice done wbraganca!!!
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
]);
}
}
}
`
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?