[Skip Header and Navigation] [Jump to Main Content]
בית
דרופל ישראל
הבית של קהילת מפתחי ומשתמשי דרופל בישראל

Primary Links

  • בית
  • דרופל בעברית
  • חדש באתר
  • מדריכים
  • תמיכה
  • לוח דרושים
  • נותני שירות בדרופל
  • אתרי דרופל ישראליים
  • שאלות נפוצות
  • ארועים והדרכות
בית » יומן » הבלוג של סילבר הארוך

היבטים: מדריך להצגת פוסט אחרון של כל משתמש

סילבר הארוך, ד', 02/11/2011 - 07:04

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

להקל על הקוראים אני מקדים רשימה של תחומים שאגע בהם במדריך:

- הֶקשרים (RELATIONSHIPS)
- עיצוב שדות על ידי הUI של VIEWS.
- אַחֵד לפי (group by)
- הצגת שדה פעם אחת (Distinct)
- הדפסת VIEW עם משתנים (arguments או FILTERS contextual)

הנושא הפעם הוא views (היבטים). אני אסביר איך לעשות דברים בהיבטים 3, ומדי פעם אעיר הערות על 2. הסיבה המאד פרוזאית היא שמהר מאד עברתי ל3, אז שם יותר קל לי להדגים.
למי שלא יודע, היבטים הם בעצם UI שמאפשר לנו לבנות שאילתות SQL ולהציג אותם. לשלוף נתונים ממסד הנתונים- ולהציג אותם בדרכים שונות.
טוב, כל עוד מה שאנחנו עושים בהיבטים הוא להציג, נניח, את כל הכתבות האחרונות, זה קל ופשוט, יחסית.
לדוגמה: להציג את כל הפוסטים האחרונים בבלוגים, בלי הבדל דת גזע ומשתמש. מה אנחנו עושים במקרה כזה?

פותחים היבט רגיל של תוכן, הולכים לADD FILTER -מספר 1 בתמונה 1- ומוסיפים מסנן: תוכן:סוג, ומסמנים שרק דפים מסוג בלוג יופיעו. יופי, יש לנו רשימה של כל הבלוגים האחרונים. כמובן, נעביר את הצג (display - 2) למצב "שדות", ונבחר אלו שדות אנחנו רוצים: כותרת, גוף הבלוג וכו'
מה יקרה אם אנחנו רוצים להוסיף לכל בלוג את תמונת המשתמש? זה פחות קל. אם ננסה להוסיף שדה (FIELD) של תמונת המשתמש נגלה שהיבטים לא מציע לנו את זה ברשימת שדות. למה?
כי היבטים שולף מידע מטבלה (אבסטרקציה של טבלה, למעשה), ובטבלת התוכן (nodes) אין את התמונה של המשתמש. במקרה זה אנחנו צריכים להפעיל את RELATIONSHIPS (הֶקשרים). מה זה הקשרים?
הקשרים, למי שקצת מדבר אסקיואלית מצויה, הם הJOINS של היבטים. אני לוקח נתון מטבלה מסויימת (במקרה שלנו,לוקח מטבלת תוכן את הID של מחבר הבלוג- UID) ובאמצעותו שולף תוכן מטבלה אחרת, במקרה שלנו תמונת המשתמש מטבלת משתמשים.

איך עושים את זה בפועל? הולכים ל RELATIONSHIPS (הקשרים- 3). בהיבטים 3 ייתכן שזה מוסתר בתוך שורה מקופלת שנקראת ADVANCED- מספר 4 בתמונה 1. מוסיפים הקשר (באותה דרך שמוסיפים שדה, פילטר וכל דבר בערך בהיבטים). בוחרים "תוכן:מחבר". זה אומר שהיבטים ישלוף לי עכשיו נתונים מטבלת המשתמשים על פי הID של מחבר הבלוג (UID). אני מתעלם כרגע מכל האפשרויות שם, שלא לסבך את העסק.
עכשיו נחזור ל"הוסף שדה", ננסה להוסיף שדה ונגלה שמגוון השדות רחב בהרבה. נבחר משתמש: תמונה, והנה מופיעה לנו גם תמונה.
נניח שאני רוצה רק את הפוסטים האחרונים? חמש עשר? אין שום בעיה. בוחרים מספר פריטים (תחת הסעיף PAGER, או ITEMS)- מספר 6.
טוב, עד כאן זה היה קלי קלות. פיסה של עוגה או משהו כזה.

