Yii Framework Forum: [solved]usando populate select2 desde otro select2 - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[solved]usando populate select2 desde otro select2 no muestra los elementos del segundo select Rate Topic: -----

#1 User is offline   rafaelrs5648 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 250
  • Joined: 02-October 13
  • Location:Cuba

Posted 21 May 2018 - 02:19 PM

Hola comunidad, estoy intentando utilizar populate select2, según esta dirección url:
"https://mrphp.com.au/blog/populate-select2-from-another-yii2/']populate Select2"


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:
1. salidas (campos necesarios):
Idn int autoincremental llave primaria
Codde int //para los elementos del 1er select2
CodOp int //para los elementos del segundo select2
2. destinos
CodOp int autoincremental llave principal, relacionada con CodOp de salidas
Descripcion varchar 100
3. 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
0

#2 User is offline   rafaelrs5648 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 250
  • Joined: 02-October 13
  • Location:Cuba

Posted 24 May 2018 - 07:52 AM

Disculpen, me equivoque en los campos de la segunda tabla, que puse anteriormente, la tabla en realidad es:
2. destinos
Codde int autoincremental llave principal, relacionada con Codde de salidas
Descripcion varchar 100
Voy a mostrar algunas imágenes necesarias para su mejor comprensión:
https://imgur.com/wzzStaz
Este es el primer select2, donde se muestran los destinos:Este es el segundo combo que se muestra vacio donde debe mostrar los elementos de la tabla destinos_code correspondientes al elemento seleccionado en el primer select2:
https://imgur.com/JPZQhj1
Este es la imagen que muestra al debuguear con F12, donde si se ven los elemento que debe mostrar en el segundo select2, o sea, si los lee:
https://imgur.com/UHW41Ep
Por favor este es la vía que vi mas clara para hacer combos dependientes, si algún forista con mas experiencia en yii2 tuviese otra vía mejor también me la puede poner, pero sobre todo con select2.
Saludos gracias
0

#3 User is offline   rafaelrs5648 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 250
  • Joined: 02-October 13
  • Location:Cuba

Posted 26 May 2018 - 09:48 AM

Buenos días a todos, el problema se resolvió, para ello cambie los nombres a los campos de las tablas (aunque ese no fue el motivo, si no a errores de código), ahora quedo así, por si ha alguien le interesa este procedimiento lo puede usar es muy bueno para usar combos dependientes con select2:
las tablas ahora son:
1. salidas (campos necesarios):
Idn int autoincremental llave primaria
destino_id int //para los elementos del 1er select2
destino_code_id int //para los elementos del segundo select2
2. destinos
Codde int autoincremental llave principal, relacionada con destino_id de salidas
Descripcion varchar 100
3. destinos_code
CodOp int autoincremental (llave principal)
destino_id int relacionada con destino_code_id de salidas y con Codde de destinos
Descripcion varchar 100
En el controllador de destinos:
public function actionPopulateDestinosCode($id) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        $destinosCodes = \app\models\DestinosCode::find()->andWhere(['destino_id' => $id])->all();
        $data = [['id' => '', 'text' => '']];
        foreach ($destinosCodes as $destinosCode) {
            $data[] = ['id' => $destinosCode->CodOp, 'text' => $destinosCode->Descripcion];
        }
        return ['data' => $data];
    }



en la vista de salidas (form)
Para el primer select2 de con la tabla destinos:
<?=
                $form->field($model, 'destino_id')->widget(Select2::className(), [
                    'model' => $model,
                    'attribute' => 'destino_id',
                    'data' => ArrayHelper::map(app\models\Destinos::find()->all(), 'Codde', 'Descripcion'),
                    'options' => $select2Options,
                    'pluginEvents' => [
                        'select2:select' => 'function(e) { populateDestinosCode(e.params.data.id); }',
                    ],
                ]);
                ?>

Para el segundo select2 de con la tabla destinos_code:

<?=
                $form->field($model, 'destino_code_id')->widget(Select2::className(), [
                    'model' => $model,
                    'attribute' => 'destino_code_id', //con client_code o firmantes
                    'data' => ArrayHelper::map(app\models\DestinosCode::find()->andWhere(['destino_id' => $model->Idn])->all(), 'CodOp', 'Descripcion'),
                    'options' => $select2Options,
                ]);
                ?>


este es el script necesario en la vista:
<script>
       function populateDestinosCode(destino_id) {
            var url = '<?= Url::to(['destinos/populate-destinos-code', 'id' => '-id-']) ?>';
            var $select = $('#datossal-destino_code_id');
            $select.find('option').remove().end();
            $.ajax({
                url: url.replace('-id-', destino_id),
                success: function(data) {
                    var select2Options = <?= Json::encode($select2Options) ?>;
                    select2Options.data = data.data;
                    $select.select2(select2Options);
                    $select.val(data.selected).trigger('change');
                }
            });
        }
        
    </script>


antes del script lleva esto para inicializar el procedimiento:

<?php ob_start(); // output buffer the javascript to register later 



al final del script, lleva esto para finalizarlo:

<?php $this->registerJs(str_replace(['<script>', '</script>'], '', ob_get_clean()), View::POS_END); ?>


Esta es la variable utilizada en la vista:
$select2Options = [
    'multiple' => false,
    'theme' => 'krajee',
    'placeholder' => 'Modo de autocompletar',
    'language' => 'en-US',
    'width' => '100%',
];

Gracias por las visitas, ojala a alguien mas les sirva, realmente en la misma forma utilice mas de una vez el procedimiento con otros combos dependientes, adicionandolo al script
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users