Ricerca testuale
Panoramica
Il campo di ricerca permette all'utente di trovare le pagine in base ad una stringa. Una volta effettuata la ricerca l'utente si ritroverà a vederne i risultati all'interno della vista search.html. La paginazione dei risultati di ricerca viene regolata dal pannello in Impostazioni > Generali > Ricerca nel campo Risultati per pagina della Ricerca contenuti
In questa pagina viene trattata la ricerca testuale e non la Ricerca Avanzata, né la Ricerca categorie.
Implementazione
Inserire il campo di ricerca
La ricerca testuale in SelfComposer passa in GET alla view search.html la variabile q
, che contiene la stringa cercata. È quindi sufficiente creare un form che passi in questo modo la query e che abbia come valore di action
l'URL dato da cms::public.search
. Questo form può essere inserito in qualsiasi view del tema.
Viene proposta di seguito una macro per semplificare la costruzione del campo di ricerca, utilizzando le etichette fornite da SelfComposer:
{% macro search() %} {% set placeholder = find_label('cms', 'search_label') %} {% set search_btn = find_label('cms', 'search_btn') %} {{ form_open({ route: 'cms::public.search', method: 'GET' }) }} <input type="text" name="q" placeholder="{{ placeholder }}" value="{{ input_get('q') }}" required> <button type="submit">{{ search_btn }}</button> {{ form_close() }} {% endmacro %}
Mostrare i risultati
I risultati di una ricerca vengono mostrati in search.html utilizzando contents
: una collection di pagine. È quindi sufficiente ciclare su questo array per estrarre tutti i risultati, allo stesso modo in cui si estraggono le pagine figlie. Inoltre è possibile utilizzare pagination.links
per estrarre la paginazione.
Va considerato anche il caso in cui la ricerca non abbia prodotto risultati, controllando se contents
contiene o meno delle pagine. In questo caso è possibile visualizzare l'etichetta predefinita search_no_results
.
Infine è possibile anche mostrare la stringa cercata con la variabile terms
e il numero totale di risultati trovati con pagination.total
, assieme alle rispettive etichette predefinite di SelfComposer search_results
e search_results_count
.
Il file search.html potrebbe essere quindi strutturato in questo modo:
- search.html
<h1>{{ find_label('cms', 'search_results') }}: {{ terms }}</h1> {# Etichetta del CMS per i risultati trovati e variabile "terms" del termine cercato #} <p>{{ find_label('cms', 'search_results_count') }}: {{ pagination.total }}</p> {# Etichetta del CMS della quantità di risultati trovati e il totale dei risultati #} {# Controllo se ci sono risultati #} {% if contents %} {# Mostro la paginazione #} <div> {{ pagination.links }} </div> {# Ciclo per mostrare ogni pagina trovata #} {% for page in contents %} <div> {% if child.image_url %} {# Collegamento all'articolo #} <a href="{{ content.url }}"> {% if content.image_url %} <img src="{{ content.image_url }}" alt="{{ content.title }}"> {% endif %} <h3>{{ content.title }}</h3> <h4>{{content.description}}</h4> </a> {% endif %} </div> {% endfor %} {% else %} {# Se non ci sono risultati, mostro l'etichetta del CMS apposita #} <h3>{{ find_label('cms', 'search_no_results') }}</h3> {% endif %}