在Symfony2中使用Typeahead + Bloodhound和FOSJsRoutingBundle执行查询

Performing a query using Typeahead + Bloodhound and FOSJsRoutingBundle in Symfony2

本文关键字:Bloodhound FOSJsRoutingBundle 执行 查询 Typeahead Symfony2      更新时间:2023-09-26

我试图设置Typeahead + Bloodhound在一个字段上执行搜索建议。该字段的HTML代码如下:

<div class="col-sm-10" id="products_forms">
    <input type="text" placeholder="Producto" id="ProductoForm_0_product_id" name="ProductoForm[0][product_id]" class="form-control typeahead">
</div>

我使用Symfony中的两个主要函数:一个用于返回所有产品并将其用作prefetch,另一个用于过滤产品。这些函数的路由是这样的:

 // the one I use as prefetch parameter in bloodhound
 * @Route("/get_products", name="all_products")
 // the one I use as remote
 * @Route("/get_products/{filter}", name="filter_products")

正如您所看到的,第一个没有获得任何参数,因为它将所有产品作为JSON值返回,但第二个将{filter}作为执行LIKE的参数,并仅返回过滤后的产品。

现在我完全不知道Bloodhound是如何工作的,所以我阅读了文档,也提前阅读了文档,并从这里取了一个Remote的例子,并制作了这个代码:

// Trigger typeahead + bloodhound
var products = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: Routing.generate('all_products'),
    remote: Routing.generate('filter_products', { 'filter' : '%query' })
});
products.initialize();
$('#products_forms .typeahead').typeahead(null, {
    name: 'products',
    displayKey: 'value',
    source: products.ttAdapter()
});

对吗?我的意思是,当页面加载时,所有产品都会被预取但如果我在.typeahead元素上输入any,我只会得到过滤后的产品?我不知道%query是否是正确的值,我应该传递给filter_products路由以获得过滤值。任何帮助吗?

这是我第一次使用Typeahead + Bloodhound

remote: Routing.generate('filter_products', { 'filter' : '%query' })替换为e.g.

var url = Routing.generate('filter_products', {filter: 'WILDCARD'});
// ... some code
remote: {
            url: url,
            wildcard: 'WILDCARD'
        }

这将首先生成一个带有RoutingBundle的通用url,并以'WILDCARD'作为你的过滤器。然后告诉bloodhound在url上使用'WILDCARD'作为占位符,它将完全替换为输入的查询。