Автодополнение в yii2

В Yii2 я хочу, чтобы одно из моих полей ввода было автозаполненным, когда пользователь начинает печатать. Ниже приведен мой код, который использует Jui Autocomplete.

 <?php
    $items= ArrayHelper::map(Company::find()->all(), 'c_id', 'name');
    echo AutoComplete::widget([
    'model' => $model,
    'attribute' => 'company',
    'clientOptions' => [
    'source' => $items,
     ],
    ]);?>

Это не работает. Когда я напечатал свой массив, я получил как

 Array ( [1] => abc [2] => xyz [4] => pqr )

У меня это работает, когда я вручную устанавливаю как

 $items=['abc','xyz','pqr'];

Причина может быть в том, что мои c_id's не заказаны? Но я хочу, чтобы значение c_id было отправлено! Есть идеи, как это исправить?


person Dency G B    schedule 22.04.2014    source источник
comment
хороший вопрос, кажется, вы не можете   -  person Alex    schedule 23.04.2014
comment
@Алекс Спасибо! См. мой обновленный вопрос stackoverflow.com/questions/23260636/   -  person Dency G B    schedule 24.04.2014


Ответы (3)


Это можно решить с помощью скрытого ввода поля. Надеюсь, это кому-нибудь поможет!

    <?php
    use yii\web\JsExpression;

    $data = Company::find()
    ->select(['name as value', 'name as  label','c_id as id'])
    ->asArray()
    ->all();

    echo AutoComplete::widget([
    'name' => 'Company',
    'id' => 'ddd',
    'clientOptions' => [
        'source' => $data,
        'autoFill'=>true,
        'minLength'=>'4',
        'select' => new JsExpression("function( event, ui ) {
                $('#user-company').val(ui.item.id);
            }")
        ],
     ]);
     ?>

    <?= Html::activeHiddenInput($model, 'company')?>
person Dency G B    schedule 24.04.2014
comment
Привет, Денси. Я попытался использовать виджет автозаполнения с вашим предложением. Он работает нормально, но при обновлении поле отображается пустым. я что-то пропустил? - person Joshi; 03.05.2015

Автозаполнение просто помогает вам заполнить поле необходимым значением. Если вам нужно отправить c_id, посмотрите на плагин dropdownList или Select2.

Проверьте этот виджет http://demos.krajee.com/widget-details/select2 yii2. для идей. Вот пример кода:

<?php
  use kartik\widgets\Select2;
  use app\models\Modelname;

  $model = new Modelname;

  $data = ['qwe1'=>'color1','key2'=>'color3']

  ?>

  <?= Html::beginForm() ?>

  <?= Select2::widget([
    'model' => $model,
    'attribute' => 'color',
    'data' => array_merge(["" => ""], $data),
    'options' => ['placeholder' => 'Select a state ...'],
    'pluginOptions' => [
      'allowClear' => true
    ],
  ]); ?>

  <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>

  <?= Html::endForm() ?>

Он также поддерживает загруженные данные ajax: http://demos.krajee.com/widget-details/select2#ajax

person user1852788    schedule 24.04.2014
comment
Спасибо за ваш ответ. Но я хотел бы сделать это без каких-либо расширений. Пожалуйста, смотрите мой обновленный вопрос. /вопросы/23260636/ - person Dency G B; 24.04.2014

Я хотел использовать автозаполнение Jui, чтобы, когда я нажимал или фокусировался на текстовом поле автозаполнения, он отображал параметры.

Я написал следующий код, и он, кажется, работает

 $floorOptionsArray = ['Basement', 'Ground Floor', 'First floor', 'Second floor', 'Third floor'];
//    $floorOptionsArray = array_combine($floorOptionsArray, $floorOptionsArray);

$model = new Customer();

echo $form->field($model, 'floor')
    ->widget(\yii\jui\AutoComplete::classname(), [
        'value' => (!empty($model->floor) ? $model->floor : ''),
        'clientOptions' => [
            'source' => $floorOptionsArray,
            'enabled' => true,
            'minLength' => 0
        ],

        'options' =>
            [
                'placeholder' => 'Floor',
                'class' => 'form-control autocomplete-input-bg-arrow ',

                'onclick' => "(function ( ) {
                      $( '#customer-floor' ).autocomplete( 'search', '' );
                                })();",

                'onfocus' => "(function ( ) {
                      $( '#customer-floor' ).autocomplete( 'search', '' );
                                })();",
            ],
    ])->label(true);
person Sudeep Talati    schedule 03.09.2018