Vra

Ek gebruik ColdFusion om 'n resultaat te stel van 'n SQL databasis terug en draai dit in 'n lys.

Ek moet een of ander manier om 'n alfabetiese navigasie bar vir daardie lys te genereer. Ek het Cold Fusion en die jQuery biblioteek beskikbaar.

Ek is op soek na iets soos hierdie op te wek:

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

Waar te kliek op een van die letters val jy af op die bladsy om die eerste item vir daardie brief. Nie alle 26 letters van die alfabet is noodwendig in gebruik.

Was dit nuttig?

Oplossing 4

So, was daar baie goeie voorstelle, maar niemand het presies wat ek wou. Gelukkig het ek in staat was om dit te gebruik om uit te vind wat ek regtig wou doen. Die enigste ding wat die volgende nie doen is druk die laaste paar ongebruikte letters (indien daar enige). Dis hoekom ek dat cfif verklaring nagaan vir 'W' as dit is die laaste brief wat ek gebruik, anders moet dit nagaan vir 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>

Ander wenke

Om die navigasie bar te genereer, kan jy so iets te doen:

<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 nie werk nie op karakters, sodat jy moet skakel na ASCII kodes en terug.)


Om die items in jou navraag vertoon jy kan iets doen soos hierdie.

<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>

Jy kan die navraag groepering funksie te gebruik op jou navraag van rekords. Jy sal natuurlik moet die navraag velde te verander volgens jou data en funksie links () kan verskillende sintaksis, afhangende van jou databasis enjin wees. Die onderstaande navraag werk op 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>

Ek sou die SQL gevolg gestel om die lys terug in die eerste plek te kry, kan jy maklik net neem die eerste letter van die vereiste item, en 'n telling. Die vinnigste manier sou wees om te doen 'n aan te sluit op 'n tafel van 26 karakters (minder string manipulasie dié manier).

In CF gebruik die telling waarde toe te sien dat indien daar geen resultaat wat jy óf slegs die letter vertoon (as standaard teks) of dit nie vertoon dit glad nie.

Hoeveel rye gaan jy werk op as daar dalk 'n beter maniere om dit te doen. Byvoorbeeld, die stoor van die eerste letter van jou vereis skakel veld in 'n aparte kolom op insetsel sou die oorhoofse te verminder wanneer die kies van.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top