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

I need create two dynamicform in the seame view

Open gvalmana opened this issue 6 years ago • 10 comments

Hi i need some help, i hace un model with two realtionship and i need y de same vew use two dimanic form for each relashion, how can i do that, thanks

gvalmana avatar Sep 16 '18 15:09 gvalmana

My problem is creatin the acction in the controller

gvalmana avatar Sep 16 '18 15:09 gvalmana

please do you find solution? i'm in the same case

cresusjpt avatar Jan 29 '19 01:01 cresusjpt

please do you find solution? i'm in the same case

Yes i did it

gvalmana avatar Feb 20 '19 17:02 gvalmana

please can you share with me?

cresusjpt avatar Feb 20 '19 18:02 cresusjpt

please can you share with me?

Can i doit tomorrow? Today im not in my work?

gvalmana avatar Feb 20 '19 18:02 gvalmana

of course it's not urgent. thank you

cresusjpt avatar Feb 20 '19 18:02 cresusjpt

This is my code Controller:

    public function actionCreate()
    {
        $model = new Solicitudes();
        $modelsCarpetas = [new CarpetasSolicitudes];
        $modelsAplicaciones = [new AplicacionesSolicitudes];
        
        $model->creada = time();
        $model->actualizada = time();
        
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $modelsCarpetas = Model::createMultiple(CarpetasSolicitudes::classname());
            Model::loadMultiple($modelsCarpetas, Yii::$app->request->post());
            $modelsAplicaciones = Model::createMultiple(AplicacionesSolicitudes::className());
            Model::loadMultiple($modelsAplicaciones, Yii::$app->request->post());            
            
            // validate all models
            $valid = $model->validate();
            $valid = Model::validateMultiple($modelsCarpetas) && $valid;
            //$valid = Model::validateMultiple($modelsAplicaciones) && $valid;
            if ($valid) {
                Yii::$app->session->setFlash('success', 'La solicitud ha sido guardada con éxito');
            }
            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        foreach ($modelsCarpetas as $modelsCarpeta) {
                            $modelsCarpeta->solicitud = $model->id;
                            if (! ($flag = $modelsCarpeta->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }                       
                    }
                    if ($flag = $model->save(false)) {
                        foreach ($modelsAplicaciones as $modelAplicacion) {
                            $modelAplicacion->solicitud = $model->id;
                            if (! ($flag = $modelAplicacion->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }                        
                    }
                    if ($flag) {
                        $transaction->commit();
                        return $this->redirect(['view', 'id' => $model->id]);
                    }                    
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'modelsCarpetas' => (empty($modelsCarpetas)) ? [new CarpetasSolicitudes] : $modelsCarpetas,
                'modelsAplicaciones' => (empty($modelsAplicaciones)) ? [new AplicacionesSolicitudes] : $modelsAplicaciones                
            ]);
        }
    }

