解析Coldfusion字符串中的变量

Dav*_*rns 4 coldfusion

我的客户端有一个电子邮件正文的数据库表,可以在特定时间发送给客户.电子邮件的文本包含ColdFusion表达式,如Dear#firstName#等.这些电子邮件是HTML - 它们还包含各种HTML标记.我想做的是将数据库中的文本读入一个字符串,然后使用ColdFusion Evaluate()来解析变量.当我这样做时,Evaluate()会抛出异常,因为它不喜欢那里的HTML标记(我也尝试通过HTMLEditFormat()过滤字符串作为grins的中间步骤,但它不喜欢那里的实体) .

我的前任通过将电子邮件文本写入文件然后将其包括在内来解决了这个问题.有用.但这看起来真的很酷.是否有更优雅的方式来处理这个使用像我没有看到的评估?

kev*_*ink 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>
Run Code Online (Sandbox Code Playgroud)

只需将html块视为一个简单的字符串即可.


Bia*_*cki 9

其他语言经常做的似乎工作得非常好,只是在模板中有一些令牌,可以很容易地用正则表达式代替.所以你可能有一个模板,如:

Dear {{name}}, Thanks for trying {{product_name}}.  Etc...
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地说:

<cfset str = ReplaceNoCase(str, "{{name}}", name, "ALL") />
Run Code Online (Sandbox Code Playgroud)

当你想要变得更加漂亮时,你可以写一个方法来包装它:

<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>
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

<cfset map = { name : "John", product : "SpecialWidget" } />
<cfset filledInTemplate = fillInTemplate(map, someTemplate) />
Run Code Online (Sandbox Code Playgroud)