Прошу помочь с yii2 и JUI AutoComplete

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
pav
Сообщения: 7
Зарегистрирован: 2015.01.21, 21:11

Прошу помочь с yii2 и JUI AutoComplete

Сообщение pav »

В web-мастерстве я новичок - изучаю как хобби. Убил 2 дня на настройку yii2 и JUI AutoComplete. Прошу помочь, указать на ошибку :oops:
Отдаю JSON, Приходят данные типа:

Код: Выделить всё

[{"id":"1","name":"101ННАС","blok_num":"4"},{"id":"2","name":"101ННБС","blok_num":"4"},{"id":"3","name":"103ННБС (ЭЦ)","blok_num":"4"},{"id":"4","name":"104ННАС","blok_num":"4"},{"id":"5","name":"104ННБС","blok_num":"4"},{"id":"6","name":"105ННАС","blok_num":"4"},{"id":"7","name":"201ННАС","blok_num":"4"},{"id":"8","name":"201ННБС","blok_num":"4"},{"id":"9","name":"203ННБС (ЭЦ)","blok_num":"4"},{"id":"10","name":"204ННАС","blok_num":"4"},{"id":"11","name":"204ННБС","blok_num":"4"},{"id":"12","name":"205ННАС","blok_num":"4"},{"id":"13","name":"301ННАС","blok_num":"4"},{"id":"14","name":"301ННБС","blok_num":"4"},{"id":"15","name":"303ННБС (ЭЦ)","blok_num":"4"},{"id":"16","name":"304ННАС","blok_num":"4"},{"id":"17","name":"304ННБС","blok_num":"4"},{"id":"18","name":"305ННАС","blok_num":"4"},{"id":"19","name":"71451ННБ","blok_num":"4"},{"id":"20","name":"81451ННБ","blok_num":"4"},{"id":"21","name":"91451ННБ","blok_num":"4"},
...]
Данные обрабатываются и JSON фильтруется trim'ом, но результат приходит в пустых "<li class="ui-widget-content ui-menu-divider"></li> "
В view:

Код: Выделить всё

echo AutoComplete::widget([
    //'id' => 'Sborka',
    'name'=>'name',
    //'model'=>$searchModel,
    //'attribute' => 'name',
    'options' => ['placeholder' => 'Поиск по АП...'],
    'clientOptions' => [
        'source' =>Url::to(['sborka/autocomplete']),
        'autoFill'=>true,
        'minLength'=>'0',
        '_renderItem'=>new JsExpression('function( ul, item ) {
        return $( "<li></li>" )
            .data( "item.autocomplete", item )
            .append( "<a><strong>" + item.name + "</strong> / " + item.blok_num + "</a>" + ui.item.id)
            .appendTo( ul );
        }'),
        'select' =>new JsExpression('function( event, ui ) {
            $( "#Sborka" ).val( ui.item.name + " / " + ui.item.blok_num );
            return false;}'),
        ],

]);
В js я совсем не соображаю, чувствую, в нем и дело.
pav
Сообщения: 7
Зарегистрирован: 2015.01.21, 21:11

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение pav »

Немного разобрался в какую сторону следует копать. Натравил View на контроллер с Yii1(пытаюсь с Yii1 перейти на Yii2) - все заработало! Готовятся данные абсолютно идентично, но в конце обрабатываются разными функциями:
В Yii1 CJSON на выходе:

Код: Выделить всё

