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.