עכשיו, נניח שהלקוח שלי בא ואומר שהוא רוצה דף שיציג, את הפוסט האחרון בבלוג של כל משתמש. ברגע הראשון זו נשמעת משימה קלה, אבל היא לא. למעשה, גם אם תכתבו SQL טהור, זה לא יהיה כל כך פשוט ליצר שאילתא כזו (אני לא אומר שזה קשה, אני אומר שזה לא קל). בהיבטים זה עוד פחות קל.
ולמה? כי הוא מבקש ממני בעצם ליצור שני LIMIT (הגבלת תוצאות) שונים, שאינם מבוססים על אותו טור בטבלה, וLIMIT הרי מבוסס על SORT (סדר על פי ערך). כשאני אומר לשרת SQL לעשות שני SORT הוא יכול, אבל הוא יעשה את זה קודם על פי פרמטר אחד ואחר כך על פי השני. (כלומר, בשורות שבערך שעל פיו נקבע הSORT הראשון, שיש להם ערך שווה או ללא ערך, הוא ישתמש בשני) אי אפשר לערבב שניים.

פתרון על ידי מודול

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

פתרון של כתיבת SQL טהור

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

פתרון מובנה בהיבטים

יש בהקשרים, אם עושים אותם מטבלה מבוססת משתמשים, אפשרות מסקרנת שנקראת משתמש: Representative node -מספר1 בתמונה 3 שנראית כאילו זה בדיוק מה שהיא עושה. הצרה שנכון להיום יש בה באגים, למיטב ידיעתי

עיקר המדריך: שני פתרונות

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

הדרך הראשונה

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

נחזור אל ההיבט שעשינו קודם, של כל הפוסטים האחרונים בבלוגים של כל היוזרים. עכשיו, אנחנו רוצים להדפיס רק את הפוסט האחרון של כל יוזר. איך נעשה את זה?
קודם כל, נוסיף שדה: משתמש.
נלך אל הכותרת "פורמט" (format). שם, מימין, אפשר לבחור איזה פורמט השורות יוצגו היבטים בא עם כמה אפשרויות, ויש מודלים שמוסיפים אפשרויות נוספות. נשאיר על UNFORMATTED LIST, והפעם נטפל בקישור משמאל ל"פורמט"(8) שנקרא "הגדרות"(7). נלחץ ונראה אפשרות של GROUP BY. GROUP BY (או: אַחֵד לפי) בעצם מאפשר לנו לסדר את התוצאות שלנו לפי אחד השדות. אנחנו נבחר לאחד על פי השדהL משתמש, והנה לנו בPREVIEW תוצאות מסודרות לפי משתמשים. רגע, עדיין יש לנו את כל הפוסטים פר משתמש, ולא רק את הראשון? נכון, אבל התקדמנו.
והנה התעלול: נכנס לקובץ VIEW-VIEWS-UNFOMATTED.TPL.PHP שנראה כך. עכשיו נוסיף בשורה 14, לפני הסימן "?>" ירידת שורה (אנטר) ואז :"BREAK;".
מה שזה עושה בפועל, זה אומר לדף להדפיס שורה אחת, ואז לעצור את הלולאה. הסבר על לולאות ראה כאן דרופל יעשה את זה על כל קבוצה, וככה נקבל את התוצאה הראשונה של כל משתמש. רגע, אבל התוצאות לא מסודרות טוב (כשיש יותר מדף אחד)? נוסיף SORT על פי UID וראה איזה פלא, התוצאות גם מסדרות טוב.
הצלחנו, נשמע טוב, הא?