Views: (Two div whit the forms) --- Sorry for my english

    <?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' => app\models\CarpetasCompartidas::find()->count(), // the maximum times, an element can be added (default 999)
        'min' => 0, // 0 or 1 (default 1)
        'insertButton' => '.add-item', // css class
        'deleteButton' => '.remove-item', // css class
        'model' => $modelsCarpetas[0],
        'formId' => 'dynamic-form',
        'formFields' => [
            'carpeta',
            'motivo',
            'leer',
            'escribir',
            'eliminar',
        ],
    ]); ?>

    <div class="box box-primary">
        <div class="box-header">
            <h4>
                <i class="fa fa-folder-open"></i> Carpetas compartidas
                <button type="button" class="add-item btn btn-success btn-flat btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Adicionar</button>
            </h4>
        </div>
        <div class="box-body">
            <div class="container-items"><!-- widgetBody -->
            <?php foreach ($modelsCarpetas as $i => $modelCarpeta): ?>
                <div class="item box box-default"><!-- widgetItem -->
                    <div class="box-header">
                        <h3 class="box-title pull-left">Carpeta</h3>
                        <div class="pull-right">
                            <button type="button" class="remove-item btn btn-danger btn-flat btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                        </div>
                        <div class="clearfix"></div>
                    </div>
                    <div class="box-body">
                        <?php
                            // necessary for update action.
                            if (! $modelCarpeta->isNewRecord) {
                                echo Html::activeHiddenInput($modelCarpeta, "[{$i}]id");
                            }
                        ?>
                        <div class="row">
                            <div class="col-sm-6">
                                <?= $form->field($modelCarpeta, "[{$i}]motivo")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                            <div class="col-sm-6">
                                <?= $form->field($modelCarpeta, "[{$i}]carpeta")->dropDownlist(ArrayHelper::map(app\models\CarpetasCompartidas::find()->all(), 'id', 'nombre'),['prompt'=>'']) ?>
                            </div>
                        </div><!-- .row -->
                        <div class="row">
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]leer")->checkBox() ?>
                            </div>                            
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]escribir")->checkBox() ?>
                            </div>
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]eliminar")->checkBox()?>
                            </div>
                        </div><!-- .row -->
                    </div>
                </div>
            <?php endforeach; ?>
            </div>
        </div>
    </div><!-- .panel -->
    <?php DynamicFormWidget::end(); ?>
    
    <?php DynamicFormWidget::begin([
        'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
        'widgetBody' => '.container-items-2', // required: css class selector
        'widgetItem' => '.item-2', // required: css class
        'limit' => 10, // the maximum times, an element can be added (default 999)
        'min' => 0, // 0 or 1 (default 1)
        'insertButton' => '.add-item-2', // css class
        'deleteButton' => '.remove-item-2', // css class
        'model' => $modelsAplicaciones[0],
        'formId' => 'dynamic-form',
        'formFields' => [
            'aplicacion',
            'modulo',
            'motivos',
        ],
    ]); ?>

    <div class="box box-primary">
        <div class="box-header">
            <h4>
                <i class="fa fa-folder-open"></i> Aplicaciones y sistemas
                <button type="button" class="add-item-2 btn btn-flat btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Adicionar</button>
            </h4>
        </div>
        <div class="box-body">
            <div class="container-items-2"><!-- widgetBody -->
            <?php foreach ($modelsAplicaciones as $i => $modelAplicacion): ?>
                <div class="item-2 box box-default"><!-- widgetItem -->
                    <div class="box-header">
                        <h3 class="box-title-title pull-left">Aplicación</h3>
                        <div class="pull-right">
                            <button type="button" class="remove-item-2 btn btn-flat btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                        </div>
                        <div class="clearfix"></div>
                    </div>
                    <div class="box-body">
                        <?php
                            // necessary for update action.
                            if (! $modelAplicacion->isNewRecord) {
                                echo Html::activeHiddenInput($modelAplicacion, "[{$i}]id");
                            }
                        ?>
                        <div class="row">
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]motivos")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]aplicacion")->dropDownlist(ArrayHelper::map(app\models\Aplicaciones::find()->all(), 'id', 'sistemas'),['prompt'=>'']) ?>
                            </div>
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]tipo_acceso")->dropDownlist(['TOTAL'=>'TOTAL','LIMITADO'=>'LIMITADO'],['prompt'=>'']); ?>
                            </div>                                
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]modulo")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                        </div>
                    </div>
                </div>
            <?php endforeach; ?>
            </div>
        </div>
    </div><!-- .panel -->
    <?php DynamicFormWidget::end(); ?>

gvalmana avatar Feb 21 '19 19:02 gvalmana

This is my code Controller:

    public function actionCreate()
    {
        $model = new Solicitudes();
        $modelsCarpetas = [new CarpetasSolicitudes];
        $modelsAplicaciones = [new AplicacionesSolicitudes];
        
        $model->creada = time();
        $model->actualizada = time();
        
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $modelsCarpetas = Model::createMultiple(CarpetasSolicitudes::classname());
            Model::loadMultiple($modelsCarpetas, Yii::$app->request->post());
            $modelsAplicaciones = Model::createMultiple(AplicacionesSolicitudes::className());
            Model::loadMultiple($modelsAplicaciones, Yii::$app->request->post());            
            
            // validate all models
            $valid = $model->validate();
            $valid = Model::validateMultiple($modelsCarpetas) && $valid;
            //$valid = Model::validateMultiple($modelsAplicaciones) && $valid;
            if ($valid) {
                Yii::$app->session->setFlash('success', 'La solicitud ha sido guardada con éxito');
            }
            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        foreach ($modelsCarpetas as $modelsCarpeta) {
                            $modelsCarpeta->solicitud = $model->id;
                            if (! ($flag = $modelsCarpeta->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }                       
                    }
                    if ($flag = $model->save(false)) {
                        foreach ($modelsAplicaciones as $modelAplicacion) {
                            $modelAplicacion->solicitud = $model->id;
                            if (! ($flag = $modelAplicacion->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }                        
                    }
                    if ($flag) {
                        $transaction->commit();
                        return $this->redirect(['view', 'id' => $model->id]);
                    }                    
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'modelsCarpetas' => (empty($modelsCarpetas)) ? [new CarpetasSolicitudes] : $modelsCarpetas,
                'modelsAplicaciones' => (empty($modelsAplicaciones)) ? [new AplicacionesSolicitudes] : $modelsAplicaciones                
            ]);
        }
    }

