HTML邮件模板与str_replace

4

我有一个表单,使用AngularJs编程。当用户提交该表单时,将执行一个由Slim制作的php脚本,将表单数据插入到数据库中并生成电子邮件(PHPmailer)。

现在来看问题:

我使用file_get_contents从模板获取电子邮件结构,并使用str_replace替换占位符。

模板:

<h2>User Information</h2>

<table>
  <tbody>
    <tr><th>Firstname:</th><td>%firstname%</td></tr>
    <tr><th>Lastname:</th><td>%lastname%</td></tr>
  </tbody>
</table>
<br>

<h2>Other Information</h2>

<table>
  <tbody>
    <tr><th>Phone:</th><td>%phone%</td></tr>
    <tr><th>E-Mail:</th><td>%email%</td></tr>
    <tr><th>Organisation:</th><td>%organisation%</td></tr>
  </tbody>
</table>

我的问题是,这些字段并非全部必填,如果没有设置任何一个变量(电话、电子邮件、组织),我希望删除整个表格及标题。

2个回答

2
最好创建两个不同的模板,一个包含表格,一个不包含表格,根据电话、电子邮件和组织的存在情况渲染其中之一。
类似于:
function render($firstname, $lastname, $phone = null, $email = null, $organisation = null)
{
    $templatePath = (is_null($phone) && is_null($email) && is_null($organisation)) ?
    '/path/to/your/template/withought/the/contact/table.html':
    '/path/to/your/template/with/the/contact/table.html';

    $templateContent = file_get_contents($templatePath);

    $placeHolders = [
       '%firstname%',
        '%lastname%',
        '%phone%',
        '%email%',
        '%organisation%',
    ];

    $values = [
        $firstname,
        $lastname,
        $phone,
        $email,
        $organisation,
    ];

    $rendered = str_replace($placeHolders, $values, $templateContent);
    return $rendered;
}

有没有更简单的解决方案?我不想使用这个,因为我需要为此电子邮件制作大约8个模板。(所示示例不是我的真实模板 :)) - Yunnigg
我认为你提出的三个选项中,最简单的方法是:1.使用两个模板(建议采用)。2.使用一个模板和一个局部模板,如果需要,将电话、电子邮件和组织注入到模板中(这也是另一种不错的解决方案)。3.根据电话、电子邮件和组织状态来操作单个模板的内容(这不是一个好方法)。 :) - Ali
不过对于这样的小例子来说,可能并不需要,但如果你的项目要使用更多的模板,你可能会考虑一些模板引擎,比如TWIG - Ali

1
你可以“隐藏”表格,而不是删除。
设置参数,例如:
<table style="display: %display-other-information%">

如果您的属性为null,您需要设置为“none”,否则设置为“normal”。 更好的解决方案是创建其他模板,但是如果您不想这样做,可以按照我说的方法操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接