Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 30 di 39
  • livello principiante
Indice lezioni

Interrogare una collection

Scrivere il modulo per l'interrogazione della base dati o collection
Scrivere il modulo per l'interrogazione della base dati o collection
Link copiato negli appunti

Per poter cercare all'interno della collection abbiamo bisogno di un modulo, che possiamo riciclare dal file ricerca_semplice.cfm.

1.Salva il modulo in un nuovo file ricerca_avanzata.cfm:

<!--- ricerca_avanzata.cfm: piccolo motore di ricerca con verity --->

<p class="titolo">Ricerca avanzata</p>
<p>
     <form method="post">
     <table border="0" cellspacing="1" cellpadding="3">
          <tr>
               <td><p>Parola chiave:</p></td>
               <td><input type="text" name="parolaChiave"></td>
          </tr>
          <tr>
               <td> </td>
               <td><input type="submit" value="Cerca"></td>
          </tr>
     </table>
     </form>
</p>

Come prima, questo form rimanda alla stessa pagina.

2. Eseguiamo, con <cfif>., la verifica che il form sia stato inviato e che il valore inviato dal campo "parolaChiave" non sia vuoto. Utilizziamo il tag <cfsearch>.; per interrogare la collection "collectionDiscoteca" in base alle parole chiave provenienti dal form:

<!--- ricerca_avanzata.cfm: piccolo motore di ricerca con verity --->

<cfif isDefined('form.parolaChiave') AND form.parolaChiave NEQ "">
     <cfsearch name="risultatiRicerca" collection="collectionDiscoteca" criteria="#form.parolaChiave#">
</cfif>

<p class="titolo">Ricerca avanzata</p>
<p>
     <form method="post">
     <table border="0" cellspacing="1" cellpadding="3">
          <tr>
               <td><p>Parola chiave:</p></td>
               <td><input type="text" name="parolaChiave"></td>
          </tr>
          <tr>
               <td> </td>
               <td><input type="submit" value="Cerca"></td>
          </tr>
     </table>
     </form>
</p>

Il tag <cfsearch>. è molto semplice: con l'attributo "name" diamo un nome all'elenco dei record che sono stati eventualmente trovati, esattamente come l'attributo del tag <cfquery>.; con l'attributo "collection" invece indichiamo la collection nella quale eseguire la ricerca. All'attributo "criteria" si passa, invece, la parola chiave proveniente dal modulo che deve costituire il criterio per filtrare i record.

<cfsearch>. è simile al tag <cfquery>. anche quando dobbiamo visualizzare il risultato della ricerca, che può essere paragonato ad un vero e proprio recordset. Per questo motivo, è sufficiente usare <cfoutput query="risultatiRicerca">; la differenza sta nel fatto che le variabili restituite da <cfsearch>. non sono, ovviamente, i campi di una tabella, ma:

VARIABILE SIGNIFICATO
Title

Il titolo del documento cercato, e nel caso di una query indicizzata, il campo che abbiamo dato all'attributo "title" nel tag <cfindex>.

Score La rilevanza di una parola cercata nel documento, che indica quanto il risultato si avvicina alle parole chiave inserite
RecordsSearched Il numero totale dei record indicizzati
RecordCount Come con <cfquery>., restituisce il numero dei record trovati
Key Il nome del file del documento cercato e, nel caso di una query indicizzata, il campo che abbiamo dato all'attributo "key" nel tag <cfindex>..
Currentrow Come con <cfquery>., restituisce il numero progressivo di ciascun record

3. Visualizza i risultati della ricerca con <cfoutput> e le variabili indicate nella tabella:

<!--- ricerca_avanzata.cfm: piccolo motore di ricerca con verity --->

<cfif isDefined('form.parolaChiave') AND form.parolaChiave NEQ "">
     <cfsearch name="risultatiRicerca" collection="collectionDiscoteca" criteria="#form.parolaChiave#">

     <p> 

  

 

  
<cfoutput>trovati #risultatiRicerca.RecordCount# album su #risultatiRicerca.RecordsSearched#</cfoutput>
 

  
<table>
         <tr>
              <td></td>
              <td><p><b>Titolo album</b></p></td>
              <td><p><b>Rilevanza</b></p></td>
         </tr>
        <cfoutput query="risultatiRicerca">
         <tr>
              <td><p>#Currentrow#)</p></td>
              <td><p><a href="dettaglio.cfm?id=#key#">#Title#</a></p></td>
              <td><p>#Score#</p></td>
         </tr>
        </cfoutput>
 

  
</table>
     </p>
</cfif>

