Yii. Автокомплит CJuiAutocomplete
Однажды в проекте понадобилось сделать поля с автокомплитом. Далеко идти не пришлось, в Yii есть встроенные возможности в виде CAutocomplete. Однако читаем "Note: CAutoComplete is deprecated since Yii 1.1.3. Consider using CJuiAutoComplete.". Поэтому выбор очевиден.
Итак, имеем два поля с автокомлитом: город и адрес. При этом поиск адреса производится только в данном городе, т.е. нам необходимо передать в автокомлит дополнительный параметр.
Для первого автокомлита "Город" используем простой вызов CJuiAutocomplete.
Итак, имеем два поля с автокомлитом: город и адрес. При этом поиск адреса производится только в данном городе, т.е. нам необходимо передать в автокомлит дополнительный параметр.
Для первого автокомлита "Город" используем простой вызов CJuiAutocomplete.
Представление:
<?= CHtml::activeHiddenField($city, 'id');?> <? $this->widget('zii.widgets.jui.CJuiAutoComplete', array( 'model'=>$city, // модель 'attribute'=>'title', // атрибут модели // "источник" данных для выборки 'source' =>Yii::app()->createUrl('city/autocomplete'), // параметры, подробнее можно посмотреть на сайте // http://jqueryui.com/demos/autocomplete/ 'options'=>array( 'minLength'=>'2', 'showAnim'=>'fold', 'select' =>'js: function(event, ui) { this.value = ui.item.value; // записываем полученный id в скрытое поле $("#City_id").val(ui.item.id); return false; }', ), 'htmlOptions' => array( 'maxlength'=>50, ), )); ?>
Контроллер City:
public function actionAutocomplete() { $term = Yii::app()->getRequest()->getParam('term'); if(Yii::app()->request->isAjaxRequest && $term) { $cities = City::model()->findAll(array('condition'=>"title LIKE '%$term%'")); $result = array(); foreach($cities as $city) { $label = $city['title']; $result[] = array('id'=>$city['id'], 'label'=>$label, 'value'=>$label); } echo CJSON::encode($result); Yii::app()->end(); } }"Адрес" будет иметь следующий код.
Представление:
<? $this->widget('zii.widgets.jui.CJuiAutoComplete', array( 'model'=> $obj, 'attribute'=>'id', 'source' =>'js:function(request, response) { $.getJSON("'.$this->createUrl('obj/autocomplete').'", { term: request.term.split(/,s*/).pop(), city_id: $("#City_id").val() }, response); }', 'options'=>array( 'minLength'=>'2', 'showAnim'=>'fold', 'select' =>'js: function(event, ui) { this.value = ui.item.id; $("#Obj_id").val(ui.item.value); return false; }', ), 'htmlOptions' => array( 'maxlength'=>50, ), )); ?>Особое внимание следует обратить на параметр source. В качестве источника данных для выборки здесь используется функция js, а именно JSON запрос, в качестве дополнительного параметра которого выставлен id города из скрытого поля. А уже в контроллере мы принимаем этот параметр и добавляем в условие поиска.
Контроллер Obj:
public function actionAutocomplete() { $term = Yii::app()->getRequest()->getParam('term'); $city_id = Yii::app()->getRequest()->getParam('city_id'); if(Yii::app()->request->isAjaxRequest && $term && $city_id) { $objects = Obj::model()->findAll(array('condition'=>"address LIKE '%$term%' AND city_id = $city_id")); $result = array(); foreach($objects as $obj) { $label = $obj['title'] . ', ' . $obj['address']; $result[] = array('id'=>$obj['id'], 'label'=>$label, 'value'=>$label); } echo CJSON::encode($result); Yii::app()->end(); } }Вот и все хитрости :)
Не моглм бы расписать в каких контроллерах и представлениях что находится? Не очень понятно 2 раза actionAutocomplete, какой в каком контроллере.
ОтветитьУдалитьпоправила для ясности )
УдалитьПредставление одно, но каждый автокомплит уходит на свой экшн:
первый идет на город - сity/autocomplete (смотрим параметр source)
второй идет на объект - obj/autocomplete (все в том же параметре source)
Спасибо, отличный пример, всё работает. Спасибо Вам!
ОтветитьУдалитьрада помочь )
УдалитьТы крута, подруга! Спасибо за отличный пост и отличный блог!
ОтветитьУдалитьУмна ещё и красотка, рад за тебя :)
спасибо ))
УдалитьСпасибо! В закладки!)
ОтветитьУдалитьчто значит findAll(array('condition'=>"title LIKE '%$term%'"));
ОтветитьУдалитьМаксиму: это значит что "надо выбрать все названия, где присутствует строка $term - не важно, в начале она, в середине или в конце".
ОтветитьУдалитьчто такое getParam('term') откуда они приходят?
ОтветитьУдалитьВ методе getJSON вторым параметром мы передаем нужные нам данные, в том числе term
УдалитьВ упор не вижу, где у Вас метод getJSON?
УдалитьCtrl+F попробуйте, помогает ;)
УдалитьЭтот комментарий был удален автором.
УдалитьВы не могли бы подправить этот скрипт под YII2. в YII2 -он не работает...
ОтветитьУдалитьС Yii2 не работала и в ближайшее время не планирую. Сорри )
Удалить