אז זהו, שזה פתרון גרוע.
למה?

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

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

פתרון שני: היבט בתוך היבט

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

ניצור היבט של כל המשתמשים:
נפתח היבט על פי משתמשים (תמונה 2).
בתוך ההיבט, נוסיף הקשר : משתמש: Content authored- מופיע בתמונה 2 מספר 3. הכוונה היא שהוא יקשר בין משתמש לתוכן שהוא כתב. כדי להציג רק את המשתמשים להם יש רשומת בלוג, נוסיף פילטר תוכן:סוג, ונסמן את הצ'קבוקס של בלוג. דבר זה יגרום שיופיעו רק משתמשים עם פוסטים מסוג בלוג. אבל אויה! נראה שחלק מהם מופיע יותר מפעם אחת!
אל חשש. בעמודה השמאלית נלחץ על QUERY SETTING- מספר 9 בתמונה 1, ונסמן את Distinct. דבר זה ישמור על כך שתוצאה לא תופיע יותר מפעם אחת.
נאמר לVIEWS כמה תוצאות (משתמשים) אנחנו רוצים בכל דף.
עכשיו אנחנו רוצים שהיבטים ידפיס בדף את המספר (UID) של כל יוזר, ללא תוספת HTML. שימו לב מה אנחנו עושים כאן, זה מלמד אותנו הרבה על עיצוב הHTML בVIEWS (אם כי דומני שרק בשלוש).
קודם כל, נחליף ב"הצג" מ"תוכן" ל"שדות".
נוסיף שדה: UID (בדף/אוברלאי של הוספת שדה יש חלונית חיפוש קטנה).
אז אחרי שבחרנו UId, בדף הקונפיגורציה של השדה(תמונה 4), נוריד את הצ'קבוקס הדפולטיבי, ששדה זה יקושר לבעליו(תמונה 4- 1).
נאמר לו לא ליצור תוית. (תמונה 5)
בSTYLE SETTING (שגם הוא בדף הקונפיגורציה של השדה) נחפש את Customize field HTML וCustomize field and label wrapper HTML, ונסמן אותם. בשניהם, בHTML ELEMNT נבחר NONE. (תמונה 4- 1 ו2) יופי, יש לנו היבט שמדפיס את כל המספרים של כל היוזרים, ללא HTML. נקרא לו, נניח ALL_UID.
בסדר. נפתח את הדף VIEWs-VIEW--ALL_UID.php.tpl, ונכתוב את הHTml שאמור להקיף את דף הבלוגים שלנו.
עכשיו נפתח עוד VIEW, חדש של תוכן. נקרא לו נניח "blog_per_user". נשים בו את כל מה שאנחנו רוצים: בלוג, כותרת, טיזר, וכו. על ידי הקשרים נוסיף את התמונה- כמו שעשינו קודם.

כאן מגיע ה"טריק":
אנחנו פונים לעוד אופציה מתקדמת של היבטים:FILTERS contextual- תמונה 1- 10. בהיהבטים 2 זה נקרא ARGUMENTS. אלו בעצם פילטרים לא לפי ערך קבוע מראש כמו בפילטרים רגילים, אלא על פי משתנים שנמצאים בURL. כבר כתבתי על זה כאן
אנחנו מוסיפים FILTERS contextual ובוחרים UID. עכשיו מה שקורה הוא שכשיופיע מספר 2 בURL (אם נניח הPATH שנקבע לדף הזה בהיבטים הוא users_posts_all/%, אז כאשר גולש ייכנס ל users_posts_all/2), היבטים יראה רק את הפוסטים של יוזר מספר 2 וכו'.
נגביל כעת את מספר הפוסטים לאחד, לאחרון מביניהם. (ברירת מחדל של SORT). עכשיו כל דף כזה יופיע לנו רק רשומה אחת, זו האחרונה, של כל יוזר. איך נדפיס את כולם באותו דף?

אנחנו פותחים קובץ בשם VIEWs-VIEW-fields--ALL_UID.php.tpl. שם אנחנו מוחקים הכל וכותבים את השורה הבאה:

<?php
  
echo views_embed_view("blog_per_user ","page",$fields['uid']->content);
?>

בקובץ עצמו לא לכתוב בסוף ?<. עשיתי את זה רק כדי שהאתר כאן ידע להדפיס את זה צבעוני

עכשיו נסביר לאט לאט.
הפונקציה views_embed_view פשוט מדפיסה היבט. יש לי היבט שקבעתי בUI של היבטים? אני יכול להדפיס אותו בכל מקום על ידי הפונקציה הזו.
בפונקציה יש שלוש משתנים: הראשון הוא שם ההיבט (השם שנתנו לו בהתחלה, שם מכונה, לא הכותרת או הPATH. ניתן לראות מהו על פי הURL של דף עריכת ההיבט) השני הוא שם הDIPLAY (מִינִי היבט? איך מתרגמים את זה?) השלישי והלאה הם ארגומנטים שעוברים להיבט, ממש אלו שאנחנו קובעים בFILTERS contextual. אז אמרתי לו להדפיס היבט מסוג בלוגים, את הדיספלי שהוא דף, הראשון בין הדפים.
כעת לעיקר: בתור ארגומנט, contextual FILTER, הכנסתי לדרופל משתנה. המשתנה הזה הוא בעצם השדה של מספר היוזר, כפי שהוא מופיע בדף VIEWs-VIEW-fields--ALL_UID.php.tpl שהוא בעצם הגרסה של ההיבט שלנו לVIEWs-VIEW-fields.php.tpl.
אז מה שיקרה הוא שההיבט ה"חיצוני" של כל המשתמשים ידפיס את כל הUID של משתמשים שיש להם רשומות בלוג. ובכל פעם שהוא ידפיס אחד כזה הוא בעצם ידפיס היבט של הבלוג האחרון של כל משתמש. אז הנה השגנו מה שרצינו.
עיצוב יבוצע בששת קבצי הTPL- אלו של ההיבט של כל היוזרים ("חיצוני" יותר) ואלו של פוסט פר יוזר.
פתרון זה כמובן לא חף מחסרונות, אבל נדמה לי שלפעם אחת זה פוסט מספיק, לא?
לשאלות הערות והבהרות ניתן להגיב.

 

 

קובץ מצורףגודל
views.png66.26 קילובייט
  • הבלוג של סילבר הארוך
  • חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.
התמונה של גגה

יצחק , בלוג מאד מעניין - כל הכבוד.

נכתב ע"י גגה ביום ד', 30/11/2011 - 11:01.

אני מנסה להבין ולחשוב בקול רם.
יש סיכוי מאד סביר שלא הבנתי כ"כ את הבעיה...
האם לא ניתן להציג את כל הבלוגים של כולם.
ואז ליצור group by user-id.
תוצאה: כל הבלוגים ממויינים לפי user-id .
ואז מה שנותר הוא limit 5 או משהו כזה.
כי בהמון אתרי פורטל כגון: וואלה או נענע או ynet וכו'
ניתן לראות שיש בדך הבית קטגוריות כמו למשל:
חדשות / ספורט / יהדות / תרבות / כלכלה וכו'
ובכל אחד יש 5 "פוסטים" אחרונים. - כולל עיצוב יפה לפוסט הראשון.
מה נראה לך?
הוספתי דיון פה לגבי הבעיה:
http://www.drupal.org.il/content/views-group-limit

  • חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.
התמונה של סילבר הארוך

תראה,

נכתב ע"י סילבר הארוך ביום ו', 02/12/2011 - 10:35.

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

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

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

  • חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.
התמונה של גגה

בהחלט ייתכן שפישלתי?!?

נכתב ע"י גגה ביום א', 04/12/2011 - 13:12.

יצחק, - (סילבר)
אני חייב לומר כי אני נהנה מאד מאד לקרוא את היומן של את הדיונים ואת המדריכים שלך הם עזרו ועוזרים מאד ולי באופן אישי.
אני חייב לציין כי בעבר הייתה לי דרישה כזו,
http://www.drupal.org.il/content/%D7%94%D7%99%D7%91%D7%98-%D7%A9%D7%9C-%...
שים לב לסוף התגובה שם....
והפתרון של tsi ....
לא התכוונתי שהפתרון שלך לא היה נכון.
ואם לומר את האמת, אני לא כ"כ בטוח שאתה לא צודק ב 100% וזה הפתרון, פשוט ניסיתי להבין מה הדרך הנכונה, והבעיה שאתה פותר כאן בדיון אכן בעיה שלי אין פתרון פשוט!!! ( הגבלת התוצאות ).
1. תודה רבה על פוסט מדהים. אודות ה views
2. התנצלות על כך שלא הובהרתי נכון.
3. אני אנסה למצוא פתרון מקווה לפתור את הבעיה הזו.... ולשתף.
4. שוב תודה.

  • חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.
התמונה של גגה

במודול blog יש על זה דיונים.

נכתב ע"י גגה ביום ב', 26/12/2011 - 13:45.

הי סילבר,
http://drupal.org/node/31321
שים לב שממש על זה מדובר שם.
כולל פתרונות.

  • חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.

איפה מתחילים ולאן ממשיכים?

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

להורדת דרופל בעבריתלשפות וגרסאות אחרות, Drupal.org

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

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

שלום אורח

כניסה|הצטרפות

כעת מחוברים 2 משתמשים מזוהים, ו-6 אורחים:
ami7878, גגה

alechko הוא החבר הכי חדש בקהילה!

דרופל ישראל בפייסבוק דרופל ישראל בטוויטר דרופל ישראל ב-LinkedIn

חדש בדיונים בפורום

  • taxonomy vs entity reference |‏ alechko
  • LAPP במקום LAMP |‏ hodspot
  • האם דרופל יכול לבנות אתר כמו י... |‏ hodspot
  • Web programmer |‏ meiravshir
  • server/Client Web Developer |‏ meiravshir
עוד בפורום

חדש בבלוגים

  • ecommerce module |‏ avrilev
  • הסרת שיער בלייזר |‏ Alex Borodach
  • ערכת עיצוב חדשה FontFolio... |‏ ישראל
  • Mobile Drupal - סיכום הדרכה |‏ לבבי
  • תרגום אוטומטי של ממשק האתר באת... |‏ לבבי
עוד בבלוגים

אירועים והדרכות קרובות

אין פעילויות להצגה. יאללה, מי מארגן משהו?

ללוח האירועים המלא

חדש באתרים ישראלים

  • טבעוני תוספי תזונה |‏ morantivo
  • עוגת הגבינה של ישראל - ישראל ה... |‏ zohar
  • דורמטיק - דלתות אוטומטיות |‏ ענת כהנא
  • הכוורת - אתר מבוסס קומונס |‏ אמנון דפני
  • אוצר היום - ישראל היום |‏ zohar
עוד אתרים ישראלים
Powered by Drupal, an open source content management system
אירוח ופיתוח האתר באדיבות לינווייט - דרופל , אנדרואיד וקוד פתוח
עיצוב, קסמי css וערכת העיצוב טנדו - תום ביגלאייזן
שותף לדרך - אמנון לבב - ייעוץ משולב
דרופל ישראל הינה חלק מרשת הקנטינה
"כללי המשחק" ותנאי השימוש באתר
[Jump to Top] [Jump to Main Content]