Question

J'essaie de configurer Typeahead + Bloodhound pour effectuer une recherche avec des suggestions sur un champ.Le code HTML du champ est le suivant :

<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>

J'utilise deux fonctions principales de Symfony :un pour retourner tous les produits et l'utiliser comme prefetch et l'autre pour les produits filtrés.Voici à quoi ressemblent les routes pour ces fonctions :

 // 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")

Comme vous pouvez le voir, le premier n'a obtenu aucun paramètre puisqu'il renvoie tous les produits sous forme de valeurs JSON, mais le second prend {filter} comme argument pour effectuer le LIKE et renvoie uniquement les produits filtrés.

Maintenant, je ne sais pas du tout comment fonctionne Bloodhound alors j'ai lu le documents et aussi pour la saisie anticipée, lisez le documents et prenons un exemple de ici le Remote un et j'ai créé ce code :

// 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()
});

Est-ce correct?Je veux dire, lorsque la page sera chargée, tous les produits seront préextraits, mais si j'en tape un sur .typeahead élément, je n'obtiendrai que ceux filtrés ?je ne sais pas si %query est la bonne valeur à laquelle je devrais passer filter_products route afin d’obtenir les valeurs filtrées.De l'aide?

C'est la première fois que j'utilise Typeahead + Bloodhound

Était-ce utile?

La solution

Remplacer remote: Routing.generate('filter_products', { 'filter' : '%query' }) avec par ex.

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

Cela générera d'abord une URL générale avec le RoutingBundle et prendra « WILDCARD » comme filtre.Ensuite, dites à Bloodhound d'utiliser 'WILDCARD' sur l'URL comme espace réservé et il le remplacera parfaitement par la requête saisie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top