2011-05-03 85 views
2

是否可以在PHP switch语句中动态生成cases语句,如hook_mail()的此示例中所示?在hook_mail()中使用动态电子邮件生成

/* 
* Implement hook_mail(). 
*/ 

function rsvp_mail($key, &$message, $params) { 
    $guests = rsvp_query(); 
    foreach ($guests as $account) { 
    switch($key) { 
     case "invite $account->uid" : 
     $message['subject'] = "And invitation for $account->name"; 
     $message['body'][] = 'Some body text.'; 
     $message['body'][] = rsvp_get_link($account); 
     break; 
    } 
    } 
} 
+0

你能澄清吗?这看起来像一般的hook_mail的滥用。请解释你想完成什么,以及为什么你把它放在hook_mail中。 hook_mail用于填充/修改电子邮件。不过,还有很多其他入口点来启动邮件进程。 – 2011-05-03 03:15:11

+0

@David Fells:这是更全面的:http://stackoverflow.com/questions/5862170/send-one-time-login-link-via-hook-mail – starsinmypockets 2011-05-03 03:27:42

+0

你可能会失去开关,只是问(strpos ($ key,'invite')== 0),或者if(preg_match('!invite \ d +!',$ key)) – yoavmatchulsky 2011-05-03 06:16:24

回答

2

如果您使用的是同一个基本的电子邮件“骨架”为所有用户你邮寄,你只需要更换几个值是用户特定的(用户名,个人资料信息等) ,你可以使用令牌来完成工作。

在这两个函数看看,看看我的意思是(他们并排侧在同一个文件):

https://github.com/semperos/drupal-simple-subs/blob/master/simple_subs.module#L180

https://github.com/semperos/drupal-simple-subs/blob/master/simple_subs.module#L191

当您使用drupal_mail(),您可以将所需的任何值分配给您传递给它的params阵列(这与传递给hook_mail的实现相同的params阵列)。然后,这些值可以添加到Token模块提供的默认邮件令牌中,如您在我的实施hook_mail 195-198行中看到的那样。

如果您需要更复杂的东西(即电子邮件的主要文本取决于用户),您仍可以使用同一个系统,但可以调用数据库以获取更多信息。如果您需要为每个用户存储不同的电子邮件正文,请将其存储在与用户ID关联的数据库表中,然后在您的邮件功能中动态查询该数据。

无论如何,您不应该在PHP的switch语句级别使用任何类型的动态行为;您应该可以通过params阵列传递您需要的任何动态值,您的hook_mail的实现需要。通常,用于处理邮件的陈述并不意味着在每个用户或每个节点的基础上提供动态行为,而是用于管理具有非常不同的内容和用途的电子邮件。

+0

谢谢...使用$ params(一种时尚之后)解决了我的问题。麻烦看看这个:http://stackoverflow.com/questions/5877373/adding-url-breaks-hook-mail-implementation?干杯! – starsinmypockets 2011-05-04 00:59:51