Views: (Two div whit the forms) --- Sorry for my english

    <?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' => app\models\CarpetasCompartidas::find()->count(), // the maximum times, an element can be added (default 999)
        'min' => 0, // 0 or 1 (default 1)
        'insertButton' => '.add-item', // css class
        'deleteButton' => '.remove-item', // css class
        'model' => $modelsCarpetas[0],
        'formId' => 'dynamic-form',
        'formFields' => [
            'carpeta',
            'motivo',
            'leer',
            'escribir',
            'eliminar',
        ],
    ]); ?>

    <div class="box box-primary">
        <div class="box-header">
            <h4>
                <i class="fa fa-folder-open"></i> Carpetas compartidas
                <button type="button" class="add-item btn btn-success btn-flat btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Adicionar</button>
            </h4>
        </div>
        <div class="box-body">
            <div class="container-items"><!-- widgetBody -->
            <?php foreach ($modelsCarpetas as $i => $modelCarpeta): ?>
                <div class="item box box-default"><!-- widgetItem -->
                    <div class="box-header">
                        <h3 class="box-title pull-left">Carpeta</h3>
                        <div class="pull-right">
                            <button type="button" class="remove-item btn btn-danger btn-flat btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                        </div>
                        <div class="clearfix"></div>
                    </div>
                    <div class="box-body">
                        <?php
                            // necessary for update action.
                            if (! $modelCarpeta->isNewRecord) {
                                echo Html::activeHiddenInput($modelCarpeta, "[{$i}]id");
                            }
                        ?>
                        <div class="row">
                            <div class="col-sm-6">
                                <?= $form->field($modelCarpeta, "[{$i}]motivo")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                            <div class="col-sm-6">
                                <?= $form->field($modelCarpeta, "[{$i}]carpeta")->dropDownlist(ArrayHelper::map(app\models\CarpetasCompartidas::find()->all(), 'id', 'nombre'),['prompt'=>'']) ?>
                            </div>
                        </div><!-- .row -->
                        <div class="row">
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]leer")->checkBox() ?>
                            </div>                            
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]escribir")->checkBox() ?>
                            </div>
                            <div class="col-sm-4">
                                <?= $form->field($modelCarpeta, "[{$i}]eliminar")->checkBox()?>
                            </div>
                        </div><!-- .row -->
                    </div>
                </div>
            <?php endforeach; ?>
            </div>
        </div>
    </div><!-- .panel -->
    <?php DynamicFormWidget::end(); ?>
    
    <?php DynamicFormWidget::begin([
        'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
        'widgetBody' => '.container-items-2', // required: css class selector
        'widgetItem' => '.item-2', // required: css class
        'limit' => 10, // the maximum times, an element can be added (default 999)
        'min' => 0, // 0 or 1 (default 1)
        'insertButton' => '.add-item-2', // css class
        'deleteButton' => '.remove-item-2', // css class
        'model' => $modelsAplicaciones[0],
        'formId' => 'dynamic-form',
        'formFields' => [
            'aplicacion',
            'modulo',
            'motivos',
        ],
    ]); ?>

    <div class="box box-primary">
        <div class="box-header">
            <h4>
                <i class="fa fa-folder-open"></i> Aplicaciones y sistemas
                <button type="button" class="add-item-2 btn btn-flat btn-success btn-sm pull-right"><i class="glyphicon glyphicon-plus"></i> Adicionar</button>
            </h4>
        </div>
        <div class="box-body">
            <div class="container-items-2"><!-- widgetBody -->
            <?php foreach ($modelsAplicaciones as $i => $modelAplicacion): ?>
                <div class="item-2 box box-default"><!-- widgetItem -->
                    <div class="box-header">
                        <h3 class="box-title-title pull-left">Aplicación</h3>
                        <div class="pull-right">
                            <button type="button" class="remove-item-2 btn btn-flat btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                        </div>
                        <div class="clearfix"></div>
                    </div>
                    <div class="box-body">
                        <?php
                            // necessary for update action.
                            if (! $modelAplicacion->isNewRecord) {
                                echo Html::activeHiddenInput($modelAplicacion, "[{$i}]id");
                            }
                        ?>
                        <div class="row">
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]motivos")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]aplicacion")->dropDownlist(ArrayHelper::map(app\models\Aplicaciones::find()->all(), 'id', 'sistemas'),['prompt'=>'']) ?>
                            </div>
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]tipo_acceso")->dropDownlist(['TOTAL'=>'TOTAL','LIMITADO'=>'LIMITADO'],['prompt'=>'']); ?>
                            </div>                                
                            <div class="col-sm-6">
                                <?= $form->field($modelAplicacion, "[{$i}]modulo")->textInput(['maxlength' => 64]) ?>
                            </div>                            
                        </div>
                    </div>
                </div>
            <?php endforeach; ?>
            </div>
        </div>
    </div><!-- .panel -->
    <?php DynamicFormWidget::end(); ?>

Hi, I have 2 questions:

  1. Why do you use the same wrapper class for both widgets?
  2. How did you write JS events for 2 widgets?

foxm4ster avatar Feb 25 '19 04:02 foxm4ster

Because i have two models to manipulate, and the JS eventes i helped whit the docs of the extension

gvalmana avatar Mar 06 '19 15:03 gvalmana

sir gvalman. I created 2 dynamic form and i add textinput for amount, It is possible to sum all amount of 2 dynamic form?

melvsw avatar May 18 '20 15:05 melvsw