[{"id":"11","label":" \u041f2-5121","href":"http:\/\/192.168.1.34\/tai2-engelec\/sborki\/view?id=1","sborka_id":"1","ap_blok":"4"},{"id":"4219","label":"01\/1-4\/6","href":"http:\/\/192.168.1.34\/tai2-engelec\/sborki\/view?id=105","sborka_id":"105","ap_blok":"3"},{"id":"4233","label":"03\/1-60\/3","href":"http:\/\/192.168.1.34\/tai2-engelec\/sborki\/view?id=105","sborka_id":"105","ap_blok":"3"}...
В Yii2 yii\helpers\Json

Код: Выделить всё

[{"id":"1","name":"101ННАС","blok_num":"4"},{"id":"2","name":"101ННБС","blok_num":"4"},{"id":"3","name":"103ННБС (ЭЦ)","blok_num":"4"},{"id":"4","name":"104ННАС","blok_num":"4"},{"id":"5","name":"104ННБС","blok_num":"4"},{"id":"6","name":"105ННАС","blok_num":"4"},{"id":"7","name":"201ННАС","blok_num":"4"},{"id":"8","name":"201ННБС","blok_num":"4"},{"id":"9","name":"203ННБС (ЭЦ)","blok_num":"4"},{"id":"10","name":"204ННАС","blok_num":"4"},{"id":"11","name":"204ННБС","blok_num":"4"},{"id":"12","name":"205ННАС","blok_num":"4"},{"id":"13","name":"301ННАС","blok_num":"4"},{"id":"14","name":"301ННБС","blok_num":"4"}... 
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение chesar »

pav писал(а): Отдаю JSON, Приходят данные типа:
где и куда отдаёте? От кого куда приходят? Какой вопрос, какая ошибка?
pav
Сообщения: 7
Зарегистрирован: 2015.01.21, 21:11

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение pav »

chesar писал(а): где и куда отдаёте? От кого куда приходят? Какой вопрос, какая ошибка?
Извиняюсь - плохо с мыслеизъявлением.
Есть контроллер на Yii2:

Код: Выделить всё

    
    public function actionAutocomplete()
    {    
        $term = Yii::$app->request->get('term');
        if ($term=='') $term='';
        $searchModel = new SborkaSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        
        $data = Sborka::find()
        ->select(['id as id', 'name as name', 'blok_num as blok_num'])
        ->where(['like', 'name', $term])
        ->asArray()
        ->all();
        //Yii::$app->response->format = Response::FORMAT_JSON;
        //echo json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);
        echo json_encode($data);
        
    }
Есть контроллер на Yii1:

Код: Выделить всё

    
    public function actionAutocomplete() {
        $term = Yii::app()->getRequest()->getParam('term');

        
        $aps = Ap::model()->findAll(array('condition'=>"ap_name LIKE '%$term%'", 'order'=>'ap_name asc'));
        $result = array();
        foreach($aps as $ap) {
        $label = $ap['ap_name'];
        $sborka_id = $ap['sborka_id'];
        $ap_blok = $ap->sborka->blok_num;
        $result[] = array('id'=>$ap['ap_id'], 'label'=>$label, 'href'=>Yii::app()->request->hostInfo.'/tai2-engelec/sborki/view?id='.$ap['sborka_id'], 'sborka_id'=>$ap['sborka_id'], 'ap_blok'=>$ap_blok);
        }
        echo CJSON::encode($result);
}
View:

Код: Выделить всё

echo AutoComplete::widget([
    'name'=>'name',
    //'model'=>$searchModel,
    //'attribute' => 'name',
    'options' => ['placeholder' => 'Поиск по АП...'],
    'clientOptions' => [
        'source' =>Url::toRoute('autocomplete'),
        'dataType'=>'json',
        'autoFill'=>true,
        'minLength'=>'0',
        'select' =>new JsExpression("function(event, ui) {
            this.value = ui.item.name + 'бл. ' + ui.item.blok_num;
            window.location = ui.item.id;
        }"),
        'success'=>new JsExpression("function (data) {
    response($.map(data, function (item) {
        return item.name;
    }))
}"),
        ],
]);
Так вот, View при ссылке на контроллер от Yii1 работает, а от Yii2 не работает (<li></li> пусты).
Изображение
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение chesar »

В консоли браузера что? Ошибки есть? Данные ajax'ом точно подгружаются?

Методом тыка попробовать можно такой вариант:

Код: Выделить всё

class MyController extends Controller
{
    public function behaviors()
    {
            return [
                'bootstrap' => [
                        'class' => ContentNegotiator::className(),
                        'only' => ['autocomplete'],
                        'formats' => [ 'application/json' => Response::FORMAT_JSON ],
                            'languages' => [
                                'ru',
                        ],
                    ],
            ];
        }
        
        public function actionAutocomplete()
        { 
            return Sborka::find()
            ->select(['id', 'name', 'blok_num'])
            ->andFilterWhere(['like', 'name', Yii::$app->request->get('term')])            
            ->asArray()
            ->all();
        }
        
}
pav
Сообщения: 7
Зарегистрирован: 2015.01.21, 21:11

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение pav »

Спасибо за отклик!

Код: Выделить всё

'bootstrap' => [
                        'class' => 'yii\filters\ContentNegotiator',//тут ругался Yii2 - переправил
                        'only' => ['autocomplete'],
                        'formats' => [ 'application/json' => Response::FORMAT_JSON ],
                            'languages' => [
                                'ru',
                        ],
                    ],
 
function actionAutocomplete() заменил, но безрезультатно. Так же с Yii2 контроллера пустые <li></li>, с Yii1 все работает.
В консоли браузера ошибок нет, данные подгружаются. Разница лишь в кодировке:

Response из Yii1:

Код: Выделить всё

[{"id":"2312","label":"\u04115-1111","href":"http:\/\/10.7.80.22\/tai2-engelec\/sborki\/view?id=198","sborka_id":"198","ap_blok":"3"},{"id":"2510","label":"\u04225-1111","href":"http:\/\/10.7.80.22\/tai2-engelec\/sborki\/view?id=217","sborka_id":"217","ap_blok":"3"}]
Response из Yii2:

Код: Выделить всё

[{"id":"31","name":"75111Н","blok_num":"4"},{"id":"211","name":"75111Н","blok_num":"3"}]
И до кучи View:

Код: Выделить всё

echo AutoComplete::widget([
    'name'=>'name',

    'options' => ['placeholder' => 'Поиск по АП...'],
    'clientOptions' => [
        'source' =>Url::to(['sborka/autocomplete']),
       // 'source' =>'http://10.7.80.22/tai2-engelec/sborki/ap/autocomplete',
        'autoFill'=>true,
        'minLength'=>'0',
        'select'=>new JsExpression('function(event, ui) {
            this.value = ui.item.blok_num + "бл. " + ui.item.name;
            window.location = ui.item.id;
        }'),
        /*'select'=>new JsExpression('function(event, ui) {
            this.value = ui.item.blok_num + "бл. " + ui.item.value;
            window.location = ui.item.id;
        }'),*/
        
        ],

]);
skvarovski
Сообщения: 92
Зарегистрирован: 2015.06.15, 18:36

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение skvarovski »


Так вот, View при ссылке на контроллер от Yii1 работает, а от Yii2 не работает (<li></li> пусты).
Изображение

эта проблема у меня возникла, причина была из-за неправильной ответки JSON {id,label,value},{id,label,value}, ....
bahriddin
Сообщения: 2
Зарегистрирован: 2015.07.21, 08:24

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение bahriddin »

Обясните, пожалуйста по подробнее. как это работает, и что такое UI:
pav писал(а):

Код: Выделить всё

        'select'=>new JsExpression('function(event, ui) {
            this.value = ui.item.blok_num + "бл. " + ui.item.name;
            window.location = ui.item.id;
        }'),
 
ozi
Сообщения: 65
Зарегистрирован: 2012.08.17, 12:42

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение ozi »

ui - твой объект autocomplete
ui.item - это отдельный элемент, в твоем случае {"id":"2312","label":"\u04115-1111","href":"http:\/\/10.7.80.22\/tai2-engelec\/sborki\/view?id=198","sborka_id":"198","ap_blok":"3"}

ui.item.id будет 2313
ui.item.label будет \u04115-1111
ozi
Сообщения: 65
Зарегистрирован: 2012.08.17, 12:42

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение ozi »

тебе надо выборку вот так сделать

Код: Выделить всё

->select(['id as value', 'name as label'])
чтоб корректно сформировался объект ui, необходимо, чтоб присутствовали обязательно поле {label}, у source.items[]
bahriddin
Сообщения: 2
Зарегистрирован: 2015.07.21, 08:24

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение bahriddin »

Прекрасно работает. Есть ещё 1 вопрос: а как сделать чтобы в результате показал как " ui.item.id + ' ' + ui.item.blok_num + ' ' + ui.item.name. "?
ozi писал(а):тебе надо выборку вот так сделать

Код: Выделить всё

->select(['id as value', 'name as label'])
чтоб корректно сформировался объект ui, необходимо, чтоб присутствовали обязательно поле {label}, у source.items[]
ozi
Сообщения: 65
Зарегистрирован: 2012.08.17, 12:42

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение ozi »

при событии select и указывай, что должно сформироваться в поле

Код: Выделить всё

this.value = ui.item.id + ' ' + ui.item.blok_num + ' ' + ui.item.label //именно label, т.к. name поля уже нет
как то так... просто не уверен, что помимо полей value и label есть еще какие либо...
пробовать надо
theKiller
Сообщения: 153
Зарегистрирован: 2010.02.28, 22:58

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение theKiller »

Здравствуйте!
Переношу сейчас сайт с первого на второй Yii. Возникла проблема с тегами в статье. Не работает автокомплит!
Поле во вью:

Код: Выделить всё

<?= $form->field($model, 'articleTags')->widget(\yii\jui\AutoComplete::classname(), [
            'clientOptions' => [
                'id' => 'articleTags',
                'source' => 'js:function(request, response) {
                    $.getJSON("/tags/suggest", {
                        term: request.term.split(/,s*/).pop()
                    }, response);
                }',
            ],
            'options' => [
                'minLength' => '2',
                'showAnim' => 'fold',
                'class' => 'form-control',
                'search' => 'js: function() {
                                var term = this.value.split(/,s*/).pop();
                                if(term.length < 2)
                                    return false;
                             }',
                'focus' => 'js: function() {
                                return false;
                            }',
                'select' => 'js: function(event, ui) {
                                var terms = this.value.split(/\s*,\s*/);
                                terms.pop();
                                terms.push(ui.item.value);
                                terms.push("");
                                this.value = terms.join(", ");
                                return false;
                            }',
            ],
        ]) ?>
