Durchführen einer Abfrage mit Typeahead + Bloodhound und FOSJsRoutingBundle in Symfony2
-
02-01-2020 - |
Frage
Ich versuche, Typeahead + Bloodhound einzurichten, um eine Suche mit Vorschlägen für ein Feld durchzuführen.Der HTML-Code für das Feld lautet wie folgt:
<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>
Ich benutze zwei Hauptfunktionen von Symfony:eine für die Rückgabe aller Produkte und verwenden Sie diese als prefetch
und der andere für die gefilterten Produkte.So sehen die Routen für diese Funktionen aus:
// 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")
Wie Sie sehen, hat der erste keine Parameter erhalten, da er alle Produkte als JSON-Werte zurückgibt, der zweite jedoch {filter}
als Argument für die Durchführung der LIKE
und gibt nur die gefilterten Produkte zurück.
Jetzt weiß ich überhaupt nicht, wie Bloodhound funktioniert, also lese ich das Dok und auch für den Schriftkopf lesen Sie die Dok und nehmen Sie ein Beispiel aus hier der Remote
eins und machte diesen 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()
});
Stimmt das?Ich meine, wenn die Seite geladen wird, werden alle Produkte vorab abgerufen, aber wenn ich welche eingebe .typeahead
element bekomme ich nur die gefilterten?Ich weiß nicht ob %query
ist der richtige Wert, an den ich übergeben sollte filter_products
route, um die gefilterten Werte zu erhalten.Irgendeine Hilfe?
Dies ist das erste Mal, dass ich Typeahead + Bloodhound verwende
Lösung
Ersetzen remote: Routing.generate('filter_products', { 'filter' : '%query' })
mit z.B.
var url = Routing.generate('filter_products', {filter: 'WILDCARD'});
// ... some code
remote: {
url: url,
wildcard: 'WILDCARD'
}
Dadurch wird zuerst eine allgemeine URL mit dem RoutingBundle generiert und 'PLATZHALTER' als Filter verwendet.Dann weisen Sie Bloodhound an, 'WILDCARD' für die URL als Platzhalter zu verwenden, und es wird es perfekt durch die eingegebene Abfrage ersetzen.