להמנע מ-template.php מפלצתי בדרופל

כך תבצעו קריאה ל-hook_theme מתוך מודול בדרופל.

אחת הדרכים המובילות בדרופל 6 (ודרופל 7) לבצע שינויים באלמנטים שונים היא להשתמש בפונקצית theme. כך למשל, אם אני רוצה לשנות את הדרך שבה checkbox מוצג באתר אני אקח את פונקצית theme_checkbox שיש בדוקומנטציה, אעתיק אותה ל-template.php ואשנה את השם שלה בהתאם ל-theme שאני משתמש בו וכך אוכל לשנות את הפונקציה ובכל checkbox שמוצג הפונקציה שלי תרוץ.

בעוד שהשיטה הזו לגיטימית, היא בעייתית משתי סיבות עיקריות:
1. זה גורם להתנפחות ה-template.php
2. כאשר אני בונה מודול, אני לא יכול לבקש מהמשתמש להכניס theme.

סעיף 2 יותר חשוב לי, אני אוהב לבנות את המודולים שלי כקופסאות ��גורות – גם אם זה מודולים ייעודיים שאני מפתח המיועדים לאתר אחד. אני לא רוצה לסמוך על זה שיש פונקצית theme ב-template.php. מחר בבוקר ירצו לשנות את התמה או לשדרג ואז מה? עדיף שכל מה שקשור למודול יהיה בתוך המודול.

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

נשמע מסובך? הכל פשוט עם דוגמא. מה שהמודול שלי עושה הוא לשנות את ה-checkbox לצורך כלשהו. אני צריך שהפונקציה שלי תרוץ במקום theme_checkbox.

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

אחרי כן אני אשתמש ב-hook_theme_registry_alter על מנת לשנות את פונקצית ה-theme ל-MY_MODULE_checkbox.

בדיוק כך:


/**
 * Implementation of hook_theme_registry_alter().
 *
 * @param $theme_registry The entire cache of theme registry information, post-processing.
 */

function MY_MODULE_theme_registry_alter(&$theme_registry) {
  if (!empty($theme_registry['checkbox'])) {
    $theme_registry['checkbox']['function'] = 'MY_MODULE_checkbox';
  }
}

/**
 * MY_MODULE implementation of theme_checkbox
 * @param $element the checkbox element
 */
function MY_MODULE_checkbox($element) {
  _form_set_class($element, array('form-checkbox'));
  $checkbox = '<input ';
  $checkbox .= 'type="checkbox" ';
  $checkbox .= 'name="' . $element['#return_value'] . '" ';
  $checkbox .= 'id="' . $element['#id'] . '" ';
  $checkbox .= 'value="' . $element['#return_value'] . '" ';
  $checkbox .= $element['#value'] ? ' checked="checked" ' : ' ';
  $checkbox .= drupal_attributes($element['#attributes']) . ' />';

  if (!is_null($element['#title'])) {
    $checkbox = '<label class="option" for="' . $element['#id'] . '">' . $checkbox . ' ' . $element['#title'] . '</label>';
  }

  unset($element['#title']);
  return theme('form_element', $element, $checkbox);
}

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

פוסטים נוספים שכדאי לקרוא

בינה מלאכותית

איך אייג׳נט מבוסס LLM עובד?

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

פתרונות ומאמרים על פיתוח אינטרנט

מודל הרשאות מבוסס טוקנים/ססמאות לעומת OIDC

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

פתרונות ומאמרים על פיתוח אינטרנט

לא פרצו לנו, רק דלף לנו – לקחים טכניים מפרשת אלקטור

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

פתרונות ומאמרים על פיתוח אינטרנט

מדרך מעשי לכתיבת קוד עם AI Agents

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

גלילה לראש העמוד