מודולים בדרופל הם הכוח העיקרי שמאחורי המערכת הפופולרית לבניית אתרים ואפליקציות. בעוד שרוב הוובמסטרים ובוני האתרים משתמשים במודולים מוכנים, לעתים יש צורך לבנות מודול באופן עצמאי לצרכים שמודולים קיימים לא יכולים למלא.
מודולים בדרופל יכולים לעשות מגוון פעולות והם אינם מוגבלים. מודולים יכולים לקבל ולשדר מידע, ליצור דפים, להתלבש על דפים קיימים ולייצר רכיבים חדשים. המאמר הזה ילמד כיצד אנו בונים מודול בסיסי שיוצר לנו בלוק.
תיבה רגילה קל ליצור באמצעות הממשק של האתר. נכנסים ל-Blocks ואז ל-Add new blocks. ניתן להכניס איזה קוד שרוצים לתיבה ופיניטו לה קומדיה. אבל לפעמים אנו רוצים לייצר רכיב של ממש, הכולל תוכן דינמי שמתעדכן מהאתר ולפעמים ממקומות אחרים, עיצוב נפרד וגם ג'אווהסקריפט. הדרך הטובה ביותר לעשות את זה היא עם מודול שניתן גם להשתמש בו באתרים אחרים ולכבות אותו לפי הצורך.
קובץ המידע – info
ראשית ניצור תיקיה ואת שני הקבצים הבסיסיים של המודול שלנו שלו נקרא my_module. לתיקיה נקרא בשם המודול ולקובץ המידע נקרא בשם my_module.info. לתוכו נכניס את הנתונים הבאים:
name = my_module block
description = Module that create block.
package = My Modules
core = 6.x
version = "1.0"
core = "6.x"
כל העניין כאן הוא די self explanatory. שם המודול, שם גרסת הדרופל (core) שאיתה הוא עובד וה-package שזה הקטגוריה שתחתיה מופיע המודול כאשר אנו מפעילים אותו מהאדמין.
החלק היותר מעניין מבחינתנו הוא הקובץ השני
בניית קובץ המודול
שם הקובץ הוא my_module.module כאשר הוא חייב להיות זהה לשם של קובץ ה-info. זה הקובץ שעושה את העבודה. הוא יכול להפנות ל-inc או לכלול classים. לטעון תמונות או ג'אווהסקריפט, אבל זה הבסיס להכל. אם אתם בונים מודול שהוא OOP אז כאן תבצעו את ה-instance של ה-class. אבל אנחנו הפעם נתכנת באופן פרוצדורלי.
על מנת לעשות משהו במודולים, אנו צריכים להבין ראשית את ה-hookים. מדובר בפונקציות רבות שהפורמט שלהן הוא hook_XXXXXX כאשר אנו נחליפים את ה-hook בשם המודול שלנו. ה-hook פועל בכל פעם שיש קריאהלמשל hook_form יעבוד בכל פעם שיש קריאה למודול form. אנו ניצור hook_block שיעבוד כאשר יש לנו קריאה למודול block וניצור באמצעותו בלוק חדש דנדש.
לא הבנתם? לא נורא, נבין בהמשך. רשימת ה-Hooks נמצאת ב-Drupal.api. על מנת ליצור block אנו נשתמש ב-hook_block. יש דוגמא נהדרת לשימוש ב-hook_block בדוקומנטציה. אנו נעשה עליה copy&paste ואני אמחק את החלקים הלא שימושיים:
function my_module_block($op = 'list', $delta = 0, $edit = array()) {
if(op == "list") {
$blocks[0] = array('info' => t('Mymodule block #1 shows ...'),
'weight' => 0, 'status' => 1, 'region' => 'highlight');
return $blocks;
}
}
מה שחשוב מבחינתנו זה ה-OP. ה-OP משתנה בכל פעם שהפונקציה רצה. במידה ואנו מריצים את ממשק הניהול (modules) ה-OP יהיה שווה ל-List. במידה ואנו מריצים את הבלוקים, ה-OP יהיה שווה ל-view. ישנן עוד שתי מודים של OP שאליהם לא אתייחס כרגע.
op=list
בחלק זה של הפונקציה אנו מגדירים את הבלוק שלנו כפי שהוא יראה בממשק הניהול ברגע שהמודול יותקן. האמת היא שזה די פשוט, לכל בלוק שאנו יוצרים, יש צורך לספק כותרת, תיאור ומקום מועדף. ניתן גם לספק פרמטרים נוספים כמו weight ("המשקל" של הבלוק ביחס לבלוקים אחרים באותו איזור). במקרה הזה סיפקתי כותרת, תיאור ומקום מועדף (highlight – מקום שנמצא בתמת zen). אם אני אתקין את המודול ואפעיל אותו, אני אוכל לראות את הבלוק הזה ברשימת הבלוקים שיש בחלק של האדמין.
op=view
בחלק הזה של הפונקציה אנו מגדירים את הבלוק שלנו כפי שהוא יראה ב"רגע האמת"', כאשר המשתמש ייכנס לראות מה פה קורה פה. אנו מגדירים לבלוק גם title וגם content.
function my_module_block($op = 'list', $delta = 0, $edit = array()) {
if($op == "list") {
$blocks[0] = array('info' => t('Mymodule block #1 shows ...'),
'weight' => 0, 'status' => 1, 'region' => 'highlight');
return $blocks;
}
else if ($op == 'view') { //Create block content
switch($delta) {
case 0:
$block = array('subject' => 'BLOCK SUBJECT',
'content' => 'BLOCK CONTENT',
);
break;
}
return $block;
}
}
כאשר כמובן גם ה-content וגם ה-title יכולים לקבל תוכן מפונקציה אחרת שנמצאת במודול.
הוספת קבצי CSS וקבצי JavaScript
באופן עקרוני ניתן להוסיף את תכונות ה-CSS וקבצי ה-JavaScript שקשורים לבלוק שלנו דרך התמה הרגילה – אבל מדובר בשגיאה. ראשית, אנחנו לא רוצים לטעון CSS ו-JavaScript לא רלוונטיים במידה והבלוק לא מוצג. שנית, אם נרצה לשכפל את הבלוק למערכת אחרת או להפיץ אותו – לא נוכל לעשות זאת בקלות. הוספת קבצי CSS ו-JavaScript למודול מסוים היא פשוטה ביותר, פשוט מוסיפים שתי פונקציות פשוטות ביותר ל-op=view:
function my_module_block($op = 'list', $delta = 0, $edit = array()) {
if(op == "list") {
$blocks[0] = array('info' => t('Mymodule block #1 shows ...'),
'weight' => 0, 'status' => 1, 'region' => 'highlight');
return $blocks;
}
else if ($op == 'view') { //Create block content
switch($delta) {
case 0:
drupal_add_css(drupal_get_path('module', 'my_module') .'/my_module.css');
drupal_add_js(drupal_get_path('module', 'my_module') . '/my_module.js');
$block = array('subject' => 'BLOCK SUBJECT',
'content' => 'BLOCK CONTENT',
);
break;
}
return $block;
}
}
drupal_add_css ו-drupal_add_js הן שתי פונקציות פשוטות ומאד קלות. כל מה שעלינו לעשות זה ליצור את קובץ ה-CSS וה-JavaScript בתיקיה של המודול ו… זהו!
כך יוצרים מודול בסיסי בדרופל 6.
המרת מודול block לדרופל 7
בדרופל 7 אין לנו יותר hook_block עם op אלא לכל op יש hook משלו. באופן שמפשט את העניין לפי דעתי. בדרופל 7 אנו נפצל את ה-hook_block ל-hook_block_info שיטפל באיך שהבלוק נראה בממשק הניהול ול-hook_block_view שיטפל בהצגת הבלוק למשתמש.
כך יראה המודול המאד בסיסי שלנו בדרופל 7:
function hook_block_info() {
$blocks[0] = array(
'info' => t('Mymodule block #1 shows ...'),
'weight' => 0, 'status' => 1,
'region' => 'highlight');
return $blocks;
}
function my_module_block_view ($delta = '') {
switch($delta) {
case 0:
$block = array('subject' => 'BLOCK SUBJECT',
'content' => 'BLOCK CONTENT',
);
break;
}
return $block;
}
חשוב להדגיש שב-Drupal API יש את כל ה-hookים האפשריים בכל הגרסאות ומידע רב נוסף.