我的客户端有一个电子邮件正文的数据库表,可以在特定时间发送给客户。电子邮件的文本包含ColdFusion表达式,如Dear#firstName#等。这些电子邮件是HTML - 它们还包含各种HTML标记。我想做的是将数据库中的文本读入一个字符串,然后使用ColdFusion Evaluate()来解析变量。当我这样做时,Evaluate()会抛出异常,因为它不喜欢那里的HTML标记(我也尝试通过HTMLEditFormat()过滤字符串作为grins的中间步骤,但它不喜欢那里的实体)
我的前任通过将电子邮件文本写入文件然后将其包括在内来解决了这个问题。有用。但这看起来真的很酷。有没有更优雅的方法来处理这个使用像我没有看到的评估?
答案 0 :(得分:9)
不确定是否需要重新放置,如果您没有太多要合并的字段,可以通过简单的替换来强行使用
这样的事情(未经测试)
<cfset var BaseTemplate = "... lots of html with embedded tokens">
<cfloop (on whatever)>
<cfset LoopTemplate = replace(BaseTemplate, "#firstName#", myvarforFirstName, "All">
<cfset LoopTemplate = replace(LoopTemplate, "#lastName#", myvarforLastName, "All">
<cfset LoopTemplate = replace(LoopTemplate, "#address#", myvarforAddress, "All">
</cfloop>
只需将html块视为一个简单的字符串。
答案 1 :(得分:9)
其他语言经常做的似乎效果很好,只是在模板中有一些令牌,可以很容易地用正则表达式代替。所以你可能有一个模板:
Dear {{name}}, Thanks for trying {{product_name}}. Etc...
然后你可以简单地说:
<cfset str = ReplaceNoCase(str, "{{name}}", name, "ALL") />
当你想要变得更加漂亮时,你可以写一个方法来包装它:
<cffunction name="fillInTemplate" access="public" returntype="string" output="false">
<cfargument name="map" type="struct" required="true" />
<cfargument name="template" type="string" required="true" />
<cfset var str = arguments.template />
<cfset var k = "" />
<cfloop list="#StructKeyList(arguments.map)#" index="k">
<cfset str = ReplaceNoCase(str, "{{#k#}}", arguments.map[k], "ALL") />
</cfloop>
<cfreturn str />
</cffunction>
并像这样使用它:
<cfset map = { name : "John", product : "SpecialWidget" } />
<cfset filledInTemplate = fillInTemplate(map, someTemplate) />
答案 2 :(得分:2)
CF 7+:您可以使用正则表达式REReplace()?
CF 9:使用Virtual File System
答案 3 :(得分:-2)
如果变量位于结构中,类似于表单帖子,则可以使用“StructFind”。它完全按照您的要求执行。处理带有动态输入的表单时,我遇到了这个问题。
实施例
StructFind(FORM, 'WhatYouNeed')