Hola comunidad, estoy intentando utilizar populate select2, según esta dirección url:
[html]“https://mrphp.com.au/blog/populate-select2-from-another-yii2/’]populate Select2”[/html]
cuando selecciono un elemento en el primer select2, el segundo select2 lo muestra vacío, sin ningún elemento, pero al presionar F12, entonces si veo que los lee, ya que trae todos los elementos correspondientes a ese elemento del primer select2, aqui pongo ,los códigos necesarios:
para ello tengo tres tablas:
- salidas (campos necesarios):
Idn int autoincremental llave primaria
Codde int //para los elementos del 1er select2
CodOp int //para los elementos del segundo select2
- destinos
CodOp int autoincremental llave principal, relacionada con CodOp de salidas
Descripcion varchar 100
- destinos_code
CodOp int autoincremental (llave principal) relacionada con CodOp de destinos
Codde int relacionada con Codde de salidas y de destinos
Descripcion varchar 100
en el controlador de destinos:
public function actionPopulateDestinosCode($id) {
Yii::$app->response->format = Response::FORMAT_JSON;
$destinoCodes = DestinosCode::find()->andWhere(['Codde' => $id])->all();
$data = [['id' => '', 'text' => '']];
foreach ($destinoCodes as $destinoCode) {
$data[] = ['id' => $destinoCode->CodOp, 'text' => $destinoCode->Descripcion];
}
return ['data' => $data];
}
en el modelo:
//
...........
[['Codde'], 'exist', 'skipOnError' => true, 'targetClass' => Destinos::className(), 'targetAttribute' => ['Codde' => 'Codde']],
[['CodOp'], 'exist', 'skipOnError' => true, 'targetClass' => DestinosCode::className(), 'targetAttribute' => ['CodOp' => 'CodOp']],
.......
public function getCodOp()
{
return $this->hasOne(DestinosCode::className(), ['CodOp' => 'CodOp']);
}
public function getCodde()
{
return $this->hasOne(Destinos::className(), ['Codde' => 'Codde']);
}
en la vista de salidas:
primer select2
<?=
$form->field($model, 'Codde')->widget(Select2::className(), [
'model' => $model,
'attribute' => 'Codde',
'data' => ArrayHelper::map(app\models\Destinos::find()->all(), 'Codde', 'Descripcion'), //ok
'options' => $select2Options,
'pluginEvents' => [
'select2:select' => 'function(e) { populateDestinosCode(e.params.data.id); }',
],
]);
?>
Segundo select2:
<?=
$form->field($model, 'CodOp')->widget(Select2::className(), [
'model' => $model,
'attribute' => 'CodOp', //con client_code o turcad
'data' => ArrayHelper::map(app\models\DestinosCode::find()->andWhere(['Codde' => $model->Idn])->all(), 'CodOp', 'Descripcion'), //ok
'options' => $select2Options,
]);
?>
script dfe la vista:
<?php ob_start(); // output buffer the javascript to register later ?>
<script>
function populateDestinosCode(Codde) {
var url = '<?= Url::to(['destinos/populate-destinos-code', 'id' => '-id-']) ?>';
var $select = $('#order-CodOp');
$select.find('option').remove().end();
$.ajax({
url: url.replace('-id-', Codde),
success: function(data) {
var select2Options = <?= Json::encode($select2Options) ?>;
select2Options.data = data.data;
$select.select2(select2Options);
$select.val(data.selected).trigger('change');
}
});
}
</script>
<?php $this->registerJs(str_replace(['<script>', '</script>'], '', ob_get_clean()), View::POS_END); ?>
Necesito resolver esto, ya que es una via para obtener dos combos dependientes mediante select2
Gracias por adelantado
saludos