在hook_mail()中使用动态电子邮件生成

时间:2011-05-03 02:53:40

标签: drupal drupal-7 drupal-hooks

是否可以在PHP cases语句中动态生成switch,如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;
    }
  }
}

1 个答案:

答案 0 :(得分: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数组(这是传递给您的实现的params数组。 hook_mail)。然后可以将这些值添加到Token模块提供的开箱即用的默认邮件令牌中,如我在第195-198行的hook_mail实现中所见。

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

无论如何,您不必在PHP的switch语句级别使用任何类型的动态行为;您应该能够通过params实现的hook_mail数组传递您需要的任何动态值。通常,用于处理邮件的case语句并不是为了在每个用户或每个节点上提供动态行为,而是用于管理具有非常不同内容和用途的电子邮件。