将PHP变量注入XML电子邮件模板

How can I inject PHP variables into my XML email templates?

My templates are structured like this:

<Template id="1" name="Registration">
    <![CDATA[
        <p>Dear $FullName,</p>
        <p>We would like to welcome you to oursite.  Please find your activation link below, <br />
        if you cannot click the link, please copy and paste the link into your browser.</p>
        <ul>
            <li><strong>Activation Link:</strong> <a href="http://example.com/activate/$actCode/$UserName">http://example.com/activate/$actCode/$UserName</a></li>
        </ul>
        <p>&nbsp;</p>
        <p>Thank you,<br />
        ~Kevin - our site</p>
    ]]>
</Template>

and the code I am pulling it in with is:

public function PullEmailTemplate($which, $id){
    $file = $which . '.config';
    $xml = simplexml_load_file($_SERVER['DOCUMENT_ROOT'] . '/assets/templates/' . $file, NULL, LIBXML_NOCDATA);
    $res = $xml->xpath("//Template[@id='" . $id . "']");
    return (string)$res[0]; 
}

and using it like:

$msg = PullEmailTemplate('user', 1);

Now, the email sends out successfully, but I get $FullName, $ActCode, and $UserName exactly as they are... in otherwords, the aren't outputting what they should be... for instance they should be (in order): Kevin, 12345, myuser@name.com

How can I do this?

dovt85093
dovt85093 改变了我的功能,包括$replacements并添加:$ret=strtr($ret,$replacementments);传递一系列令牌/替换件我不明白的是为什么它不能像它应该是句号一样工作...
6 年多之前 回复
dqkv0603
dqkv0603 我设置$name='Kevin';然后我加载XML文件中的文本,并尝试回显它。$name永远不会被替换。
6 年多之前 回复
dongsheng1698
dongsheng1698 你在哪里设置$name变量,你在哪里调用它?如果你做$name=“Kevin”;echo$name;出口;它会工作。如果为空,则不设置变量。
6 年多之前 回复
dqkyz02602
dqkyz02602 好的,那怎么可以简单地做到这一点?echo“Hi$name”;并输出嗨凯文?我的观点是,字符串是一个字符串是一个字符串。那么,为什么当我试图基本上这样做时,它不会/不能工作?
6 年多之前 回复
douliexing2195
douliexing2195 从技术上讲,它只是一种服务器端脚本语言。您可以使用模板,但必须使用PHP创建模板。像Smarty这样的Templating引擎可以为您提供比常规PHP页面更清晰的代码。但是它不能替换由另一种语言制作的外部页面中的变量而不替换变量。
6 年多之前 回复
doushi8231
doushi8231 从而使php无效为模板语言?
6 年多之前 回复
dongyuan1983
dongyuan1983 好吧,如果你想用php替换非php文件中的文本,除了替换它之外别无选择。
6 年多之前 回复
dongxiezhuo8852
dongxiezhuo8852 打败dontcha想到的目的?不得不写一百多个替换语句......
6 年多之前 回复
dongxia19772008
dongxia19772008 那么在获取xml后更换变量有什么问题?
6 年多之前 回复
duangua5742
duangua5742 没有。它不会立即获得所有模板
6 年多之前 回复
duan201444
duan201444 所以$msg变量一次获取所有模板?为什么还要用参数调用呢?
6 年多之前 回复
doumao1887
doumao1887 这是一个xml文档,其中包含许多<模板节点。str_replace,下面的答案是不可行的。
6 年多之前 回复
duanbamo0127
duanbamo0127 一旦消息在msg变量中,就用str_replace替换一些变量。这应该有效,但只适用于该特定文件
6 年多之前 回复
duanjun7801
duanjun7801 我认为像这样的东西可能会起作用......但它只会导致网站破解......jungels.net/articles/php-templates.html
6 年多之前 回复
dongxue163536
dongxue163536 有没有办法可以强制(字符串)$res[0]成为模板?毕竟PHP是一种模板语言......
6 年多之前 回复
doushihu5475
doushihu5475 现在什么都没有了。只需$FullName,$ActCode和$UserName现在为空。是的我100%肯定这些变量是用值设置的。
6 年多之前 回复

1个回答



你在这里有一个俄罗斯套娃。 外层是XML文档。 您已经拥有从中读取内部元素的源代码。 内部元素(在CDATA内部)是一个带有 $ name </ code>占位符的HTML代码段。 您现在需要一些替换占位符的源而不破坏HTML。</ p>

如果 $ name </ code>是该模板系统的扩展,您可以使用 preg_replace_callback ()</ code>来匹配它们。 模式(\ $ [\ w \ d] +)</ code>应该这样做。 </ p>
</ div>

展开原文

原文

You have got a matryoshka here. The outer layer is an XML document. You already have source that reads the inner element from it. The inner element (inside the CDATA) is an HTML snippet with $name placeholders. You now need some source that replaces that placeholders without destroying the HTML.

If $name is the extend of that template system, you could use preg_replace_callback() to match them. The pattern (\$[\w\d]+) should do.

doubi4531
doubi4531 在这种情况下,preg_replace_callback()将是(非常基本的)模板系统。
6 年多之前 回复
douzhan8395
douzhan8395 为什么不通过一些模板解析器/视图层运行HTML(在CDATA中)? 设置变量并渲染。
6 年多之前 回复
douzhajie7168
douzhajie7168 XML不是模板,而是它的容器。 CDATA中的HTML代码段是带有占位符的模板。 CDATA是一种特殊的文本节点。 阅读文本并进行修改。
6 年多之前 回复
douxi2011
douxi2011 这是一个xml文档,其中包含许多<模板节点。 str_replace和preg_replace_callback()是不可行的
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