Ayuda con ventana Modal

Buenos dias a todos, necesito ayuda en relacion a una ventana modal.

El asunto es el siguiente:

Tengo varias tablas o modelos que se relacionan con una tabla principal.

Cuando entro en la vista de la tabla principal y me voy al create cargo la ventana modal y tipeo un dato en un campo codigo y adicional cambio un valor en un dropdown que tiene varias opciones como es de suponer. Cada una de las opciones que se encuentran en el dropdown indican cual sera la tabla a la que debo hacer referencia en este momento para continuar la edicion.

Hasta aqui todo bien. Cuando se escoge un valor del dropdown hago uso del change para hacer una validacion y ademas le indico al controller que puedo salvar los primeros datos de la tabla principal y por supuesto generar un id de ese nuevo registro de la tabla principal. Luego deberia poder permanecer en la ventana modal rellenar los datos de la tabla secundaria seleccionada y al finalizar esta edicion y pulsar Guardar poder postear los datos para el nuevo registro en la tabla secundaria y el id de la primaria que seria el dato vinculante.

Espero poder explicarme bien.

El codigo que tengo es asi:

Controller:


public function actionCreate($submit = false)

	{

        $model = new OrigenbienGeneral();

        $model_a = new OrigenbienA();

        $model_b = new OrigenbienB();

        $model_c = new OrigenbienC();

        $model_d = new OrigenbienD();


        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()) && $submit == false) {

            Yii::$app->response->format = Response::FORMAT_JSON;

            return ActiveForm::validate($model);

        }

        

        if ($model->load(Yii::$app->request->post())) {

            $model->codigo = $model->codigoLetra.$model->codigoNumero;

            if ($model->save()) { 

                $model->refresh();

            } 

        } else {

            return $this->renderAjax('create', [

                'model' => $model,

                'model_a' => $model_a,

                'model_b' => $model_b,

                'model_c' => $model_c,

                'model_d' => $model_d,

            ]);

        }

    }

index.php


<?php


use yii\helpers\Html;

use yii\grid\GridView;


// Para ventana MODAL

use yii\bootstrap\Modal;

use yii\helpers\Url;

use yii\widgets\Pjax;


/* @var $this yii\web\View */

/* @var $searchModel frontend\models\search\OrigenbienGeneralSearch */

/* @var $dataProvider yii\data\ActiveDataProvider */


$this->title = 'Origen de los bienes';

$this->params['breadcrumbs'][] = $this->title;

?>

<div class="origenbien-general-index">


    <h1><?= Html::encode($this->title) ?></h1>

    <p>

        <?= Html::a('Incluir Origen del Bien', '#', [

            'id' => 'activity-index-link',

            'class' => 'btn btn-success',

            'data-toggle' => 'modal',

            'data-target' => '#modal',

            'data-url' => Url::to(['create']),

            'data-pjax' => '0',

        ]); ?>

    </p>


    <?php Pjax::begin() ?>

    <?= GridView::widget([

        'id' => 'origenbien-general-grid',

        'dataProvider' => $dataProvider,

        'filterModel' => $searchModel,

        'columns' => [

            ['class' => 'yii\grid\SerialColumn'],

            //'id',

            'codigo',

            [

               'attribute'=>'formasadquisicionbien_id',

               'value'=>'formasadquisicionbien.descripcion',

            ],

            //['class' => 'yii\grid\ActionColumn'],

            // Para uso de MODAL

            [

                'class' => 'yii\grid\ActionColumn',

                'template' => '{view}{update}{delete}',

                'buttons' => [

                    'update' => function ($url, $model, $key) {

                        return Html::a('<span class="glyphicon glyphicon-pencil"></span>', '#', [

                            'id' => 'activity-index-link',

                            'title' => Yii::t('app', 'Update'),

                            'data-toggle' => 'modal',

                            'data-target' => '#modal',

                            'data-url' => Url::to(['update', 'id' => $model->id]),

                            'data-pjax' => '0',

                        ]);

                    },

                ]

            ],

        ],

    ]); ?>

    <?php Pjax::end() ?>

    <?php

        $this->registerJs(

            "$(document).on('click', '#activity-index-link', (function() {

                $.get(

                    $(this).data('url'),

                    function (data) {

                        $('.modal-body').html(data);

                        $('#modal').modal();

                    }

                );

            }));"

        ); 

    ?>

    <?php

        Modal::begin([

            'id' => 'modal',

            'header' => '<h4 class="modal-title">Incluir</h4>',

            'footer' => '<a href="#" class="btn btn-primary" data-dismiss="modal">Cerrar</a>',

        ]);


        echo "<div class='well'></div>";


        Modal::end();

    ?>

