אינטרנט ישראל
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
ראשי » פיתוח אינטרנט » פתרונות ומאמרים על פיתוח אינטרנט » מודול בדרופל 6/7 לשליחת מייל בכל פרסום

מודול בדרופל 6/7 לשליחת מייל בכל פרסום

רן בר-זיק דצמבר 26, 2010 8:14 am אין תגובות

מודול בדרופל 6 ו-7 ששולח מייל עם מידע על כל תוכן שפורסם על ידי משתמש כלשהו באתר.

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

באחד הפרויקטים האחרונים שלי, נתקלתי בדרישה מעניינת – משלוח מייל למנהל האתר בכל פעם שיש פרסום כלשהו בדרופל. בדרך כלל אני משתמש להתראות כאלו במודול Triggers (שמובנה בליבת דרופל) או במודול Rules. הבעיה היא שהדרישה היתה שמשלוח המייל יקרה לא בשעת יצירת התוכן אלא בשעת הפרסום (published) שלו שיכול להיות בשעה שונה לחלוטין מהשעה שבה הוא נוצר. בנוסף, אם התוכן פורסם בעבר ואני עורך אותו מחדש ועושה לו שוב publish, הדרישה היא שהוא לא ישלח מייל.

איך עושים את זה? באמצעות מודול מהיר שייצרתי לצורך העניין. מה המודול עושה? אני מכניס וולידציה לטופס יצירה/עריכה של node. הוולידציה, שרצה לאחר הוולידציות האחרות – בודקת את מצב ה-node. במידה והוא חדש והוא published, היא תשלח מייל למנהל האתר (user 1). במידה והוא ישן, היא תבדוק את מצבו הקודם באמצעות node_load, במידה והמצב משתנה מ'לא מפורסם' ל'מפורסם', יישלח מייל. במידה ולא, דבר לא יקרה.

אני יוצא מנקודת הנחה שכל מי שממשיך לקרוא טרח לקרוא את המאמר הקודם שלי על יצירת מודולים בדרופל 6 ו-7. המאמר מסביר על בניית מודולים ועל קובץ info ומה זה hook. שם המודול בדוגמה הזו הוא: mail_admin_on_publish.

איך עושים את זה בדרופל 6? בקלי קלות! ראשית אנו נשתמש ב-hook_form_alter על מנת להכנס ל-form ולהוסיף לו פונקצית וולידציה נוספת:


< ?php 
/**
 * 
 * Implementation of hook_form_alter - adding validation function
 * @param $form
 * @param $form_state
 * @param $form_id
 */
function mail_admin_on_publish_form_alter(&$form, &$form_state, $form_id) {
	$form['#validate'][] ='mail_admin_on_publish_validate';
}


שם פונקציה הוולידציה הוא כמובן mail_admin_on_publish_validate. הפונקציה הזו היא ליבת המודול:


/**
 * 
 * Validation function for adding form. checks if node is published. 
 * @param $form_id
 * @param $form_values
 */

function mail_admin_on_publish_validate($form_id, $form_values) {
	if($form_values['values']['status'] == '1') {	
		$form_values['values']['nid'] ? $node = node_load($form_values['values']['nid']) : $node = $form_values['values'];
		if($node->status == '0')  { //If it is updated from unpublished to published
			$params = array(
			  'title' => $node->title,
			  'type' => $node->type,
			  'path' => $node->path,
			  'teaser' => $node->field_teaser[0][value],
			  'lang' => $node->language,
			);
			drupal_mail('mail_admin_on_publish', 'invitation', user_load(1)->mail , language_default(), $params);
		}
		if  (!$form_values['values']['nid']) { //If it brand new and published already.
			$params = array(
			  'title' => $node[title],
			  'type' => $node[type],
			  'path' => $node[path],
			  'teaser' => $node[field_teaser][0][value],
			  'lang' => $node[language],
			);
			drupal_mail('mail_admin_on_publish', 'invitation', user_load(1)->mail , language_default(), $params);
		}
		
	}
}

בפונקצית וולידציה עוברים באופן אוטומטי, נרצה או לא נרצה, שני פרמטרים – form_id שהוא בעצם ה-id של הטופס (אני לא משתמש בו פה) ושנית ה-form_values שמכיל את כל הערכים של הטופס – כלומר רוב המידע על ה-node החדש או זה שנערך.

ראשית אני בודק באמצעות התנאי $form_values['values']['status'] אם בכלל המשתמש פרסם את ה-node או לא. כי אם המשתמש לא סימן את תיבת ה-publish בטופס, אין לי ממש מה לעשות איתו. במידה וכן, אני אמשיך הלאה.