<p class="titolo">Ricerca avanzata</p>
<p>
     <form method="post">
     <table border="0" cellspacing="1" cellpadding="3">
          <tr>
               <td><p>Parola chiave:</p></td>
               <td><input type="text" name="parolaChiave"></td>
          </tr>
          <tr>
               <td> </td>
               <td><input type="submit" value="Cerca"></td>
          </tr>
     </table>
     </form>
</p>

4. Aggiungi un <cfif> per mostrare un avviso, nel caso la ricerca non produca alcun risultato:

<!--- ricerca_avanzata.cfm: piccolo motore di ricerca con verity --->

<cfif isDefined('form.parolaChiave') AND form.parolaChiave NEQ "">
     <cfsearch name="risultatiRicerca" collection="collectionDiscoteca" criteria="#form.parolaChiave#">

 
   <cfif risultatiRicerca.RecordCount GT 0>    
    
    
<p>    
      
   <cfoutput>trovati #risultatiRicerca.RecordCount# album su #risultatiRicerca.RecordsSearched#</cfoutput>
           
   <table>
                   <tr>
                        <td></td>
                        <td><p><b>Titolo album</b></p></td>
                        <td><p><b>Rilevanza</b></p></td>
                   </tr>
                  <cfoutput query="risultatiRicerca">
                   <tr>
                        <td><p>#Currentrow#)</p></td>
                        <td><p><a href="dettaglio.cfm?id=#key#">#Title#</a></p></td>
                        <td><p>#Score#</p></td>
                   </tr>
                  </cfoutput>
          
   </table>
 

         </p>
    <cfelse>
        <p>Non sono stati trovati album corrispondenti alla ricerca.</p>
    </cfif>

</cfif>

<p class="titolo">Ricerca avanzata</p>
<p>
     <form method="post">
     <table border="0" cellspacing="1" cellpadding="3">
          <tr>
               <td><p>Parola chiave:</p></td>
               <td><input type="text" name="parolaChiave"></td>
          </tr>
          <tr>
               <td> </td>
               <td><input type="submit" value="Cerca"></td>
          </tr>
     </table>
     </form>
</p>

5. Infine, aggiungi un link al file ricerca_avanzata.cfm nel file footer.cfm:

<!--- footer.cfm: contiene le dichiarazioni finali della pagina HTML e il piede delle pagine --->

<hr>
<div class="corpoPagina">
     <cfset Oggi = Now()>
     <span class="piede">
     <cfoutput>
          <a href="index.cfm">Home page</a> | <a href="ricerca_semplice.cfm">Ricerca semplice</a> | <a href="ricerca_avanzata.cfm">Ricerca avanzata</a> | <a href="contattami.cfm">Contattami</a> | Oggi è <strong>#LSDateFormat(Oggi, 'dddd, d mmmm yyyy')#</strong>
     </cfoutput>
     </span>
</div>
</body>
</html>

Fai delle prove di ricerca ("http://localhost:8500/discoteca/ricerca_avanzata.cfm") per verificare il funzionamento. La rilevanza, come puoi notare, viene espressa in valori che vanno da zero a uno. Con la funzione NumberFormat() puoi modificare l'aspetto di questo valore, ad esempio per limitarne i decimali.

6. Modifica il file ricerca_avanzata.cfm per dare una formattazione alla variabile "score". La funzione NumberFormat() prende due parametri: il valore da formattare (in questo caso, la variabile) e la "maschera" da dare al numero:

......
<cfoutput query="risultatiRicerca">
    <tr>
 
  
   <td><p>#Currentrow#)</p></td>
        <td><p><a href="dettaglio.cfm?id=#key#">#Title#</a></p></td>
        <td><p>#NumberFormat(Score, '_._')#</p></td>
    </tr>
</cfoutput>
......

NumberFormat() dà la formattazione predefinita (americana); se vuoi utilizzare la formattazione italiana, che abbiamo definito come predefinita tramite con il SetLocale(), devi usare la funzione LSNumberFormat(). Come valore da formattare puoi passare alla funzione anche una espressione numerica:

7. trasforma in percentuale la rilevanza dei risultati della ricerca, utilizzando la funzione LSNumberFormat().

......
<cfoutput query="risultatiRicerca">
    <tr>
 
      <td><p>#Currentrow#)</p></td>
        <td><p><a href="dettaglio.cfm?id=#key#">#Title#</a></p></td>
        <td><p>#LSNumberFormat(Score * 100, '_._')# %</p></td>
    </tr>
</cfoutput>
......

Ti consigliamo anche