</div>

_form.php


<?php


use yii\helpers\Html;

use yii\widgets\ActiveForm;


use yii\helpers\Url;


/* @var $this yii\web\View */

/* @var $model frontend\models\OrigenbienGeneral */

/* @var $form yii\widgets\ActiveForm */

?>


<div class="origenbien-general-form">

    

     <!--Modificaciones para ventana MODAL -->

    <?php $form = ActiveForm::begin([

        'id' => 'origenbien-general-form',

        'enableAjaxValidation' => true,    

        'enableClientScript' => true,

        'enableClientValidation' => true,

        'validateOnSubmit'=>true

    ]); ?>


    <?php

        $this->registerJs('

            // obtener la id del formulario y establecer el manejador de eventos

            $("form#origenbien-general-form").on("beforeSubmit", function(e) {

                var form = $(this);

                $.post(

                    form.attr("action")+"&submit=true",

                    form.serialize()

                )

                .done(function(result) {

                    form.parent().html(result.message);

                    $.pjax.reload({container:"#origenbien-general-grid"});

                });

                return false;

            }).on("submit", function(e){

                e.preventDefault();

                //e.stopImmediatePropagation();

                return false;

            });

        ');

        

    ?>

     <br>

     <div class="container-fluid">

         <div class="form-inline">

    <?php 

    $letras = array('A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E','F'=>'F','G'=>'G','H'=>'H','I'=>'I'); 

    $options = [

        'options' => [

             'B' => ['selected ' => true]

        ]

    ];

    ?>

    <?= $form->field($model, 'codigoLetra')->dropDownList($letras,$options,['style'=>'width:65px']) ?>

     -

     <div class="clearfix visible-sm-block"></div> 

     <?= $form->field($model, 'codigoNumero')->textInput(['style'=>'width:65px']) ?>

     </div>

         

    <?= $form->field($model, 

            'formasadquisicionbien_id')->dropDownList($model->listaFormasAdquisicionBien, 

            ['style'=>'width:300px',

             'prompt'=>'Seleccione uno de la lista',

             'onchange'=>'

                        $.get( "'.Url::toRoute('dependent-dropdown/letra').'", { id: $(this).val() } )

                            .done(function( data ) {

                                $( "#'.Html::getInputId($model, 'codigoLetra').'" ).html( data );

                            }

                        );

                        $.get( "'.Url::toRoute('dependent-dropdown/muestra').'", { id: $(this).val() } )

                            .done(function( data ) {

                                document.getElementById(\'a\').style.display = \'none\';

                                document.getElementById(\'b\').style.display = \'none\';

                                document.getElementById(\'c\').style.display = \'none\';

                                document.getElementById(\'d\').style.display = \'none\';

                                document.getElementById(\'e\').style.display = \'none\';

                                document.getElementById(\'f\').style.display = \'none\';

                                document.getElementById(\'g\').style.display = \'none\';

                                document.getElementById(\'h\').style.display = \'none\';

                                document.getElementById(\'i\').style.display = \'none\';

                                document.getElementById(data).style.display = \'block\';

                            }

                        );

                        $(\'#origenbien-general-form\').yiiActiveForm(\'submitForm\');

                    '

                ]);?>

     </div>

     <div id="a" style="display:none;">

         <?php //= $form->field($model_a, 'nombre_concurso')->textInput(['maxlength' => true]) ?>

         Activar model A

     </div>

     <div id="b" style="display:none;">

         <?= $form->field($model_b, 'numero_orden_compra')->textInput(['maxlength' => true]) ?>

         Activar model B

     </div>

     <div id="c" style="display:none;">

         Activar model C

     </div>

     <div class="form-group">

        <?= Html::submitButton($model->isNewRecord ? 'Continuar' : 'Actualizar', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

    </div>


    <?php ActiveForm::end(); ?>


</div>

Como menciono antes necesito que al cambiar en el dropdown el dato se registre pero la ventana modal se mantenga en activa pero con el conocimiento de cual es el id del registro guardado recientemente para poder seguir editando. Lo que sucede ahora es que el cambiar se manda a guardar el dato pero queda en el grid del index.

Muchas gracias de antemano a todos.

Ok, he decidido hacer esto de otra manera, sin usar ventana modal y sin enviar los datos al controlador solo hasta tener todos los datos ya rellenados en el form. Sin embargo, tengo un inconveniente y es que como explique antes tengo varios models esperando ser escogidos, y por lo tanto debo configurar los obejtos en el controlador que llame a cada una de esas tablas. Igualmente en la vista _form tengo todos los campos que pueden intervenir en el registro, solo que ocultos en div. Se debe desplegar en div que contenga los campos requeridos y los demas siguen ocultos. Ahora bien, sucede que las rules de los campos que no estan siendo editados al quedar vacios impiden abandonar la vista. Estoy tratando de usar los scenarios de los models pero no he podido hacer que funcione.

controller:


 public function actionCreate()

    {

        $model = new OrigenbienGeneral();

        $model_a = new OrigenbienA();

        $model_b = new OrigenbienB();

        $model_c = new OrigenbienC();

        $model_d = new OrigenbienD();


        if ($model->load(Yii::$app->request->post())) {

            $model->codigo = $model->codigoLetra.$model->codigoNumero;

            if ($model->save()) {

                $model_b->load(Yii::$app->request->post());

                switch ($model->formasadquisicionbien_id) {

                    case 1:

                        $model_b->origenbien_general_id = $model->id;

                        $model_b->save();

                        break;

                    case 2:

                        //$model_g->save();

                        break;

                    case 3:

                        $model_d->save();

                        break;

                    case 4:

                        //$model_e->save();

                        break;

                    case 5:

                        //$model_h->save();

                        break;

                    case 6:

                        //$model_f->save();

                        break;

                    case 7:

                        $model_c->save();

                        break;

                    case 8:

                        $model_a->save();

                        break;

                    case 9:

                        $model_a->save();

                        break;

                    case 10:

                        //$model_i->save();

                        break;

                }

                Yii::$app->response->format = Response::FORMAT_JSON;

                return $this->redirect(['view', 'id' => $model->id]);

            }

        } else {

            return $this->render('create', [

                'model' => $model,

                'model_a' => $model_a,

                'model_b' => $model_b,

                'model_c' => $model_c,

                'model_d' => $model_d,

            ]);

        }

    }


<?php


use yii\helpers\Html;

use yii\widgets\ActiveForm;


use yii\helpers\Url;

use yii\jui\DatePicker;




/* @var $this yii\web\View */

/* @var $model frontend\models\OrigenbienGeneral */

/* @var $form yii\widgets\ActiveForm */

?>


<div class="origenbien-general-form">

    

    <?php $form = ActiveForm::begin([

        'id' => 'origenbien-general-form'

     ]); ?>


     <br>

     <div class="container-fluid">

         <div class="form-inline">

    <?php 

    $letras = array('A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E','F'=>'F','G'=>'G','H'=>'H','I'=>'I'); 

    $options = [

        'options' => [

             'B' => ['selected ' => true]

        ]

    ];

    ?>

    <?= $form->field($model, 'codigoLetra')->dropDownList($letras,$options,['style'=>'width:65px']) ?>

     -

     <div class="clearfix visible-sm-block"></div> 

     <?= $form->field($model, 'codigoNumero')->textInput(['style'=>'width:65px']) ?>

     </div>

         

    <?= $form->field($model, 

            'formasadquisicionbien_id')->dropDownList($model->listaFormasAdquisicionBien, 

            ['style'=>'width:300px',

             'prompt'=>'Seleccione uno de la lista',

             'onchange'=>'

                        $.get( "'.Url::toRoute('dependent-dropdown/letra').'", { id: $(this).val() } )

                            .done(function( data ) {

                                $( "#'.Html::getInputId($model, 'codigoLetra').'" ).html( data );

                            }

                        );

                        $.get( "'.Url::toRoute('dependent-dropdown/muestra').'", { id: $(this).val() } )

                            .done(function( data ) {

                                document.getElementById(\'a\').style.display = \'none\';

                                document.getElementById(\'b\').style.display = \'none\';

                                document.getElementById(\'c\').style.display = \'none\';

                                document.getElementById(\'d\').style.display = \'none\';

                                document.getElementById(\'e\').style.display = \'none\';

                                document.getElementById(\'f\').style.display = \'none\';

                                document.getElementById(\'g\').style.display = \'none\';

                                document.getElementById(\'h\').style.display = \'none\';

                                document.getElementById(\'i\').style.display = \'none\';

                                document.getElementById(data).style.display = \'block\';

                            }

                        );

                    '

                ]);?>

     </div>

     <div id="a" style="display:none;">

         <?= $form->field($model_a, 'nombre_concurso')->textInput(['maxlength' => true]) ?>

     </div>

     <div id="b" style="display:none;">

        <?= $form->field($model_b, 'proveedores_id')->dropDownList($model_b->listaProveedores, ['prompt' => 'Seleccione Uno' ]);?>

        <?= $form->field($model_b, 'numero_orden_compra')->textInput(['maxlength' => true]) ?>

        <?php echo $form->field($model_b,'fecha_orden_compra')->

            widget(DatePicker::className(),[

                'dateFormat' => 'yyyy-MM-dd',

                'clientOptions' => [

                    'yearRange' => '-115:+0',

                    'changeYear' => true

                ],

                'options' => ['class' => 'form-control', 'style' => 'width:25%']

            ]) ?>


        <?= $form->field($model_b, 'numero_nota_entrega')->textInput(['maxlength' => true]) ?>


        <?php echo $form->field($model_b,'fecha_nota_entrega')->

            widget(DatePicker::className(),[

                'dateFormat' => 'yyyy-MM-dd',

                'clientOptions' => [

                    'yearRange' => '-115:+0',

                    'changeYear' => true

                ],

                'options' => ['class' => 'form-control', 'style' => 'width:25%']

            ]) ?>


        <?= $form->field($model_b, 'numero_factura')->textInput(['maxlength' => true]) ?>


        <?php echo $form->field($model_b,'fecha_factura')->

            widget(DatePicker::className(),[

                'dateFormat' => 'yyyy-MM-dd',

                'clientOptions' => [

                    'yearRange' => '-115:+0',

                    'changeYear' => true

                ],

                'options' => ['class' => 'form-control', 'style' => 'width:25%']

            ]) ?>

         Activar model B

     </div>


     <div class="form-group">

        <?= Html::submitButton($model->isNewRecord ? 'Continuar' : 'Actualizar', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

    </div>


    <?php ActiveForm::end(); ?>


</div>

Model a:


public function rules()

    {

        return [

            [['origenbien_general_id', 'nombre_concurso'], 'required', 'on' => 'register'],

            [['origenbien_general_id', 'proveedores_id'], 'integer'],

            [['fecha_concurso', 'fecha_contrato', 'fecha_nota_entrega', 'fecha_factura'], 'safe'],

            [['nombre_concurso'], 'string', 'max' => 255],

            [['numero_concurso', 'numero_contrato', 'numero_nota_entrega', 'numero_factura'], 'string', 'max' => 30]

        ];

    }

Model b:


public function rules()

    {

        return [

            [['origenbien_general_id', 'numero_orden_compra'], 'required', 'on' => 'register'],

            [['origenbien_general_id', 'proveedores_id'], 'integer'],

            [['fecha_orden_compra', 'fecha_nota_entrega', 'fecha_factura'], 'safe'],

            [['numero_orden_compra', 'numero_nota_entrega', 'numero_factura'], 'string', 'max' => 30]

        ];

    }

Necesito saber si con los scenarios se puede hacer lo que pretendo, o que otro metodo me recomiendan…