Domanda

sto usando ColdFusion per restituire un set di risultati da un database SQL e trasformarlo in un elenco.

Ho bisogno di un modo per generare una barra di navigazione alfabetica per quell'elenco.Ho ColdFusion e la libreria jQuery disponibili.

Sto cercando di generare qualcosa del genere:

A | B | C | ...      
- A
- A
- B
- B
- B
- C
- D

Dove facendo clic su una delle lettere si accede alla pagina fino al primo elemento di quella lettera.Non tutte le 26 lettere dell'alfabeto sono necessariamente in uso.

È stato utile?

Soluzione 4

Quindi c'erano molti buoni suggerimenti, ma nessuno ha fatto esattamente quello che volevo.Fortunatamente sono stato in grado di usarli per capire cosa volevo veramente fare.L'unica cosa che segue non fa è stampare le ultime lettere inutilizzate (se ce ne sono).Ecco perché ho l'istruzione cfif che controlla la "W" poiché è l'ultima lettera che utilizzo, altrimenti dovrebbe controllare la Z.

<cfquery datasource="#application.dsn#" name="qTitles">
SELECT title, url, substr(titles,1,1) as indexLetter
FROM list
ORDER BY indexLetter,title
</cfquery>

<cfset linkLetter = "#asc('A')#">
<cfoutput query="titles" group="indexletter">
    <cfif chr(linkLetter) eq #qTitles.indexletter#>
        <a href="###ucase(qTitles.indexletter)#">#ucase(qTitles.indexletter)#</a>
        <cfif asc('W') neq linkLetter>|</cfif>
        <cfset linkLetter = ++LinkLetter>
    <cfelse>
        <cfscript>
        while(chr(linkLetter) != qTitles.indexletter)
                {
                        WriteOutput(" " & chr(linkLetter) & " ");
                        IF(linkLetter != asc('W')){WriteOutput("|");};
                        ++LinkLetter;
                }
        </cfscript>

        <a href="###ucase(qTitles.indexletter)#">#ucase(qTitles.indexletter)#</a>
        <cfif asc('W') neq linkLetter>|</cfif>
        <cfset linkLetter = ++LinkLetter>
    </cfif>
</cfoutput>

<ul>
<cfset currentLetter = "">
<cfoutput query="qTitles" group="title">
<cfif currentLetter neq #qTitles.indexletter#>
    <li><a name="#ucase(qTitles.indexletter)#">#ucase(qTitles.indexletter)#</a></li>
</cfif>
<cfset currentLetter = #qTitles.indexletter#>
<li><a href="#url#">#title#</a></li>
</cfoutput>
</ul>

Altri suggerimenti

Per generare la barra di navigazione, potresti fare qualcosa del genere:

<cfoutput>
<cfloop from="#asc('A')#" to="#asc('Z')#" index="i">
    <a href="###chr(i)#">#chr(i)#</a>
    <cfif asc('Z') neq i>|</cfif>
</cfloop>
</cfoutput>

(CFLOOP non funziona sui caratteri, quindi devi convertirli in codici ASCII e viceversa.)


Per visualizzare gli elementi nella tua query potresti fare qualcosa del genere.

<cfset currentLetter = "">
<cfoutput query="data">
<cfif currentLetter neq left(data.name, 1)>
    <h3><a name="#ucase(left(data.name, 1))#">#ucase(left(data.name, 1))#</a></h3>
</cfif>
<cfset currentLetter = left(data.name, 1)>
#name#<br>
</cfoutput>

È possibile utilizzare la funzione di raggruppamento delle query sulla query di record.Dovrai ovviamente modificare i campi della query in base ai tuoi dati e la funzione left() potrebbe avere una sintassi diversa a seconda del motore del database.La query seguente funziona su MSSQL.

<cfquery datasource="#application.dsn#" name="qMembers">
SELECT firstname,lastname, left(lastname,1) as indexLetter
FROM member
ORDER BY indexLetter,lastName
</cfquery>


<p id="indexLetter">
<cfoutput query="qMembers" group="indexLetter">
    <a href="###qMembers.indexLetter#">#UCase(qMembers.indexLetter)#</a>
</cfoutput>
</p>




<cfif qMembers.recordCount>

    <table>

    <cfoutput query="qMembers" group="indexLetter">
        <tr>
            <th colspan="99" style="background-color:##324E7C;">
                <a name="#qMembers.indexLetter#" style="float:left;">#UCase(qMembers.indexLetter)#</a> 
                <a href="##indexLetter" style="color:##fff;float:right;">index</a>
            </th>
        </tr>

        <cfoutput>
        <tr>
            <td><strong>#qMembers.lastName#</strong> #qMembers.firstName#</td>
        </tr>
        </cfoutput>
    </cfoutput>

    </table>

<cfelse>
    <p>No Members were found</p>
</cfif>

Vorrei che il set di risultati SQL restituisse l'elenco in primo luogo, puoi facilmente prendere semplicemente la prima lettera dell'elemento richiesto e un conteggio.Il modo più rapido sarebbe eseguire un join su una tabella di 26 caratteri (meno manipolazione di stringhe in questo modo).

In CF usa il valore di conteggio per assicurarti che se non ci sono risultati visualizzerai solo la lettera (come testo standard) o non la visualizzerai affatto.

Su quante righe lavorerai poiché potrebbero esserci modi migliori per farlo.Ad esempio, memorizzare la prima lettera del campo di collegamento richiesto in una colonna separata durante l'inserimento ridurrebbe il sovraccarico durante la selezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top