חלוקה לעמודים ב-ASP

‏ • 17 באפריל, 2002



לפעמים כאשר אנו שולפים רשומות מבסיס נתונים, כמות הרשומות גדולה מידי מכדי להציגן בדף אחד. אם נציג 100 רשומות באותו דף, לגולש יהיה זמן לאכול ארוחת צהריים, לשתות קפה ולישון סיאסטה, לפני שהדף ייסיים לעלות.

הדוגמא הקלאסים למצב זה הוא פורום. לפעמים יש בפורום מאות ואלפי הודעות, והצגתן בדף אחד בלתי אפשרית, גם מבחינת זמן, וגם מבחינת נוחיות הגולש.

לכן נהוג להחליט על מספר רשומות סביר אשר יוצג בדף, ולחולל באופן אוטומטי תפריט ניווט כדי שניתן יהיה להגיע לדפים האחרים.

אז איך עושים את זה?

קודם כל, נגדיר את המשתנים שנצטרך, מעבר למשתנים הרגילים ישי לנו בדף (recordSet, Connection וכו').


1
2
3  

<%
Dim currPage,i,pCount, numRecs
%>



  • currPage יכיל את מספר הדף הנוכחי. אותו גם נקבל ב-Request במעבר בין הדפים.
  • pCount יכיל את מספר הדפים הכולל שיש לנו
  • numRecs יכיל את מספר הרשומות שנחליט להציג בכל דף. במקרה שלנו, זה יהיה 20.
  • i ישמש אותנו כמונה בלולאות



קביעת מספר הרשומות בדף

כדי לקבוע כמה רשומות יוצגו בכל דף, אנו צריכים רק להכניס את המספר לתוך המשתנה numRecs.

numRecs = 20

משתנה זה ישמש אותנו לאורך כל הסקריפט, ואם יום אחד נחליט לשנות את מספר הרשומות שיוצגו בכל דף, נצטרך לשנות רק את השורה הזו.

איך מחליטים מהו הדף הנוכחי?

כאמור, המשתנה currPage אמור להכיל את מספר הדף הנוכחי. במקרה וזוהי הפעם הראשונה בה אנחנו נכנסים לדף, כלומר, עדיין לא השתמשנו בתפריט הניווט, אני רוצים להציג את הדף הראשון בסידרה. לכן נציב בתוכו 1.

currPage=1

לאחר מכן, נבדוק האם קיבלנו ב-Request מספר דף להצגה (כלומר, הגענו לדף בעקבות שימוש בתפריט הניווט). אם קיבלנו ערך כלשהו, נציב אותו בתוך currPage, אם לא, currPage ישאר 1.


1
2
3
4
5  

<%
If Not request("currPage") = "" Then
    currPage= Request("currPage")
End If
%>


פתיחת הרקורדסט


עכשיו נפתח את הרקורדסט


1
2
3  

<%
rs.Open "SELECT * FROM tbl", conn, 3, 1
%>


נקבע לרקורדסט את גודל הדפים (כמה רשומות יהיו בכל דף) ואת גודל ה-cache


1
2
3
4  

<%
rs.PageSize = numRecs
rs.CacheSize = numRecs
%>


עכשיו הרקורדסט "יודע" שהוא מחולק לדפים של 20 רשמות.

מעבר לדף הנוכחי

מכיוון שהקרורדסט "יודע" עכשיו את גודל הדף, הוא גם יכול לתת לנו את מספר הדפים הכללי, כלומר, מספר הרשומות שבו חלקי גודל הדף.

כמו כן, אנו יכולים להעביר אותו ישירות לדף שרצינו (currPage הנוכחי).

על מנת לעשות זאת, נעטוף את הפקודות בתנאי שיבדוק האם השאילתה שלנו החזירה בכלל רשומות, כדי להמנע משגיאה באם הרקורדסט ריק.


1
2
3
4
5
6  

<%
if Not rs.EOF Then
    pCount=rs.pageCount
    rs.AbsolutePage=CurrPage
End If
%>


עכשיו pCount מחזיק לנו את מספר הדפים הכולל, והרקורדסט עצמו, עומד על הרשומה הראשונה שמספרה CurrPage.

הצגת הנתונים

עכשיו נותר לנו רק לעבור בלולאה על הרקורדסט, ולהציג כרצוננו את הנתונים.

הרשומה הראשונה ברקורדסט היא אמנם הרשומה הראשונה בדף הנוכחי, אך עדיין, מעבר בלולאה על rs.EOF תציג לנו לא רק את הרשומות בדף הנוכחי, אלא מהדף הנוכחי והלאה. כאן בא לעזרתינו המשתנה i.

אנו נוסיף ללולאה תנאי עצירה, שיסמן לה לעצור כאשר הגענו לסוף הרקורדסט, או כאשר עברנו את מכסת הרשומות בדף (20, במקרה שלנו). אל לנו לשכוח לקדם את i ב-1 בסיום כל איטרציה של הלולאה.



1
2
3
4
5
6
7  

<%
Do While Not rs.EOF AND i < rs.pagesize
    ' Data manipulation
    i=i+1
    rs.MoveNext
Loop
%>


לולאה זו תציג לנו 20 רשומות, או, אם מדובר בדף האחרון, ויש בו פחות מ-20 רשומות, היא תציג לנו את כל הרשומות בדף.

בניית תפריט הניווט

כדי לאפשר למשתמש לעבור בין הדפים, אנו נבנה תפריט ניווט אשר יכיל קישורים לכל הדפים. תפריט זה ניתן לשכלול (הצגת מספרי העמודים בתיבת בחירה במקום כקישורים, הצגת רק 10 מספרים בכל פעם וכו').

נבנה לולאה שתרוץ מ-1 עד מספר הדפים, ותציג את המספר כקישור לאותו עמוד, ובכל פעם נשלח לו CurrPage שונה:


1
2
3
4
5  

<%
for i = 1 to pCount
    Response.Write " <a href=""thePage.asp?currPage=" & i & """>"& i & "</a> "
Next
%>


ניתן לשכלל זאת מעט, ולהציג את מספרו של הדף הנוכחי בצבע שונה, וללא קישור, כדי להקל על ההתמצאות. זאת נעשה ע"י תנאי המשווה את CurrPage ל-i הנוכחי:


1
2
3
4
5
6
7
8
9  

<%
for i = 1 to pCount
    if Cint(i) = Cint(currPage) then
        Response.Write " <b>"& i &"</b> "
    Else
        Response.Write " <a href=""thePage.asp?currPage=" & i & """>"& i &"</a> "
    End If
Next
%>


וזהו תפריט הניווט שלנו.

הסקריפט בשלמותו



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29  

<%
Dim currPage,i,pCount, numRecs
currPage = 1
numRecs = 20
if Not request("currPage") = "" then
    currPage= request("currPage")
end if
rs.Open "SELECT * FROM tbl",conn,3,1,1
rs.PageSize = numRecs
rs.CacheSize = numRecs
if Not rs.EOF Then
    pCount=rs.pageCount
    rs.AbsolutePage=CurrPage
End If
Do While Not rs.EOF AND i < rs.pagesize
    ' Data manipulation
    i=i+1
    rs.MoveNext
Loop
rs.Close

for i = 1 to pCount
    if Cint(i) = Cint(currPage) then
        Response.Write " <b>"& i &"</b> "
    Else
        Response.Write " <a href=""thePage.asp?currPage="&i&""">"& i &"</a> "
    End If
Next
%>


בהצלחה!

תגיות: , , , , ,

תגובות בפייסבוק