我使用ColdFusion
從SQL數據庫返回結果集並將其變爲列表。動態字母導航
我需要一些方法來爲該列表生成一個按字母順序排列的導航欄。我有ColdFusion和jQuery庫可用。
我期待產生這樣的事情:
A | B | C | ...
- A
- A
- B
- B
- B
- C
- D
當點擊一個字母,你滴下來的頁面,那封信的第一個項目。並非所有26個字母都必須使用。
我使用ColdFusion
從SQL數據庫返回結果集並將其變爲列表。動態字母導航
我需要一些方法來爲該列表生成一個按字母順序排列的導航欄。我有ColdFusion和jQuery庫可用。
我期待產生這樣的事情:
A | B | C | ...
- A
- A
- B
- B
- B
- C
- D
當點擊一個字母,你滴下來的頁面,那封信的第一個項目。並非所有26個字母都必須使用。
所以,有很多很好的建議,但沒有一個完全符合我的要求。幸運的是,我能夠使用它們來弄清楚我真正想要做什麼。以下唯一不能做的是打印最後幾個未使用的字母(如果有的話)。這就是爲什麼我有CFIF聲明檢查「W」因爲這是最後一個字母我用,否則應檢查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>
我會得到SQL結果集以返回列表中的第一個位置,您可以輕鬆獲取所需項目的第一個字母和一個計數。最快的方法是在一個26個字符的表上進行連接(少用字符串操作)。
在CF中使用計數值,以確保如果沒有結果,你要麼只顯示字母(作爲標準文本),要麼不顯示它。
您打算處理多少行,因爲可能有更好的方法來做這件事。例如,將所需鏈接字段的第一個字母存儲在插入的單獨列中可以減少選擇時的開銷。
要生成導航欄,你可以做這樣的事情:
<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不上字符工作,所以你必須要轉換成ASCII碼和背面)
要顯示查詢中的項目,你可以做這樣的事情。
<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>
您可以在查詢記錄時使用查詢分組功能。您顯然必須根據您的數據更改查詢字段,並且根據您的數據庫引擎,left()函數可能是不同的語法。下面的查詢適用於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>
唯一的問題是它不打印未使用的字母。它只打印使用的字母,這是我開始的另一個極端。 – alexp206 2008-09-16 18:43:32
這是在尋找最終的答案非常有幫助的,遺憾的是它並沒有禁用字母沒有被使用。我已經發布了我的最終解決方案,但無法弄清楚如何讓它成爲社區答案。 – alexp206 2008-09-16 19:00:18