【问题标题】:Use dynamic e-mail generation in hook_mail()在 hook_mail() 中使用动态电子邮件生成
【发布时间】:2011-05-03 02:53:39
【问题描述】:

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

【问题讨论】:

  • 你能澄清一下吗?一般来说,这看起来像是对 hook_mail 的滥用。请解释您要完成的工作,以及为什么将其放入 hook_mail。 hook_mail 用于填充/修改电子邮件。不过,还有很多其他入口点可以启动邮件流程。
  • @David Fells:这个比较全面:stackoverflow.com/questions/5862170/…
  • 你可能会失去开关,只问是 (strpos($key, 'invite ') == 0),还是 (preg_match('!invite \d+!', $key))

标签: drupal drupal-7 drupal-hooks


【解决方案1】:

如果您为所有发送邮件的用户使用相同的基本电子邮件“骨架”,并且您只需替换一些值以成为特定于用户的值(用户名、个人资料信息等),您只需使用令牌来完成工作。

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

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 模块提供的开箱即用的默认邮件令牌中,正如您在第 195-198 行的hook_mail 实现中看到的那样。

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

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

【讨论】:

猜你喜欢
  • 2020-09-28
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
相关资源
最近更新 更多