hi forum,does someone has used this extension and its work correctly?
hi forum,does someone has used this extension and its work correctly?
Yes, I used, but for my requirements it works without any error.
well i’ve got a few issues with it, first, when i create more than one register in the Db only store the last one, second, when i try to use any DataPicker in my form(panel)or select2 doesn’t work, the select2 stay loading meanwhile the DataPicker dosen’t work , could you help me? sorry for my bad english
i didn`t used it, but:
remember that when you add multiple records to your with for example foreach you have to do:
$modelOfTableUWantToAddReccord->isNewRecord = true;
i did that, look here is my _form and my controller, i have 5 dynamic form in the same _form, take a look and if you can bring me some light
<?php
use yii\helpers\Html;
use wbraganca\dynamicform\DynamicFormWidget;
use backend\models\Model;
use backend\models\Modelo01;
use backend\models\Modelo03;
use backend\models\Modelo04;
use backend\models\Modelo05;
use backend\models\Implicados;
use yii\helpers\ArrayHelper;
use kartik\widgets\Select2;
use yii\helpers\Url;
use yii\bootstrap\ActiveForm;
use kartik\widgets\DatePicker;
/* @var $this yii\web\View */
/* @var $model backend\models\Planificacion */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="planificacion-form">
<?php $form = ActiveForm::begin(['id' => 'dynamic-form','layout'=>'horizontal']); ?>
<?= $form->field($model, 'plan_cod')->textInput(['maxlength' => 255,'style'=>'width:250px;']) ?>
<?= $form->field($model, 'plan_desc')->textarea(['maxlength' => 5000,'style'=>'width:250px;']) ?>
<?= $form->field($model, 'plan_acc_extra')->checkbox(array('value' => 'Si', 'uncheck' => 'No')) ?>
<?= $form->field($model, 'orga_fk')->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Norganismos::find()->asArray()->all(), 'id_orga', 'orga_siglas'),
'options' => ['placeholder' => 'Seleccione un organismo','style'=>'width:250px;',
'onchange'=>'
$.get( "'.Url::toRoute('/planificacion/lists').'", { id: $(this).val() } )
.done(function( data ) {
$( "#'.Html::getInputId($model, 'entidad_fk').'" ).html( data );
}
);
'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'entidad_fk')->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Entidad::find()->asArray()->all(), 'id_entidad', 'entidad_nombre'),
'options' => ['placeholder' => 'Seleccione una entidad','style'=>'width:250px;'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'tipo_accion_fk')->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Ntipoaccion::find()->asArray()->all(), 'id_tipo_accion', 'tipo_acc_desc'),
'options' => ['placeholder' => 'Seleccione un tipo de acción ','style'=>'width:250px;'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'particularidades_fk')->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Nparticularidades::find()->asArray()->all(), 'id_particularidades', 'particularidades_desc'),
'options' => ['placeholder' => 'Seleccione una particularidad ','style'=>'width:250px;'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'plan_fecha_inicio')->widget(DatePicker::classname(), [
'model' => $model,
'attribute' => 'plan_fecha_inicio',
'options'=>['placeholder'=>'Inserte una fecha','style'=>'width:250px;'],
'language' => 'es',
'pluginOptions' => [
'dateFormat' => 'yy-mm-dd',
],
]); ?>
<?= $form->field($model, 'plan_fecha_fin')->widget(DatePicker::classname(), [
'model' => $model,
'attribute' => 'plan_fecha_fin',
'options'=>['placeholder'=>'Inserte una fecha','style'=>'width:250px;'],
'language' => 'es',
'pluginOptions' => [
'dateFormat' => 'yy-mm-dd',
],
]); ?>
<?= $form->field($model, 'plan_cant_aut')->textInput(['style'=>'width:250px;']) ?>
<?= $form->field($model, 'plan_cant_dias')->textInput(['style'=>'width:250px;']) ?>
<?= $form->field($model, 'conclusion_fk')->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Nconclusiones::find()->asArray()->all(), 'id_conclusion', 'conclusion_desc'),
'options' => ['placeholder' => 'Seleccione un estado ','style'=>'width:250px;'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'dic_fk')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'plan_reg_por')->textInput(['maxlength' => true]) ?>
<div class="row">
<div class="panel panel-default">
<div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i> Modelo 01</h4></div>
<div class="panel-body">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items', // required: css class selector
'widgetItem' => '.item', // required: css class
'limit' => 1, // the maximum times, an element can be cloned (default 999)
'min' => 0, // 0 or 1 (default 1)
'insertButton' => '.add-item', // css class
'deleteButton' => '.remove-item', // css class
'model' => $modelsModelo01[0],
'formId' => 'dynamic-form',
'formFields' => [
'plan_orden',
'modelo01_directiva',
'modelo01_fecha_ini_real',
'modelo01_fecha_fin_real',
'calificacion_fk',
'modelo01_cant_aud_real',
'modelo01_dias_real',
'modelo01_phc',
'modelo01_phd',
'dic_fk',
],
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
<h4>
<i class="glyphicon glyphicon-envelope"></i>
<button type="button" class="add-item btn btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Insertar</button>
</h4>
</div>
<div class="panel-body">
<div class="container-items"><!-- widgetBody -->
<?php foreach ($modelsModelo01 as $i => $modelModelo01): ?>
<div class="item panel panel-default"><!-- widgetItem -->
<div class="panel-heading">
<h3 class="panel-title pull-left"></h3>
<div class="pull-right">
<button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (! $modelModelo01->isNewRecord) {
echo Html::activeHiddenInput($modelModelo01, "[{$i}]planificacion_fk");
}
?>
<?= $form->field($modelModelo01, "[{$i}]plan_orden")->textInput(['maxlength' => 255,'style'=>'width:250px;']) ?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($modelModelo01, "[{$i}]modelo01_directiva")->textInput(['maxlength' => 255,'style'=>'width:250px;']) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelModelo01, "[{$i}]modelo01_fecha_ini_real")->widget(DatePicker::classname(), [
'model' => $modelModelo01,
'attribute' => 'modelo01_fecha_ini_real',
'options'=>['placeholder'=>'Inserte una fecha','style'=>'width:250px;'],
'language' => 'es',
'pluginOptions' => [
'dateFormat' => 'yyyy-MM-dd',
],
]);
?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]modelo01_fecha_fin_real")->widget(DatePicker::classname(), [
'model' => $modelModelo01,
'attribute' => 'modelo01_fecha_fin_real',
'options'=>['placeholder'=>'Inserte una fecha','style'=>'width:250px;'],
'language' => 'es',
'pluginOptions' => [
'dateFormat' => 'yyyy-MM-dd',
],
]); ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]calificacion_fk")->widget(Select2::classname(), [
'data' => ArrayHelper::map(\backend\models\Ncalificaciones::find()->asArray()->all(), 'id_calificacion', 'calificacion_desc'),
'options' => ['placeholder' => 'Seleccione una calificación ','style'=>'width:250px;'],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]modelo01_cant_aud_real")->textInput(['style'=>'width:250px;']) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]modelo01_dias_real")->textInput(['style'=>'width:250px;']) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]modelo01_phc")->textInput(['style'=>'width:250px;']) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]modelo01_phd")->textInput(['style'=>'width:250px;']) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelModelo01, "[{$i}]dic_fk")->textInput(['maxlength' => 255,'style'=>'width:250px;']) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
</div>
</div>
</div>
<div class="row">
<div class="panel panel-default">
<div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i> Modelo 03</h4></div>
<div class="panel-body">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items2', // required: css class selector
'widgetItem' => '.item2', // required: css class
'limit' => 999, // the maximum times, an element can be cloned (default 999)
'min' => 0, // 0 or 1 (default 1)
'insertButton' => '.add-item2', // css class
'deleteButton' => '.remove-item2', // css class
'model' => $modelsModelo03[0],
'formId' => 'dynamic-form',
'formFields' => [
'cargo_fk',
'medida_apl_fk',
'modelo03_cant',
'dic_fk',
],
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
<h4>
<i class="glyphicon glyphicon-envelope"></i>
<button type="button" class="add-item2 btn btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Insertar</button>
</h4>
</div>
<div class="panel-body">
<div class="container-items2"><!-- widgetBody -->
<?php foreach ($modelsModelo03 as $i => $modelModelo03): ?>
<div class="item2 panel panel-default"><!-- widgetItem -->
<div class="panel-heading">
<h3 class="panel-title pull-left"></h3>
<div class="pull-right">
<button type="button" class="remove-item2 btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (! $modelModelo03->isNewRecord) {
echo Html::activeHiddenInput($modelModelo03, "[{$i}]planificacion_fk");
}
?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($modelModelo03, "[{$i}]cargo_fk")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelModelo03, "[{$i}]medida_apl_fk")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelModelo03, "[{$i}]modelo03_cant")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelModelo03, "[{$i}]dic_fk")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
</div>
</div>
</div>
<div class="row">
<div class="panel panel-default">
<div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i> Modelo 04</h4></div>
<div class="panel-body">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items3', // required: css class selector
'widgetItem' => '.item3', // required: css class
'limit' => 999, // the maximum times, an element can be cloned (default 999)
'min' => 0, // 0 or 1 (default 1)
'insertButton' => '.add-item3', // css class
'deleteButton' => '.remove-item3', // css class
'model' => $modelsModelo04[0],
'formId' => 'dynamic-form',
'formFields' => [
'categoria_fk',
'viol_obj_soc_fk',
'dic_fk',
],
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
<h4>
<i class="glyphicon glyphicon-envelope"></i>
<button type="button" class="add-item3 btn btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Insertar</button>
</h4>
</div>
<div class="panel-body">
<div class="container-items3"><!-- widgetBody -->
<?php foreach ($modelsModelo04 as $i => $modelModelo04): ?>
<div class="item3 panel panel-default"><!-- widgetItem -->
<div class="panel-heading">
<h3 class="panel-title pull-left"></h3>
<div class="pull-right">
<button type="button" class="remove-item3 btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (! $modelModelo04->isNewRecord) {
echo Html::activeHiddenInput($modelModelo04, "[{$i}]planificacion_fk");
}
?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($modelModelo04, "[{$i}]categoria_fk")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelModelo04, "[{$i}]viol_obj_soc_fk")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelModelo04, "[{$i}]dic_fk")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
</div>
</div>
</div>
<div class="row">
<div class="panel panel-default">
<div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i> Modelo 05</h4></div>
<div class="row panel-body">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items4', // required: css class selector
'widgetItem' => '.item4', // required: css class
'limit' => 999, // the maximum times, an element can be cloned (default 999)
'min' => 0, // 0 or 1 (default 1)
'insertButton' => '.add-item4', // css class
'deleteButton' => '.remove-item4', // css class
'model' => $modelsModelo05[0],
'formId' => 'dynamic-form',
'formFields' => [
'modelo05_no_registro',
'situacion_fk',
'modelo05_sintesis',
'modelo05_causas',
'dic_fk',
],
]); ?>
<table class="table table-bordered">
<thead>
<tr class="active">
<td></td>
<td><?= Html::activeLabel($modelsModelo05[0], 'modelo05_no_registro'); ?></td>
<td><?= Html::activeLabel($modelsModelo05[0], 'situacion_fk'); ?></td>
<td><?= Html::activeLabel($modelsModelo05[0], 'modelo05_sintesis'); ?></td>
<td><?= Html::activeLabel($modelsModelo05[0], 'modelo05_causas'); ?></td>
<td><?= Html::activeLabel($modelsModelo05[0], 'dic_fk'); ?></td>
<td><label class="control-label">Implicados</label></td>
</tr>
</thead>
<tbody class="container-items4"><!-- widgetContainer -->
<?php foreach ($modelsModelo05 as $i => $modelModelo05): ?>
<tr class="item4"><!-- widgetBody -->
<td>
<button type="button" class="remove-item4 btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
<?php
// necessary for update action.
if (! $modelModelo05->isNewRecord) {
echo Html::activeHiddenInput($modelModelo05, "[{$i}]planificacion_fk");
}
?>
</td>
<td>
<?php
echo $form->field($modelModelo05, "[{$i}]modelo05_no_registro")->begin();
echo Html::activeTextInput($modelModelo05, "[{$i}]modelo05_no_registro", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelModelo05,"[{$i}]modelo05_no_registro", ['class' => 'help-block']); //error
echo $form->field($modelModelo05, "[{$i}]modelo05_no_registro")->end();
?>
</td>
<td>
<?php
echo $form->field($modelModelo05, "[{$i}]situacion_fk")->begin();
echo Html::activeTextInput($modelModelo05, "[{$i}]situacion_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelModelo05,"[{$i}]situacion_fk", ['class' => 'help-block']); //error
echo $form->field($modelModelo05, "[{$i}]situacion_fk")->end();
?>
</td>
<td>
<?php
echo $form->field($modelModelo05, "[{$i}]modelo05_sintesis")->begin();
echo Html::activeTextInput($modelModelo05, "[{$i}]modelo05_sintesis", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelModelo05,"[{$i}]modelo05_sintesis", ['class' => 'help-block']); //error
echo $form->field($modelModelo05, "[{$i}]modelo05_sintesis")->end();
?>
</td>
<td>
<?php
echo $form->field($modelModelo05, "[{$i}]modelo05_causas")->begin();
echo Html::activeTextInput($modelModelo05, "[{$i}]modelo05_causas", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelModelo05,"[{$i}]modelo05_causas", ['class' => 'help-block']); //error
echo $form->field($modelModelo05, "[{$i}]modelo05_causas")->end();
?>
</td>
<td>
<?php
echo $form->field($modelModelo05, "[{$i}]dic_fk")->begin();
echo Html::activeTextInput($modelModelo05, "[{$i}]dic_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelModelo05,"[{$i}]dic_fk", ['class' => 'help-block']); //error
echo $form->field($modelModelo05, "[{$i}]dic_fk")->end();
?>
</td>
<!-- Implicados -->
<td id="implicados">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_inner', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items5', // required: css class selector
'widgetItem' => '.item5', // required: css class
'limit' => 999, // the maximum times, an element can be cloned (default 999)
'min' => 1, // 0 or 1 (default 1)
'insertButton' => '.add-item5', // css class
'deleteButton' => '.remove-item5', // css class
'model' => $modelsImplicados[$i][0],
'formId' => 'dynamic-form',
'formFields' => [
'implicados_nombre',
'implicados_carnet',
'cargo_fk',
'cat_ocupacional_fk',
'nivel_dir_fk',
'escolaridad_fk',
'implicados_pertenece',
'dic_fk',
],
]);
?>
<table class="table table-bordered">
<thead>
<tr class="active">
<td></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'implicados_nombre'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'implicados_carnet'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'cargo_fk'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'cat_ocupacional_fk'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'nivel_dir_fk'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'escolaridad_fk'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'implicados_pertenece'); ?></td>
<td><?= Html::activeLabel($modelsImplicados[$i][0], 'dic_fk'); ?></td>
</tr>
</thead>
<tbody class="container-items5"><!-- widgetContainer -->
<?php foreach ($modelsImplicados[$i] as $ix => $modelImplicados): ?>
<tr class="item5"><!-- widgetBody -->
<td>
<button type="button" class="remove-item5 btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
<?php
// necessary for update action.
if (! $modelImplicados->isNewRecord) {
echo Html::activeHiddenInput($modelImplicados, "[{$i}][{$ix}]modelo05_fk");
}
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_nombre")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]implicados_nombre", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]implicados_nombre", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_nombre")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_carnet")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]implicados_carnet", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]implicados_carnet", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_carnet")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]cargo_fk")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]cargo_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]cargo_fk", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]cargo_fk")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]cat_ocupacional_fk")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]cat_ocupacional_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]cat_ocupacional_fk", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]cat_ocupacional_fk")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]nivel_dir_fk")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]nivel_dir_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]nivel_dir_fk", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]nivel_dir_fk")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]escolaridad_fk")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]escolaridad_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]escolaridad_fk", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]escolaridad_fk")->end();
?>
</td>
<td>
<?php
/*if(!$modelImplicados->isNewRecord) {
$modelImplicados->implicados_pertenece = $modelImplicados->readLoadImplicados_pertenece();
}*/
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_pertenece")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]implicados_pertenece", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]implicados_pertenece", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]implicados_pertenece")->end();
?>
</td>
<td>
<?php
echo $form->field($modelImplicados, "[{$i}][{$ix}]dic_fk")->begin();
echo Html::activeTextInput($modelImplicados, "[{$i}][{$ix}]dic_fk", ['maxlength' => true, 'class' => 'form-control']); //Field
echo Html::error($modelImplicados,"[{$i}][{$ix}]dic_fk", ['class' => 'help-block']); //error
echo $form->field($modelImplicados, "[{$i}][{$ix}]dic_fk")->end();
?>
</td>
</tr>
<?php endforeach; // end of implicados loop ?>
</tbody>
<tfoot>
<td colspan="9" class="active"><button type="button" class="add-item5 btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button></td>
</tfoot>
</table>
<?php DynamicFormWidget::end(); // end of loads widget ?>
</td> <!-- implicados sub column -->
</tr><!-- payment -->
<?php endforeach; // end of modelo05 loop ?>
</tbody>
<tfoot>
<td colspan="7" class="active">
<button type="button" class="add-item4 btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
</td>
</tfoot>
</table>
<?php DynamicFormWidget::end(); // end of modelo05 widget ?>
</div>
</div>
</div>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<script type="text/javascript">
$(".dynamicform_wrapper").on("beforeInsert", function(e, item) {
console.log("beforeInsert");
});
$(".dynamicform_wrapper").on("afterInsert", function(e, item) {
console.log("afterInsert");
});
$(".dynamicform_wrapper").on("beforeDelete", function(e, item) {
if (! confirm("Are you sure you want to delete this item?")) {
return false;
}
return true;
});
$(".dynamicform_wrapper").on("afterDelete", function(e) {
console.log("Deleted item!");
});
$(".dynamicform_wrapper").on("limitReached", function(e, item) {
alert("Limit reached");
});
</script>
controller
<?php
namespace backend\controllers;
use Yii;
use backend\models\Planificacion;
use backend\models\PlanificacionSearch;
use backend\models\Modelo01;
use backend\models\Modelo03;
use backend\models\Modelo04;
use backend\models\Modelo05;
use backend\models\Implicados;
use backend\models\Model;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use mPDF;
/**
* PlanificacionController implements the CRUD actions for Planificacion model.
*/
class PlanificacionController extends Controller
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}
/**
* Lists all Planificacion models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new PlanificacionSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Planificacion model.
* @param string $id
* @return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new Planificacion model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new Planificacion();
$modelsModelo01 = [new Modelo01];
$modelsModelo03 = [new Modelo03];
$modelsModelo04 = [new Modelo04];
$modelsModelo05 = [new Modelo05()];
$modelsImplicados[] = [new Implicados];
if ($model->load(Yii::$app->request->post()) /*&& $model->save()*/)
{
$modelsModelo01 = Model::createMultiple(Modelo01::classname());
\yii\base\Model::loadMultiple($modelsModelo01, Yii::$app->request->post());
$modelsModelo03 = Model::createMultiple(Modelo03::classname());
\yii\base\Model::loadMultiple($modelsModelo03, Yii::$app->request->post());
$modelsModelo04 = Model::createMultiple(Modelo04::classname());
\yii\base\Model::loadMultiple($modelsModelo04, Yii::$app->request->post());
$modelsModelo05 = Model::createMultiple(Modelo05::classname());
\yii\base\Model::loadMultiple($modelsModelo05, Yii::$app->request->post());
// get Implicados data from POST
$implicadosData['_csrf'] = Yii::$app->request->post()['_csrf'];
for ($i=0; $i<count($modelsModelo05); $i++) {
$implicadosData['Implicados'] = Yii::$app->request->post()['Implicados'][$i];
$modelsImplicados[$i] = Model::createMultiple(Implicados::classname(),[] ,$implicadosData);
Model::loadMultiple($modelsImplicados[$i], $implicadosData);
}
// validate all models
$valid = $model->validate();
$valid = \yii\base\Model::validateMultiple($modelsModelo01) && $valid;
$valid1 = $model->validate();
$valid1 = \yii\base\Model::validateMultiple($modelsModelo03) && $valid1;
$valid2 = $model->validate();
$valid2 = \yii\base\Model::validateMultiple($modelsModelo04) && $valid2;
$valid3 = $model->validate();
$valid3 = Modelo05::validateModelo($modelsModelo05,$modelsImplicados) && $valid3;
if ($valid1 && $valid1 && $valid2 ) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
foreach ($modelsModelo01 as $modelModelo01)
{
$modelModelo01->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo01->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsModelo03 as $modelModelo03)
{
$modelModelo03->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo03->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsModelo04 as $modelModelo04)
{
$modelModelo04->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo04->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsModelo05 as $i => $modelModelo05) {
// save the Modelo05 record
$modelModelo05->planificacion_fk = $model->plan_cod;
if ($flag = $modelModelo05->save(false)) {
// loop through each Implicados
foreach ($modelsImplicados[$i] as $ix => $modelImplicados) {
// save the load record
$modelImplicados->modelo05_fk = $modelModelo05->modelo05_no_registro;
if (! ($flag = $modelImplicados->save(false))) {
$transaction->rollBack();
break;
}
}
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->plan_cod]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
} else {
return $this->render('create', [
'model' => $model,
'modelsModelo01' => (empty($modelsModelo01)) ? [new Modelo01] : $modelsModelo01,
'modelsModelo03' => (empty($modelsModelo03)) ? [new Modelo03] : $modelsModelo03,
'modelsModelo04' => (empty($modelsModelo04)) ? [new Modelo04] : $modelsModelo04,
'modelsModelo05' => (empty($modelsModelo05)) ? [new Modelo05] : $modelsModelo05,
'modelsImplicados' => (empty($modelsImplicados)) ? [new Implicados] : $modelsImplicados,
]);
}
}
/**
* Updates an existing Planificacion model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param string $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
$modelsModelo01 = $model->modelo01;
$modelsModelo03 = $model->modelo03s;
$modelsModelo04 = $model->modelo04s;
if ($model->load(Yii::$app->request->post()) /*&& $model->save()*/)
{
//modelo01
$oldIDs = ArrayHelper::map($modelsModelo01, 'planificacion_fk', 'planificacion_fk');
$modelsModelo01 = Model::createMultiple(Modelo01::classname(), $modelsModelo01);
Model::loadMultiple($modelsModelo01, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsModelo01, 'planificacion_fk', 'planificacion_fk')));
//modelo03
$oldIDs1 = ArrayHelper::map($modelsModelo03, 'planificacion_fk', 'planificacion_fk');
$modelsModelo03 = Model::createMultiple(Modelo03::classname(), $modelsModelo03);
Model::loadMultiple($modelsModelo03, Yii::$app->request->post());
$deletedIDs1 = array_diff($oldIDs1, array_filter(ArrayHelper::map($modelsModelo03, 'planificacion_fk', 'planificacion_fk')));
//modelo04
$oldIDs2 = ArrayHelper::map($modelsModelo04, 'planificacion_fk', 'planificacion_fk');
$modelsModelo04 = Model::createMultiple(Modelo04::classname(), $modelsModelo04);
Model::loadMultiple($modelsModelo04, Yii::$app->request->post());
$deletedIDs2 = array_diff($oldIDs2, array_filter(ArrayHelper::map($modelsModelo04, 'planificacion_fk', 'planificacion_fk')));
// ajax validation
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsModelo03),
ActiveForm::validate($model)
);
}
// validate all models
$valid = $model->validate();
$valid = Model::validateMultiple($modelsModelo01) && $valid;
$valid1 = $model->validate();
$valid1 = Model::validateMultiple($modelsModelo03) && $valid1;
$valid2 = $model->validate();
$valid2 = Model::validateMultiple($modelsModelo04) && $valid2;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
if (! empty($deletedIDs) && ! empty($deletedIDs1) && ! empty($deletedIDs2)) {
Modelo01::deleteAll(['planificacion_fk' => $deletedIDs]);
Modelo03::deleteAll(['planificacion_fk' => $deletedIDs1]);
Modelo04::deleteAll(['planificacion_fk' => $deletedIDs2]);
}
foreach ($modelsModelo01 as $modelModelo01) {
$modelModelo01->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo01->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsModelo03 as $modelModelo03) {
$modelModelo03->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo03->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsModelo04 as $modelModelo04) {
$modelModelo04->planificacion_fk = $model->plan_cod;
if (! ($flag = $modelModelo04->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->plan_cod]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
} else {
return $this->render('update', [
'model' => $model,
'modelsModelo01' => (empty($modelsModelo01)) ? [new Modelo01] : $modelsModelo01,
'modelsModelo03' => (empty($modelsModelo03)) ? [new Modelo03] : $modelsModelo03,
'modelsModelo04' => (empty($modelsModelo04)) ? [new Modelo04] : $modelsModelo04
]);
}
}
/**
* Deletes an existing Planificacion model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param string $id
* @return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
/**
* Finds the Planificacion model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param string $id
* @return Planificacion the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Planificacion::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
public function actionLists($id)
{
$rows = \app\models\Entidad::find()->where(['orga_fk' => $id])->all();
echo "<option>Selecione una entidad</option>";
if(count($rows)>0){
foreach($rows as $row){
echo "<option value='$row->id_entidad'>$row->entidad_nombre</option>";
}
}
else{
echo "<option>No existe ninguna entidad</option>";
}
}
}
Hi,
I have used this extension in my project & its working as expected.
I have replied in forum https://github.com/wbraganca/yii2-dynamicform/issues/66 with update section.
There are video tutorials for same
Thanks,
Vishwas
hi, thx for your answer but my problem isn’t with the actionUpdate i can update without any problem , my issue is when i try to insert more than one element(in my case Modelo01)only store in DB the last one, not all of them, also when i use karktik-Select2 doesn’t work, it stays loading and don’t show the widget but if i use a dropdown it work fine, but i need to use Select2, and when i try to use kartik-DatePicker it shows but the calendar doesn’t work,i’m going to attach an image, plz help, i really see this extension very useful and i want to use it,thx and sorry for my bad english
Hi epulgaron,
Have you managed to solve the issue with having more than one DynamicForm in one view ?
I have similar issue in the create action. I have two DynamicForms in one form. In create action only items from first DynamicForm are beeing saved. Second DynamicForm is creating empty items with ID only if though I removed all the validation rules.
Here is my view code:
<div class="panel panel-default">
<div class="panel-heading">
<h4>
<i class="glyphicon glyphicon-envelope"></i> Addresses
<button type="button" class="add-item btn btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Add</button>
</h4>
</div>
<div class="panel-body">
<div class="container-items"><!-- widgetBody -->
<?php foreach ($modelsAddress as $i => $modelAddress): ?>
<div class="item panel panel-default"><!-- widgetItem -->
<div class="panel-heading">
<h3 class="panel-title pull-left">Address</h3>
<div class="pull-right">
<button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (! $modelAddress->isNewRecord) {
echo Html::activeHiddenInput($modelAddress, "[{$i}]id");
}
?>
<?= $form->field($modelAddress, "[{$i}]title")->textInput(['maxlength' => true]) ?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($modelAddress, "[{$i}]country")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelAddress, "[{$i}]province")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-3">
<?= $form->field($modelAddress, "[{$i}]city")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-3">
<?= $form->field($modelAddress, "[{$i}]post_code")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-3">
<?= $form->field($modelAddress, "[{$i}]street")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-3">
<?= $form->field($modelAddress, "[{$i}]street_number")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
<h2>Triathlon</h2>
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper_tri', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.container-items', // required: css class selector
'widgetItem' => '.item', // required: css class
'limit' => 5, // the maximum times, an element can be added (default 999)
'min' => 1, // 0 or 1 (default 1)
'insertButton' => '.add-item', // css class
'deleteButton' => '.remove-item', // css class
'model' => $modelsTriathlonType[0],
'formId' => 'dynamic-form',
'formFields' => [
'title',
'swim',
'bike',
'run',
],
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
<h4>
<i class="glyphicon glyphicon-envelope"></i> Triathlons
<button type="button" class="add-item btn btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Add</button>
</h4>
</div>
<div class="panel-body">
<div class="container-items"><!-- widgetBody -->
<?php foreach ($modelsTriathlonType as $iTriathlon => $modelTriathlonType): ?>
<div class="item panel panel-default"><!-- widgetItem -->
<div class="panel-heading">
<h3 class="panel-title pull-left">Triathlon</h3>
<div class="pull-right">
<button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (! $modelTriathlonType->isNewRecord) {
echo Html::activeHiddenInput($modelTriathlonType, "[{$iTriathlon}]id");
}
?>
<?= $form->field($modelTriathlonType, "[{$iTriathlon}]title")->textInput(['maxlength' => true]) ?>
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelTriathlonType, "[{$iTriathlon}]swim")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelTriathlonType, "[{$iTriathlon}]bike")->textInput(['maxlength' => true]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelTriathlonType, "[{$iTriathlon}]run")->textInput(['maxlength' => true]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
Here is my controller create action code:
public function actionCreate()
{
$model = new Contest();
if (!$model) {
throw new NotFoundHttpException("The contest was not found.");
}
$modelsAddress = [new Address];
if (!$modelsAddress) {
throw new NotFoundHttpException("The address was not found.");
}
$date = new Date();
if (!$date) {
throw new NotFoundHttpException("The date was not found.");
}
$seo = new Seo();
if (!$seo) {
throw new NotFoundHttpException("The seo was not found.");
}
$modelsTriathlonType = [new TriathlonType];
if (!$modelsTriathlonType) {
throw new NotFoundHttpException("The triathlon was not found.");
}
if ($model->load(Yii::$app->request->post()) && $seo->load(Yii::$app->request->post()) && $date->load(Yii::$app->request->post())) {
$modelsAddress = Model::createMultiple(Address::classname());
$modelsTriathlonType = Model::createMultiple(TriathlonType::classname());
Model::loadMultiple($modelsAddress, Yii::$app->request->post());
Model::loadMultiple($modelsTriathlonType, Yii::$app->request->post());
// ajax validation
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsAddress, $modelsTriathlonType, $model, $seo, $date)
);
}
$isValid = $model->validate();
if(!$isValid) {
throw new NotFoundHttpException("Model validation issue.");
}
$isValid = Model::validateMultiple($modelsTriathlonType, ['title']) && $isValid;
if(!$isValid) {
throw new NotFoundHttpException("TT validation issue.");
}
$isValid = Model::validateMultiple($modelsAddress) && $isValid;
if(!$isValid) {
throw new NotFoundHttpException("Adres validation issue.");
}
$isValid = $seo->validate() && $isValid;
if($isValid = false) {
throw new NotFoundHttpException("Seo validation issue.");
}
if ($isValid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save()) {
foreach ($modelsAddress as $address) {
if($address->save()) {
$contestHasAddress = new ContestHasAddress;
$contestHasAddress->contest_id = $model->id;
$contestHasAddress->address_id = $address->id;
$contestHasAddress->save(false);
}
if (! ($flag = $address->save())) {
$transaction->rollBack();
break;
}
}
foreach ($modelsTriathlonType as $triathlon) {
if($triathlon->save()) {
$contestHasTriathlonType = new ContestHasTriathlonType;
$contestHasTriathlonType->contest_id = $model->id;
$contestHasTriathlonType->triathlon_type_id = $triathlon->id;
$contestHasTriathlonType->save(false);
}
if (! ($flag = $triathlon->save())) {
$transaction->rollBack();
break;
}
}
if(isset($date->date)) {
$date->date = strtotime($date->date);
}
if(isset($date->start_time)) {
$date->start_time = strtotime($date->start_time);
}
if(isset($date->end_time)) {
$date->end_time = strtotime($date->end_time);
}
if($date->save()) {
$contestHasDate = new ContestHasDate;
$contestHasDate->contest_id = $model->id;
$contestHasDate->date_id = $date->id;
$contestHasDate->save(false);
}
if($seo->save()) {
$contestHasSeo = new ContestHasSeo;
$contestHasSeo->contest_id = $model->id;
$contestHasSeo->seo_id = $seo->id;
$contestHasSeo->save(false);
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['contest/view', 'id' => $model->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
else {
return $this->render('create', [
'model' => $model,
'modelsAddress' => (empty($modelsAddress)) ? [new Address] : $modelsAddress,
'date' => $date,
'seo' => $seo,
'modelsTriathlonType' => (empty($modelsTriathlonType)) ? [new TriathlonType] : $modelsTriathlonType,
]);
}
}
Here is the potential issue I have no idea to solve. When I click to add new item on first or on the second model it is messing the indexes in the view file. I end up with wrong indexes(at least I think this is an issue. Please have a look in the log entry. Second model id in the $_POST data is incrementally increased. So In the TriathlonType the id in $_POST supposed to be 0 and 1 and it is 2 and 3. I’m sorry if this is not clear
$_POST = [
'_csrf-backend' => 'eDFhaDhWSEowVDMYdT8BIRpAUARrbmUOG0FVLw8.ZQ5KSAZfaCEFfQ=='
'Contest' => [
'title' => 'test'
'lead' => 'test'
'description' => 'test'
'payment' => 'test'
'link' => 'test'
'logo' => 'test'
'sponor' => 'test'
'promo' => '1'
'featured' => '1'
]
'Address' => [
0 => [
'title' => 'test'
'country' => 'test'
'province' => ''
'city' => 'test'
'post_code' => ''
'street' => 'test'
'street_number' => ''
]
]
'Date' => [
'date' => '04-1-2017 15:08'
'start_time' => '04-1-2017 15:08'
'end_time' => '04-1-2017 15:08'
'description' => 'test'
]
'Seo' => [
'title' => 'test'
'description' => 'test'
'keywords' => 'test'
'author' => ''
]
'TriathlonType' => [
[color="#FFFF00"]1[/color] => [
'title' => '1/2 Iron Man'
'swim' => '1900m'
'bike' => '90km'
'run' => '21km'
]
[color="#FFFF00"]2[/color] => [
'title' => '1/4 Iron Man'
'swim' => '950m'
'bike' => '45km'
'run' => '10.5km'
]
]
]
If any of you have an advice, please le me know. Cheers
best regards
lukBB