سؤال

أنا استخدم 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