Yii Framework Forum

Widget Kartik-Select2, no se llena con mas de 165 items


(Jose 2rcv) #1

Hola a todos
Tengo un problema con el widget de Kartik Select2, pues note que en ocasiones me faltaban algunos registros en la lista.
El Select lo lleno en dependencia de lo que se seleccione en otro select

Despues de algunas pruebas, vi que en el caso de pocos registros (menos de 100) lo hace bien, pero en el caso de uno que debe listar 199, solo me lista 165
A que se puede deber esto?
Existe alguna propiedad del select2 que limite la cantidad de registros a mostrar?

Si no hay posibilidad de solucion a este problema, que otro widget me recomendarian?


(pablo1251) #2

Por casualidad no estas usando también la extension DepDrop?


(Jose 2rcv) #3

Muchas gracias por tu respuesta
Pues estoy tratando de usar DepDrop, pero parece que no entiendo bien los parametros que tengo que poner, ya que no me carga nada, el DepDrop se queda en estado bloqueado.
He visto algunos ejemplos en varios foros, pero sigo sin exito. Estas son mis dudas:

En algunos casos usan el parmatro ‘data’ y en otros no. Es necesario este?
Si no lo pongo, pone loading sin cargar nada y se queda bloqueado, y si lo pongo se llena con todos los registros sin filtrarlos

En el parámetro ‘depends’, que es lo que va? el id del css del control? o que?

Podrias ponerme un ejemplo detallandome qu es lo que se pone en estros parámetros para que me funcione bien el depdrop?


(pablo1251) #4

Mostrame tu codigo de tu select2 y depdrop para que pueda verlo. No entiendo a que te referis con que se llene todo sin filtrarlo.
En el parametro depends tenes que poner el ID del select2 del cual depende el depdrop.

Este es un codigo que tengo funcionando.

<div class="row">
    <div class="col-md-4">
        <?= 
            $form->field($model, 'id_pais')->label('Pais')->widget(Select2::classname(), 
                [
                'data' => ArrayHelper::map($getPaises,'id_pais','descripcion'),
                'language' => 'es', 
                'theme' => Select2::THEME_BOOTSTRAP,
                'options' => ['placeholder' => 'Seleccione un Pais'],
                'pluginOptions' => [
                    'allowClear' => true
                ],
            ]);
        ?>
    </div>
</div>

<div class="row">
    <div class="col-md-4">
        <?=                 
            $form->field($model, 'id_provincia')->label('Provincia')->widget(DepDrop::classname(), [
                'type' => DepDrop::TYPE_SELECT2,                                   
                'select2Options'=>['pluginOptions'=>['allowClear'=>false]],
                'pluginOptions'=>[
                    'depends'=>['ciudades-id_pais'],
                    'initialize' => true,
                    'url' => Url::to(['child-pais']),
                    'params'=> ['input-type-1'],
                    'loadingText' => 'Cargando Provincias...',
                    'placeholder' => 'Seleccione una provincia'
                ],
            ]);
        ?>
    </div>
</div>
<?php echo Html::hiddenInput('input-type-1',$model->id_provincia,['id'=>'input-type-1']); ?>

(Jose 2rcv) #5

A lo que me referia con:

se llene todo sin filtrarlo

Es que si uso el parámetro ‘data’ para cargar los clientes, carga la tabla completa de clientes, en lugar de filtrarla por el municipio seleccionado.

Respecto al codigo que me pones de ejemplo, me guie por el y aun sin exito
Quizas el problema lo tenga en la accion que me debe traer los datos, este es mi codigo

<?= $form->field($model, 'IDMUNIC')->dropDownList(
ArrayHelper::map(\backend\models\NomMunicipios::find()->orderBy('Municipio')->all(), 'IdMunic', 'Municipio'),
['prompt' => 'Seleccione el Municipio ...',]
);
?>
<?=
 $form->field($model, 'IDCLIENTE')->widget(DepDrop::classname(), [
//        'data'=>ArrayHelper::map(Clientes::find()->orderBy('NombreCliente')->all(), 'IdCliente', 'NombreCliente', 'mUNIC.Municipio'),
    'type' => DepDrop::TYPE_SELECT2,
    'options'=>['IdCliente'=>'NombreCliente'],
    'pluginOptions'=>[
        'initialize' => true,
        'depends'=>['contrato-idmunic'],
        'placeholder'=>'Seleccione un cliente ...',
        'url'=>Url::to(['getclientes']),
        'loadingText' => 'Cargando clientes...',
    ]
    ]);
?>

Esta es la accion ‘getclientes’

public function actionGetclientes() {
$out = [];
if (isset($_POST['depdrop_parents'])) {
    $parents = $_POST['depdrop_parents'];
    if ($parents != null) {
        $id = $parents[0];
//                $out = Contrato::Listaclientes($id);
        $out = Clientes::find()->where('IDMUNIC = :id',[':id'=>$id])->all();
        echo Json::encode(['output'=>$out, 'selected'=>'']);
        return;
    }
}
echo Json::encode(['output'=>'', 'selected'=>'']);

echo var_dump($out);
}

Tendré algo mal aqui?
Puede ser que no me este creando bien el Json, pues el DepDrop se queda en cargando clientes … y no carga ninguno.


(pablo1251) #6

1- El parámetro data en el depdrop esta demas en ese caso, porque los clientes los va a obtener de tu funcion getclientes cuando selecciones un municipio.
2- En el depdrop no le estas pasando ningun parametro a la funcion. En tu funcion getclientes estas usando un id que no tenes.
Deberia ser algo asi mas o menos, en la funcion yo le puse idcliente y nombre pero reemplazalos por los que correspondan dependiendo de los nombres de tu tabla.

    <?= $form->field($model, 'IDMUNIC')->dropDownList(
    ArrayHelper::map(\backend\models\NomMunicipios::find()->orderBy('Municipio')->all(), 'IdMunic', 'Municipio'),
    ['prompt' => 'Seleccione el Municipio ...',]
    );
?>
<?=
 $form->field($model, 'IDCLIENTE')->widget(DepDrop::classname(), [
    'type' => DepDrop::TYPE_SELECT2,
    'options'=>['IdCliente'=>'NombreCliente'],
    'pluginOptions'=>[
        'initialize' => true,
        'depends'=>['contrato-idmunic'],
        'placeholder'=>'Seleccione un cliente ...',
        'params'=> ['input-type-1'],
        'url'=>Url::to(['get-clientes']),
        'loadingText' => 'Cargando clientes...',
    ]
    ]);
?>

<?php echo Html::hiddenInput('input-type-1',$model->idmunic,['id'=>'input-type-1']); ?>

public function actionGetClientes() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $id = end($_POST['depdrop_parents']);
        if (!empty($_POST['depdrop_params'])) {
            $params = $_POST['depdrop_params'];
            $param1 = $params[0]; // input-type-1
        }
        $list = Clientes::find()->andWhere(['idmunic'=>$id])->asArray()->all();
        $selected  = null;
        if ($id != null && count($list) > 0) {
            $selected = '';
            foreach ($list as $i => $cliente) {
                $out[] = ['id' => $cliente['idcliente'], 'name' => $cliente['nombre']];
                if (!empty($param1)) {
                    $selected = $param1;
                }
            }
            return Json::encode(['output' => $out, 'selected'=>$selected]);               
        }
    }
    echo Json::encode(['output' => '', 'selected'=>'']);
}

(Jose 2rcv) #7

Muchas gracias por la ayuda
Ya me funciona


(pablo1251) #8

Genial, de nada!.


(Jose 2rcv) #9

Pues para adicionar un nuevo registro no hay problemas, funciona bien
El problema lo tengo ahora cuando voy a modificar, que me muestra el depdrop vacio, en lugar del cliente que le corresponde
Me deja seleccionarlo de los correspondientes al municipio, pero inicialmente me lo muestra vacio y no debe ser.