Настройка вывода yii2 kartik-v/yii2-widget-typeahead

Этот виджет вводит текст и выдает результат поиска через раскрывающийся список. Вопрос в том, как я могу настроить его? Есть ли какая-либо форма или какое-то свойство, где я мог бы написать какой-нибудь html-шаблон, чтобы получить ответы в виде стильных гиперссылок с изображениями и т. Д.?

Этот код не работает, к сожалению.

Это вид внутри макета

 echo NavX::widget([
            'options' => ['class' => 'navbar-nav navbar-right'],
            'encodeLabels' => false, //вот эта строка
            'items' =>
                [
            ['label' => Typeahead::widget([
                'name' => 'country_1',
                'options' => ['placeholder' => 'Filter as you type ...'],
                'scrollable' => true,
                'pluginOptions' => ['highlight'=>true],
                'dataset' => [
                    [
                        'prefetch' => Url::to(['site/search']),
                        'limit' => 10
                    ]
                ]
            ])],
['label' => 'About', 'url' => ['/site/about']],
 ]
        ]);
        NavBar::end();

и контроллер

    public function actionSearch()
    {
// var_dump('TTTTTT'); die;
        $searchModel = ProductName::find()->asArray()->all();;
      //  echo $searchModel;

        return \yii\helpers\Json::encode($searchModel);
    //    echo 'test';
    }

Я пробовал разные, это тоже не работает

        public function actionSearch()
        {
        foreach (ProductName::find()->each() as $search_products) {
            $search_products_array[$search_products->nameID] = $search_products->name;
        }

        return \yii\helpers\Json::encode( $search_products_array);
}

Как видите, я пробовал разные варианты в контроллере, потому что поиск не реагировал на нажатия клавиш. Но с контроллером все в порядке, потому что, если я вручную перехожу по его URL-адресу, он хорошо отвечает.


person David    schedule 01.07.2017    source источник


Ответы (1)


Я никогда раньше не пользовался этим виджетом. Но, прочитав документ, кажется, что вы можете настроить способ отображения предложений, изменив suggestion под template под dataset.

предложение — используется для рендеринга одного предложения. Если установлено, это должен быть предварительно скомпилированный шаблон. Связанный объект предложения будет служить контекстом. По умолчанию значение displayKey заключено в тег p, т. е. <p>{{value}}</p>. Виджет включает компилятор шаблонов Handlebars, загруженный по умолчанию.

Я предполагаю, что {{url}} и {{name}} в $template исходят из данных, переданных виджету. Вам может потребоваться это проверить.

$template = '<div><img src="{{url}}"><p>{{name}}</p></div>';
 echo Typeahead::widget([
      // other options
      'dataset' => [
          [
              'prefetch' => Url::to(['controller/action']),
              'templates' => [
                 'notFound' => '<div class="text-danger" style="padding:0 8px">Unable to find repositories for selected query.</div>',
                 'suggestion' => new JsExpression("Handlebars.compile('{$template}')")
              ]
          ]
      ]
]);
person ck_arjun    schedule 02.07.2017
comment
Сделал, как вы написали, но не получил никаких действий при попытке что-либо найти. Я даже поставил var_dump(); умереть; Внутри контроллера поиска, чтобы понять, вызывает ли его виджет, но виджет не вызывает его. Если я вызываю контроллер вручную, он отвечает. Я использовал этот 'prefetch' => Url::to(['сайт/поиск']), и этот 'prefetch' => Url::to([Yii::$app-›request-›baseUrl.' /сайт/поиск']), вообще не работает :( - person David; 02.07.2017
comment
Почему этот виджет является частью ярлыка? Пожалуйста, предоставьте весь код представления. Также вы проверили свою консоль, чтобы увидеть, выполняется ли вызов ajax для site/search? - person ck_arjun; 03.07.2017
comment
виджет находится внутри виджета layouts navx, поэтому он является частью меню. Обновил свой первоначальный пост, чтобы вы могли его увидеть. Это отлично работает, если я использую статические данные для виджета поиска. Я имею в виду, что он отлично работает из этой части меню. Но проблемы возникают, когда я использую prefetch -> to controller. Я проверил консоль, во время работы внутри консоли ничего не происходит. Но если я пишу неправильный адрес в prefetch, консоль выдает ошибку 500. Возможно, это означает, что виджет проверяется при загрузке страницы. но когда я нажимаю клавишу, ничего не происходит. - person David; 03.07.2017
comment
да, с опцией prefetch виджет получает данные при загрузке. Виджет ожидает данные в определенном формате [['value' => 'data1'], ['value' => 'data2'],...] , но ваш контроллер возвращает результат запроса. Попробуйте отформатировать возвращенные данные. Кроме того, вы по-прежнему можете передавать данные напрямую с контроллера, а не использовать вызов ajax. - person ck_arjun; 03.07.2017
comment
обновил мой вопрос, проверьте новую версию контроллера. Но тоже не работает. Этот метод работал, когда я вызывал его внутри представления и отправлял в виджет как данные. - person David; 03.07.2017
comment
Я не уверен, почему это происходит. Не могу проверить это в данный момент. Я попробую расширение сегодня позже, а тем временем, если вы разберетесь, пожалуйста, оставьте комментарий. - person ck_arjun; 03.07.2017
comment
Спасибо! Я тоже попробую. - person David; 03.07.2017