Il widget di ricerca fornisce un'interfaccia di ricerca personalizzabile per le applicazioni web. Il widget richiede solo una piccola quantità di codice HTML e JavaScript per essere implementato e consente di attivare funzionalità di ricerca comuni come le sfaccettature e la paginazione. Puoi anche personalizzare parti dell'interfaccia con CSS e JavaScript.
Se hai bisogno di una maggiore flessibilità rispetto a quella offerta dal widget, valuta la possibilità di utilizzare l'API Query. Per informazioni sulla creazione di un'interfaccia di ricerca con l'API Query, consulta Creare un'interfaccia di ricerca con l'API Query.
Creare un'interfaccia di ricerca
La creazione dell'interfaccia di ricerca richiede diversi passaggi:
- Configurare un'applicazione di ricerca
- Genera un ID client per l'applicazione
- Aggiungere markup HTML per la casella di ricerca e i risultati
- Carica il widget nella pagina
- Inizializzare il widget
Configurare un'applicazione di ricerca
Ogni interfaccia di ricerca deve avere un'applicazione di ricerca definita nella Console di amministrazione. L'applicazione di ricerca fornisce informazioni aggiuntive per la query, ad esempio le origini dati, i facet e le impostazioni della qualità della ricerca.
Per creare un'applicazione di ricerca, consulta Creare un'esperienza di ricerca personalizzata.
Genera un ID client per l'applicazione
Oltre ai passaggi descritti in Configurare l'accesso all'API Google Cloud Search, devi anche generare un ID client per l'applicazione web.
Quando configuri il progetto:
- Seleziona il tipo di client Browser web
- Fornisci l'URI di origine della tua app.
- Nota sull'ID client creato. Ti servirà l'ID cliente per completare i passaggi successivi. Il client secret non è necessario per il widget.
Per ulteriori informazioni, consulta OAuth 2.0 per applicazioni web lato client.
Aggiungere il markup HTML
Il widget richiede una piccola quantità di codice HTML per funzionare. Devi fornire:
- Un elemento
input
per la casella di ricerca. - Un elemento a cui ancorare il popup del suggerimento.
- Un elemento per contenere i risultati di ricerca.
- (Facoltativo) Fornisci un elemento per contenere i controlli delle sfaccettature.
Il seguente snippet HTML mostra il codice HTML di un widget di ricerca, in cui gli elementi da associare sono identificati dal relativo attributo id
:
Carica il widget
Il widget viene caricato dinamicamente tramite uno script di caricamento. Per includere il caricatore, utilizza il tag <script>
come mostrato di seguito:
Devi fornire un callback onload
nel tag script. La funzione viene chiamata quando il caricatore è pronto. Quando il caricatore è pronto, continua a caricare il widget chiamando gapi.load()
per caricare il client API, Accedi con Google e i moduli Cloud Search.
La funzione initializeApp()
viene chiamata dopo il caricamento di tutti i moduli.
Inizializzare il widget
Innanzitutto, inizializza la libreria client chiamando gapi.client.init()
o gapi.auth2.init()
con l'ID client generato e l'ambito https://www.googleapis.com/auth/cloud_search.query
. Poi, utilizza le classi gapi.cloudsearch.widget.resultscontainer.Builder
e gapi.cloudsearch.widget.searchbox.Builder
per configurare il widget e associarlo agli elementi HTML.
L'esempio seguente mostra come inizializzare il widget:
L'esempio riportato sopra fa riferimento a due variabili per la configurazione definite come:
Personalizzare l'esperienza di accesso
Per impostazione predefinita, il widget chiede agli utenti di accedere e autorizzare l'app quando iniziano a digitare una query. Puoi utilizzare Accedi con Google per i siti web per offrire agli utenti un'esperienza di accesso più personalizzata.
Autorizzare gli utenti direttamente
Utilizza Accedi con Google per monitorare lo stato di accesso dell'utente e accedere o uscire dagli utenti in base alle esigenze. Ad esempio, l'esempio seguente osserva lo stato isSignedIn
per monitorare le modifiche di accesso e utilizza il metodo GoogleAuth.signIn()
per avviare l'accesso da un clic sul pulsante:
Per ulteriori dettagli, vedi Accedi con Google.
Consentire l'accesso automatico agli utenti
Puoi semplificare ulteriormente l'esperienza di accesso preautorizzando l'applicazione per conto degli utenti della tua organizzazione. Questa tecnica è utile anche se utilizzi Cloud Identity-Aware Proxy per proteggere l'applicazione.
Per ulteriori informazioni, vedi Utilizzare Accedi con Google con le app IT.
Personalizzare l'interfaccia
Puoi modificare l'aspetto dell'interfaccia di ricerca tramite una combinazione di tecniche:
- Sovrascrivere gli stili con CSS
- Decorare gli elementi con un adattatore
- Creare elementi personalizzati con un'opzione di adattamento
Sovrascrivere gli stili con CSS
Il widget di ricerca è dotato di un proprio CSS per stilare gli elementi di suggerimento e dei risultati, nonché i controlli di paginazione. Puoi modificare lo stile di questi elementi in base alle tue esigenze.
Durante il caricamento, il widget di ricerca carica dinamicamente il relativo foglio di stile predefinito. Ciò si verifica dopo il caricamento dei fogli di stile dell'applicazione, aumentando la priorità delle regole. Per assicurarti che i tuoi stili abbiano la precedenza sugli stili predefiniti, utilizza i selettori dei progenitori per aumentare la specificità delle regole predefinite.
Ad esempio, la seguente regola non ha effetto se caricata in un tag statico link
o style
nel documento.
.cloudsearch_suggestion_container {
font-size: 14px;
}
Specifica invece la regola con l'ID o la classe del contenitore precedente dichiarato nella pagina.
#suggestions_anchor .cloudsearch_suggestion_container {
font-size: 14px;
}
Per un elenco delle classi di supporto e un esempio di codice HTML prodotto dal widget, consulta la sezione di riferimento sulle classi CSS supportate.
Decorare gli elementi con un adattatore
Per decorare un elemento prima del rendering, crea e registra un adattatore che implementi uno dei metodi di decorazione, ad esempio decorateSuggestionElement
o decorateSearchResultElement.
.
Ad esempio, i seguenti adattatori aggiungono una classe personalizzata agli elementi di suggerimento e risultato.
Per registrare l'adattatore durante l'inizializzazione del widget, utilizza il metodo setAdapter()
della rispettiva classe Builder
:
I decoratori possono modificare gli attributi dell'elemento contenitore e di eventuali elementi secondari. Gli elementi secondari possono essere aggiunti o rimossi durante la decorazione. Tuttavia, se apporti modifiche strutturali agli elementi, ti consigliamo di crearli direttamente anziché decorarli.
Creare elementi personalizzati con un'opzione di adattamento
Per creare un elemento personalizzato per un suggerimento, un contenitore di aspetti o un risultato di ricerca,
crea e registra un'opzione di adattamento che implementi
rispettivamente createSuggestionElement
,
createFacetResultElement
o createSearchResultElement
.
I seguenti adattatori mostrano come creare elementi personalizzati di suggerimenti e risultati di ricerca utilizzando i tag HTML <template>
.
Per registrare l'adattatore durante l'inizializzazione del widget, utilizza il metodo setAdapter()
della rispettiva classe Builder
:
La creazione di elementi di frazione personalizzati con createFacetResultElement
è soggetta a diverse limitazioni:
- Devi associare la classe CSS
cloudsearch_facet_bucket_clickable
all'elemento su cui gli utenti fanno clic per attivare/disattivare un bucket. - Devi racchiudere ogni bucket in un elemento contenitore con la classe CSS
cloudsearch_facet_bucket_container
. - Non puoi visualizzare i bucket in un ordine diverso da quello visualizzato nella risposta.
Ad esempio, lo snippet seguente mostra le sfaccettature utilizzando i link anziché le caselle di controllo.
Personalizzare il comportamento di ricerca
Le impostazioni dell'applicazione di ricerca rappresentano la configurazione predefinita per un'interfaccia di ricerca e sono statiche. Per implementare filtri o facet dinamici, ad esempio consentire agli utenti di attivare/disattivare le origini dati, puoi eseguire l'override delle impostazioni dell'applicazione di ricerca intercettando la richiesta di ricerca con un'opzione di adattamento.
Implementa un'opzione di adattamento con il metodo
interceptSearchRequest
per modificare le richieste inviate all'API di ricerca
prima dell'esecuzione.
Ad esempio, il seguente adattatore intercetta le richieste per limitare le query a una sorgente selezionata dall'utente:
Per registrare l'adattatore durante l'inizializzazione del widget, utilizza il metodo
setAdapter()
durante la creazione di ResultsContainer
Il seguente codice HTML viene utilizzato per visualizzare una casella di selezione per filtrare i dati in base alle fonti:
Il codice seguente ascolta la modifica, imposta la selezione e, se necessario, esegue nuovamente la query.
Puoi anche intercettare la risposta alla ricerca implementando
interceptSearchResponse
nell'adattatore.
Bloccare la versione dell'API
Per impostazione predefinita, il widget utilizza la versione stabile più recente dell'API. Per bloccare una versione specifica, imposta il parametro di configurazione cloudsearch.config/apiVersion
sulla versione preferita prima di inizializzare il widget.
Se non è impostata o è impostata su un valore non valido, la versione dell'API sarà 1.0 per impostazione predefinita.
Bloccare la versione del widget
Per evitare modifiche impreviste alle interfacce di ricerca, imposta il parametro di configurazione cloudsearch.config/clientVersion
come mostrato:
gapi.config.update('cloudsearch.config/clientVersion', 1.1);
Se non è impostata o se è impostata su un valore non valido, la versione del widget sarà 1.0 per impostazione predefinita.
Proteggere l'interfaccia di ricerca
I risultati di ricerca contengono informazioni altamente sensibili. Segui le best practice per la protezione delle applicazioni web, in particolare contro gli attacchi di clickjacking.
Per ulteriori informazioni, consulta il progetto della guida OWASP.
Attivare il debug
Utilizza interceptSearchRequest
per attivare il debug per il widget di ricerca. Ad esempio:
if (!request.requestOptions) {
// Make sure requestOptions is populated
request.requestOptions = {};
}
// Enable debugging
request.requestOptions.debugOptions = {enableDebugging: true}
return request;