zend framework – Paginator
פג'ינציה
בכל רחבי הרשת נמצא אתרים המשתמשים בפג'ינציה כדי להקל על הגולשים שלהם כאשר יש צורך בהצגת תוכן ארוך במיוחד. דוגמאות לפג'ינציה נוכל למצוא למשל בתוצאות החיפוש של מנועי חיפוש. אלוהי החיפוש ברשת (גוגל) גם היא משתמשת בפג'ינציה להצגת תוצאות החיפוש.
הפג'ינציה של גוגל מציגה כמות מוגבלת של תוצאות החיפוש בדף אחד ועל מנת לראות את שאר שתוצאות, על הגולש ללחוץ על הלינק לדף הבא או הקודם. בבלוגים רבים נמצא פג'ינציה לכל הפוסטים השונים, וכך גם בפורומים.
זנד פריימוורק (zend framework) היא סיפריה של קוד הניתנים לשימוש והפועלים יחד על-מנת להקל על עבודת המפתח. זנד היא סיפריה של php והיא בנויה כmvc עם רכיבים שונים, הנפוצים באתרים רבים. כך שאם המפתח צריך לפתח אתראפליקציה, תהליך הפיתוח יהא מהיר יותר ומסידר יותר מבחינת הקוד שיכתוב. זנד היא גם ספריה גמישה מאד ,מה שאומר שאינך מחוייב לעשות דברים אך ורק בדרך אחת.
היום ארצה להראות את אופן השימוש ברכיב הפג'ינציה של זנד.
במקרה שלנו נרצה לדפדף על נתונים מבסיס נתונים ונדמה שמדובר בבלוג. אנחנו רוצים לדפדף על התוצאות של כל הפוסטים השייכים לקטגוריה מסויימת.
הקונטרולר
לא אדבר כרגע על mvc ומה תפקידו של הקונטרולר במבנה כזה. תוכלו לקרוא על כך בלינק שציינתי למעלה.
באופן כללי התהליך שזנד מצפה מאיתנו על-מנת ליישם את הפג'ינטור הוא כזה: הגדרת מישתנים הכרחיים לפג'ינטור. יצירת שאילתא לבסיס הנתונים. שליחת תוצאות השאילתא בתוספת המישתנים לפג'ינטור. ושליחת הפג'ינטור לויו (view) (שוב קיראו על mvc).
אז בקונטרולר נייצר את המשתנים הדרושים: במקרה שלנו אנחנו צריכים לומר לפג'ינטור כמה תוצאות יראו בכל דף, ומהו משתנה הGET שלפיו הפג'ינטור יעבוד:
$paginationCount = $this->config->pagination->item->count->per->page; $page = $this->_request->getParam('page');
המודל
מכיוון שאנו עוסקים בmvc את השאילתא עצמה אנחנו מייצרים במודל. נראש את הקוד של המתודה:
public function getPostsByCategory($category,$page = 1, $order = "date",$paginationCount) { //the query $query = $this->select()->from(array('posts'),array( 'posts.id','posts.title','posts.date','posts.short_desc','posts.text','posts.category_id','posts.status','posts.author' )); $query->where("category_id = ? ", $category); $query->where('status = ?', 1); $query->order('date DESC'); // Create a paginator based on query $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($query)); $paginator->setItemCountPerPage($paginationCount); $paginator->setCurrentPageNumber($page); return $paginator; }
כפי שניתן לראות המתודה מייצרת שאילתא ושולחת את התוצאות לזנד פג'ינטור. כפי שניתן לראות שלחנו את המישתנים שייצרנו בקונטרולר למתודה. כך זה בקונטרולר:
$post = new Bloging_Model_Post(); $this->view->posts = $post->getPostsByCategory(1,$page,"date",$paginationCount);
בשורה הראשונה אנחנו מייצרים מקרה חדש של המודל. ןאז שולחים למתודה שלנו את הנתונים הדרושים לה לפעולה תקינה. שימו לב שהקריאה למתודה כרוכה כבר בשליחת הפג'ינטור לויו.
הויו (view)
עתה, לאחר שיש בידינו את הפג'ינטור ותכניו עלינו להציגם לגולש. בקובץ הויו אנחנו עושים לופ לתכנים ומציגים את מה שזנד מכנים פג'יניישן-קונטרולז (שהם הלינקים של הדפים ושל כפתורי קדימה ואחורה). משום מה קוד הhtml מתעקש כל פעם להמיר עצמו חזרה ולהציג עצמו בדף כאן לא כקוד. זאת למרות שהמרתי (אפילו ידנית) את בתוים הבעייתים.
מה שבעקרון נותר לעשות הוא רק להציג את הפג'ינטור עם html.
ולמעשה סיימנו. אני מקווה שהרעיון הבסיסי והשימוש הבסיסי נהיר מהמדריך הקטן הזה. תוכלו להרחיב בנושא כאן.
אני חייב לומר שמתאי את הפג'ינטור מאד יעיל,חוץ מאספקט אחד שאני עדיין לומד אותו ובמידה שיהיו לי תוצאות אוסיף אותן כאן: איני מצליח לעשות פג'ינציה לשאילתות שאוחסנו בקובץ קאש (cache). אם מישהו שקורא מדריך זה רוצה להאיר את עיני אשמח על כך.