אחרי כן אני מאכלס את משתנה node שאותו אצטרך למשלוח המייל (כדי לשלוח כל מני פרמטרים כמו שם ה-node, השפה שלו וכו' וכו'). במידה ויש לטופס nid, סימן שה-node קיים כבר וה-node_load יעבוד. במידה ולא, מדובר ב-node חדש דנדש והוא יקבל את הערכים של הטופס. כך או כך, אני צריך node$ ואת זה אני מקבל.

ועכשיו למבחן האמיתי, בתנאי הראשון if($node->status == '0 אני בודק אם הסטטוס של ה-node שנטען באמצעות node_load הוא unpublished, כיוון שבמידה והוא כבר published, מדובר בעדכון של node קיים ומפורסם ואין לי מה לעשות איתו. במידה וכן, אני מאכלס את מערך params שישמש אותי במשלוח המייל ויורה את המייל שלי באמצעות פונקצית drupal_mail.
בתנאי השני,


 !$form_values['values']['nid']

אני בודק אם מדובר ב-node חדש. אם הוא חדש, לא יהיה לי nid (כיוון שהטופס הוא לפני וולידציה). אני מאכלס את הפרמטרים שאני רוצה (שימו לב שמשתנה node כאן מעט שונה ממה שאני מקבל ב-node_load) ומשתמש ב-drupal_mail.

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

תוכן המייל נקבע באמצעות hook_mail באופן הבא:


/**
 * 
 * Implementation of hook_mail
 * @param string $key
 * @param array $message
 * @param array $params
 */

function mail_admin_on_publish_mail($key, &$message, $params) {
  switch ($key) {
    case 'invitation':
      $message['subject'] = t('@title is published', array('@title' => $params['title']));
      $message['body'] = t('type: @type. url: @path. teaser: @teaser', array(
      		'@type' => $params['type'], 
      		'@path' => $params['path'],
      		'@teaser' => $params['teaser']));
      break;    
  }
}

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

ו… זהו! לפחות בדרופל 6. מה עם דרופל 7?
בדרופל 7 אין שום שינוי ב-API בנוגע לכל הפונקציות שהשתמשתי בהן – ולפיכך המודול מתאים גם לדרופל 7!

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.
דרופל סקריפטים

השארת תגובה

ביטול

ללמוד ג'אווהסקריפט בעברית

ללמוד לתכנת ג'אווהסקריפט בעברית שגייס יותר משלוש מאות אלף שקל ולמעלה מ-2000 תומכים - בואו ללמוד עכשיו איך לתכנת.

רשימת הנושאים
  • מדריכים
    • ריאקט
    • טייפסקריפט
    • ECMAScript 6
    • ES20XX
    • Node.js
    • Express
    • רספברי פיי
    • Babel
    • docker
    • MongoDB
    • Git
    • לימוד MySQL
    • SASS
    • jQuery
    • CSS3
    • HTML 5
    • SVN
    • LESS
  • פיתוח אינטרנט
    • פתרונות ומאמרים על פיתוח אינטרנט
    • jQuery Scripts
    • jQuery למתקדמים
    • יסודות בתכנות
    • נגישות אינטרנט
  • חדשות אינטרנט
  • מידע כללי על אינטרנט
    • רשת האינטרנט
    • בניית אתרי אינטרנט
  • rss logo

    לכל המאמרים

    לכל המאמרים שפורסמו באינטרנט ישראל משנת 2008 ועד עכשיו.
  • rss logo

    RSS Feed

    משתמשים בקורא RSS? אם כן, עקבו אחרי אינטרנט ישראל באמצעות פיד ה-RSS!
    מה זה RSS?
  • Twitter logo

    עקבו אחרי בטוויטר

    בחשבון הטוויטר שלי אני מפרסם עדכונים מהירים על חדשות בתחום התכנות והיזמות, התרעות על מצבי חירום ורכילות בוערת על תחום הווב.
    מה זה טוויטר?
  • facebook like image

    ערוץ הטלגרם של אינטרנט ישראל

    בערוץ הטלגרם של אינטרנט ישראל אני מפרסם את הפוסטים של באתר וכן עדכונים טכנולוגיים נוספים.
    מה זה טלגרם?
  • github logo

    הפרויקטים שלי בגיטהאב

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

כל הזכויות שמורות לרן בר-זיק ולאינטרנט ישראל | מדיניות הפרטיות של אתר אינטרנט ישראל | אתר אינטרנט ישראל נגיש לפי תקן WCAG 2.0 AA | הצהרת הנגישות של האתר | אבטחת מידע ודיווח על בעיית אבטחת מידע

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