Вопрос

я использую ColdFusion чтобы вернуть набор результатов из базы данных SQL и превратить его в список.

Мне нужен способ создать алфавитную панель навигации для этого списка.У меня есть ColdFusion и библиотека jQuery.

Я хочу создать что-то вроде этого:

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

При нажатии на одну из букв вы перейдете вниз по странице к первому элементу этой буквы.Не обязательно используются все 26 букв алфавита.

Это было полезно?

Решение 4

Итак, было много хороших предложений, но ни одно из них не дало именно того, что я хотел.К счастью, я смог использовать их, чтобы понять, чем я действительно хочу заниматься.Единственное, что не делает следующая команда, — это выводит несколько последних неиспользованных букв (если они есть).Вот почему я использую этот оператор 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>

Другие советы

Чтобы создать панель навигации, вы можете сделать что-то вроде этого:

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

Я бы хотел, чтобы набор результатов SQL возвращал список в первую очередь, вы можете легко просто взять первую букву требуемого элемента и подсчитать.Самый быстрый способ — выполнить соединение таблицы из 26 символов (таким образом меньше манипуляций со строками).

В CF используйте значение счетчика, чтобы гарантировать, что в случае отсутствия результата вы либо отображаете только букву (как стандартный текст), либо не отображаете ее вообще.

Над сколькими строками вы собираетесь работать, поскольку могут быть лучшие способы сделать это.Например, сохранение первой буквы обязательного поля ссылки в отдельном столбце при вставке уменьшит накладные расходы при выборе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top