yii2 Kartik-V Typeahead Basic автозаполнение имени, но сохранение целочисленного значения

Обновления были сделаны ниже

Я пытаюсь использовать виджет Kartik-V Typeahead Basic с Yii2 Framework.

Приведенный ниже код работает для отображения необходимых данных, пользователь может выполнять поиск по названию университета, и оно появляется в списке автозаполнения.

Проблема в том, что модели нужен идентификатор университета, а не имя. Таким образом, правила таковы, что это поле может хранить только целое число и возвращает ошибку проверки, как только вы выберете один из результатов ввода.

<?= $form->field($model, 'university_id')->widget(TypeaheadBasic::classname(), [
    'data' => ArrayHelper::map(University::find()->all(),'id','uni_name'),
    'pluginOptions' => ['highlight' => true],
    'options' => ['placeholder' => 'Filter as you type ...'],
]); ?>

Я надеюсь, что кто-то может помочь мне понять, есть ли настройка, которую нужно изменить, поэтому при сохранении удобные для пользователя данные «uni_name» заменяются обратно на uni «id».

ОБНОВЛЕНИЕ: у меня частично работает код благодаря "Insane Skull".

Новый код:

<?= $form->field($model, 'name')->widget(TypeaheadBasic::classname(), [
    'data' => ArrayHelper::map(University::find()->all(),'id','uni_name'),
    'pluginOptions' => ['highlight' => true],
    'options' => ['placeholder' => 'Filter as you type ...', 'id' => 'testID'],
    'pluginEvents' => [
        'typeahead:select' => new yii\web\JsExpression("function(event, ui) { $('#testing123').val(ui.item.id); }"),
    ]
]); ?>

<?= Html::activeHiddenInput($model, 'university_id', array ('id' => 'testing123'))?>

Теперь я, к сожалению, получаю сообщение об ошибке: Метод yii\web\JsExpression::__toString() должен возвращать строковое значение


person william    schedule 18.09.2015    source источник
comment
Вам лучше использовать это: yiiframework.com/doc-2.0/yii-jui -autocomplete.html   -  person Insane Skull    schedule 18.09.2015


Ответы (2)


Я бы предпочел использовать Select2 вместо Typeahead, вы в основном пытаетесь реализовать функциональность, которая уже существует на Select2, но использует Typeahead.

<?= $form->field($model, 'university_id')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(University::find()->all(),'id','uni_name'),
    'options' => ['placeholder' => 'Filter as you type ...'],
]); ?>
person marche    schedule 18.09.2015
comment
Спасибо, Марш, я не знал, что в Select2 есть загрузка ajax. мой набор данных будет большим, и я не хотел, чтобы они все появлялись сразу! Это работает - person william; 19.09.2015

Вы можете использовать activeHiddenInput() для этой цели.

Создайте одну общедоступную переменную в модели, скажем, name.

Затем:

<?= $form->field($model, 'name')->widget(TypeaheadBasic::classname(), [
'data' => ArrayHelper::map(University::find()->all(),'id','uni_name'),
'pluginOptions' => ['highlight' => true],
'options' => ['placeholder' => 'Filter as you type ...'],
'select' => new yii\web\JsExpression("function( event, ui ) {
                        $('#id_of_hiddenField').val(ui.item.id);
                    }")
]); ?>
<?= Html::activeHiddenInput($model, 'university_id')?>

И в контроллере получите значение activeHiddenField.

person Insane Skull    schedule 18.09.2015
comment
Привет, спасибо за помощь, к сожалению, когда я добавляю этот код, страница возвращает ошибку: Setting unknown property: kartik\typeahead\TypeaheadBasic::select Есть ли что-то еще, что нужно использовать по-другому? Скрытое поле работает, только не включенный оператор select - person william; 18.09.2015
comment
Спасибо за рекомендации. Я немного изменил код, вы должны увидеть обновление выше, знаете ли вы, что вызывает новую ошибку? - person william; 18.09.2015