Esecuzione di una query usando Typeahead + Bloodhound e FosjsroutingBundle in Symfony2
-
02-01-2020 - |
Domanda
Sto cercando di impostare Typeahead + Bloodhound per eseguire la ricerca con suggerimenti su un campo. Il codice HTML per il campo è il seguente:
<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>
.
Io uso due funzioni principali da Symfony: una per restituire tutti i prodotti e utilizzarlo come prefetch
e l'altro per i prodotti filtrati. Questo è come appare i percorsi per quelle funzioni:
// 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")
.
Come puoi vedere il primo non ha ottenuto alcun parametro poiché restituisce tutti i prodotti come valori JSON, ma il secondo richiede {filter}
come argomento per eseguire il LIKE
e restituisce solo i prodotti filtrati.
Ora non so capire affatto come funziona Bloodhound, quindi ho letto il Documenti e anche per Typeahead Leggi il Documenti e fare un esempio da qui il Remote
one e realizzato Questo codice:
// 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()
});
.
è giusto? Voglio dire quando i carichi della pagina riceverò tutti i prodotti prefettati ma se digito qualsiasi elemento .typeahead
otterrò solo quelli filtrati? Non so se %query
è il valore giusto che dovrei passare alla rotta filter_products
per ottenere i valori filtrati. Qualsiasi aiuto?
Questa è la prima volta che uso Typeahead + Bloodhound
Soluzione
Sostituire remote: Routing.generate('filter_products', { 'filter' : '%query' })
con E.G.
var url = Routing.generate('filter_products', {filter: 'WILDCARD'});
// ... some code
remote: {
url: url,
wildcard: 'WILDCARD'
}
.
che genererà un URL generale con il routingbundle prima e prende il "Wildcard" come filtro.Di dire a Bloodhound a utilizzare 'Wildcard' sull'URL come segnaposto e lo sostituirà perfettamente con la query inserita.