Если указать в качестве Source непосредственно URL ('source' =>Url::to('/tags/suggest')), то отрабатывает, но соответственно нельзя выбрать несколько тегов через запятую.

Ошибка в браузере такова:

Код: Выделить всё

9175XMLHttpRequest cannot load js:function(request, response) {
                    $.getJSON("/tags/suggest", {term: request.term.split(/,s*/).pop()}, response);
                    }?term=%D0%BB%D0%B5%D1%82%D0%BE%2C+%D0%BF%D0%BB%D1%8F%D0%B6%2C+. 
Cross origin requests are only supported for HTTP.
Прошу Вашей помощи...
theKiller
Сообщения: 153
Зарегистрирован: 2010.02.28, 22:58

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение theKiller »

Коллеги, неужели никто не сталкивался с проблемой? Может быть есть более интересная схема редактирования тегов? Как вы делаете?
Yura2017
Сообщения: 9
Зарегистрирован: 2017.04.15, 18:18

Re: Прошу помочь с yii2 и JUI AutoComplete

Сообщение Yura2017 »

theKiller писал(а): 2017.01.07, 19:02 Здравствуйте!
Ошибка в браузере такова:

Код: Выделить всё

9175XMLHttpRequest cannot load js:function(request, response) {
                    $.getJSON("/tags/suggest", {term: request.term.split(/,s*/).pop()}, response);
                    }?term=%D0%BB%D0%B5%D1%82%D0%BE%2C+%D0%BF%D0%BB%D1%8F%D0%B6%2C+. 
Cross origin requests are only supported for HTTP.
Прошу Вашей помощи...
Проблема так и не решена?
У меня та же самая проблема. Если решили, прошу подсказать хотя бы в какую сторону копать. Код у меня такой же как у автора этого поста, только вместо $.getJSON я использую $.ajax. Но, думаю, это не принципиально в данном случае. Ошибка та же
Ответить