Ответ 1
Ну, я добавил фрагменты кода в свою тестовую среду yii2, чтобы проверить, что не так. Таким образом, есть некоторые проблемы с вашим кодом:
[
'onChange' =>
'JS: var value = (this.value);
if(value == "S"){$(#libraryborrowtransaction-name).
autoComplete({source: '. $s_data.');}
if(value == "E"){$(#libraryborrowtransaction-name).
autoComplete({source: '. $e_data.');}
']
Прежде всего, я заметил, что yii применяют некоторые escape-символы для символов кавычек для ваших "S" и "E", а ваш код в браузере выглядит как "S"
.
Далее, плагин jui autocomplete добавляет свойство прототипу jquery с именем "autocomplete"
, но не "autocomplete"
. А поскольку js чувствителен к регистру, эти два имени выглядят по-разному.
Итак, мое решение состояло в том, чтобы переместить все js из свойства onchange
для разделения js script, как показано ниже (для целей тестирования вы можете добавить его прямо в свой файл просмотра yii, где вы используете код, указанный в вашем вопросе)
<script>
function holderTypeChangeHandler(ev) {
var value = (this.value);
if(value == 'S'){
$('#libraryborrowtransaction-name').autocomplete({source: ' . $s_data . '});
}
if(value == 'E'){
$('#libraryborrowtransaction-name').autocomplete({source: ' . $e_data . '});
}
}
window.onload = function(){
$('#libraryborrowtransaction-lbt_holder_type').on('change', holderTypeChangeHandler);
};
</script>
И вставьте имя этого нового обработчика событий в свойство dropdownList onchange следующим образом:
['onChange' => 'holderTypeChangeHandler']
ОБНОВЛЕНИЕ: ---------------------
Так как автозаполнение Yii2 на основе виджета автозаполнения JQuery UI и автозаполнения Yii2 clientOptions
содержит параметры для виджета автозаполнения JUI, тогда мы можем обратиться к JUI API для объяснения опции source
. Как вы можете видеть, эта опция может быть строкой (в этом случае она используется как URI для данных JSON), функцией или массивом js данных или массивом объектов js.
В вашем вопросе вы используете \yii\db\Query
для получения некоторых данных из db с помощью method all()
, который возвращает массив данные. Итак, вам нужно преобразовать массив данных, который вы получаете с помощью \yii\db\Query->all
в массив объектов js. Чтобы сделать это, используйте php json functions, особенно для вашего случая вам нужно использовать функцию json_encode()
:
// Let say this is a result of your query to db with use of `\yii\db\Query->...->all();`
$some_array = [
[
"value" => "Val 1",
"label" => "Label 1",
"id" => 1
],
[
"value" => "Val 2",
"label" => "Label 2",
"id" => 2
]
]
// Just convert it to json string
$s_data = json_encode($some_array);
...
// When concat this json string as a value of source attribute for Yii Autocomplete
$('#libraryborrowtransaction-name').autocomplete({source: <?= $s_data ?> });
То же самое, если для вашего $e_data
. Просто обратите внимание, вы получаете свои данные из db с помощью PHP, но используете его с JS, поэтому php-массив необходимо преобразовать в массив строк js-представления объектов, и это преобразование можно сделать с помощью json_encode
.