如何使typeahead在yii2中显示数据库信息


How can I make typeahead show database information in yii2?

我想在我的项目中进行搜索。我用的是打字,但不起作用。这是我的代码:

<?php
        echo '<label class="control-label">Select Repository</label>';
        $template = '<div><p class="repo-language">{{no_telepon}}</p>' .
            '<p class="repo-name">{{nama}}</p>' .
            '<p class="repo-description">{{email}}</p></div>';
        echo Typeahead::widget([
            'name' => 'twitter_oss', 
            'options' => ['placeholder' => 'Filter as you type ...'],
            'dataset' => [
                [
                    'prefetch' => Penerima::find()->all(),
                    'datumTokenizer' => "Bloodhound.tokenizers.obj.whitespace('value')",
                    'display' => 'value',
                    'templates' => [
                        'notFound' => '<div class="text-danger" style="padding:0 8px">Unable to find repositories for selected query.</div>',
                        'suggestion' => new JsExpression("Handlebars.compile('{$template}')")
                    ]
                ]
            ]
        ]);
    ?>

这个问题被问了很长时间。

我也面临同样的问题,但我能解决这个问题。

为了将来参考,我添加了这篇文章。

控制器

$result = SampleModel::find()
                ->select('Attribute_name')
                ->where('name LIKE "%' . $searchParameter .'%"')
                ->asArray()
                ->all();
            return Json::encode($result);
  1. 在这里,您需要将数据库值获取为"associative array",您可以使用"asArray()"获取该值
  2. 那么正如您所看到的Json编码的返回值

在您的"查看"中

<?php 
                            echo Typeahead::widget([
                                'name' => 'sampleName',
                                'options' => ['placeholder' => 'Filtering data ...'],
                                'scrollable' => true,
                                'pluginOptions' => ['highlight'=>true],
                                'dataset' => [
                                    [
                                    'remote' => [
                                        'url' => Yii::$app->urlManager->createUrl(['sample/action']) . 
                                        '?searchParameter=%QUERY',
                                        'wildcard' => '%QUERY'
                                    ],
                                    'datumTokenizer' => "Bloodhound.tokenizers.obj.whitespace('Atribute_name')",
                                    'display' => 'Atribute_name',
                                    'limit' => 10,
                                    ],
                                ],
                                'pluginEvents' => [
                                    'typeahead:select' => 'function(e, s) { 
                                        EnableUserDetailsTypeAhead(s);
                                    }',
                                ]
                            ]);
                        ?>

这里没有什么需要考虑的。

  1. 调用控制器动作。你可以做到
Yii::$app->urlManager->createUrl(['sample/action']) . 
                                        '?searchParameter=%QUERY',
                                        'wildcard' => '%QUERY'
                                    ],
  1. 必须提供数据集中的以下行
'datumTokenizer' => "Bloodhound.tokenizers.obj.whitespace('Atribute_name')",
'display' => 'Atribute_name',

您将获得预期的数据。

我已经测试过这个示例代码,它正在运行

来自文档:

prefetch:数组prefetch选项对象的配置。有关可以为此参数设置的选项,请参阅文档。返回数据必须经过Json编码并转换为格式为[['value' => 'data1'], ['value' => 'data2'],...]的关联数组,其中valuedisplay 中设置的固定key

您传递的是一个对象数组,而不是键值对数组。可以使用asArray创建对象列表。您需要将display更改为包含数据的字段的名称:

'prefetch' => Penerima::find()->select('title')->asArray()->all(),