Сведения о вопросе

HEIGTH

17:51, 26th August, 2020

Теги

javascript   jquery   sql   html   coldfusion    

Динамическая Алфавитная Навигация

Просмотров: 534   Ответов: 4

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

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

Я ищу, чтобы создать что-то вроде этого:

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

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



  Сведения об ответе

DAAA

03:52, 15th August, 2020

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

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


  Сведения об ответе

PROGA

09:18, 9th August, 2020

Вы можете использовать функцию группировки запросов для вашего запроса записей. Очевидно, что вам придется изменить поля запроса в соответствии с вашими данными, и функция 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>


  Сведения об ответе

LAST

10:22, 4th August, 2020

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

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

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


  Сведения об ответе

lool

14:45, 1st August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться