- לינווייט - תשתיות תוכן וקהילה
- אמנון לבב - לבבי מדריכים
נשאלתי האם נכון לשנות/להוסיף/לעבד מידע בשלב ה-theming, והאם אין זה סותר את עיקרון הפרדת הרשויות (הפרדת תוכן מעיצוב).
ובכן, שלב ה-theming הוא מעין שלב ביניים בין ייצור התוכן, לבין הצגתו. בשלב זה אנחנו אמורים לקבל נתונים, לעשות איתם משהו, ולהחזיר HTML או כל פלט אחר.
לא פעם קורה שהנתונים שאותם אנחנו מקבלים הם נתונים חסרים ועלינו להשלימם. במצב אידאלי, היינו מקבלים לפונקצית ה-THEME שלנו את הנתונים המדוייקים, לא יותר ולא פחות, והיינו צריכים להתרכז בעיצובם בלבד, אלא שפעמים רבות אין זה המצב.
לתפישתי, אין שום פסול במשיכת מידע נוסף לגבי פוסט מסוים בשלב ה-Theming, בייחוד כשהאלטרנטיבה היא שינוי קוד של מודול אחר (שלא תעיזו!), או כתיבת קוד מסובך כלשהו לעקוף את המעקף. דוגמה קצרה תמחיש את העניין:
עלינו להציג רשימה של פוסטים בבלוג, כאשר הפוסט הראשון בלבד צריך לקבל עיצוב שונה משל שאר הרשומות. אנחנו מקבלים רשימה של אייטמים, שעבור כל אחד מהם הפונקציה הדפולטיבית תייצר HTML מסוים (שורה בטבלה, DIV כלשהו, אלמנט ברשימה... תלוי בהגדרות הוויו שלנו). כעת עלינו לומר לפונקציה - תעשי בדיוק מה שאת עושה, חוץ מאשר לאייטם הראשון, שאותו תחזירי באופן שונה (ואז יש לספק מידע נוסף לגבי אייטם זה).
ל-VIEW שלנו נקרא myblog, והוא מרונדר כרשימה. הפונקציה שתדרוס אותו, במקרה זה, תהיה:
<?php
function phptemplate_views_view_list_myblog($view, $nodes, $type) {
$items = array();
if(count($nodes)) {
$first_node = array_shift($nodes);
$output = theme('the_first_node', $first_node);
foreach($nodes as $item) {
$items[] = theme('the_rest_of_the_nodes', $node);
}
if (count($items)) $output .= theme('item_list', $items);
return $output;
}
}
?>הסבר: אני מפריד את האייטם הראשון ומרנדר אותו בנפרד. אני יכול למשוך עליו מידע נוסף (תגובות וכו') ולהוסיף אותו לתצוגה. האייטם הראשון ירונדר בעזרת פונקציה שתיקרא: theme_the_first_node, ואילו שאר האייטמים ירונדרו בעזרת הפונקציה theme_the_rest_of_the_nodes