动态执行存储在字符串中的coldfusion代码?

时间:2011-11-09 09:19:33

标签: dynamic coldfusion evaluate

我将一个电子邮件正文存储为数据库中的字符串,如下所示:

  

这是一个包含许多不同变量的电子邮件正文。亲爱的#name#,<br/>如需了解更多详情,请联系#reprecialName#。

我使用存储过程从数据库中提取此字段,然后我想在coldfusion端对其进行评估,这样它就会插入名称变量的值而不是“#name#”。

我尝试过使用评估,但只有只是一个变量名称才能起作用。由于其他文本,它会抛出错误。

(我不能只使用占位符和像这样的查找/替换 - Resolving variables inside a Coldfusion string,因为将其存储在数据库中的重点是用于构建字符串的变量是动态的。例如,在一种情况下,名称字段可以称为“名称”,而在另一种情况下,它可以是“firstName”等。)

5 个答案:

答案 0 :(得分:2)

我会遍历每个#variableName#reference并将其替换为评估版本。

正则表达式将能够找到所有这些,然后循环遍历所有这些并且只是逐个评估它们。

答案 1 :(得分:1)

您需要将其写入文件并CFINCLUDE。这将产生编译开销,但这是不可避免的。

您是否可以将代码保存到文件系统中,只是存储对数据库中的位置的引用?这样它只会在它改变时重新编译,而不是每次你使用它时都会重新编译?

<!--- pseudo code --->
<cfquery name="q">
    SELECT fileContent // [etc]
</cfquery>
<cfset fileWrite(expandPath("/path/to/file/to/write/code.cfm"), q.fileContent)>
<cfinclude template="/path/to/file/to/write/code.cfm">
<cfset fileDelete(expandPath("/path/to/file/to/write/code.cfm"))>

这是基本的想法:获取代码,编写代码,包含代码,删除代码。虽然您要确保创建的文件不会与任何其他文件冲突(根据其他人的建议使用UUID作为文件名或其他内容)。

你也想要加载测试。我怀疑它会表现得很好。其他人建议使用虚拟文件系统,但我不太确定那里会有很多好处:编译过程花费时间,而不是实际的文件操作。但值得研究。

答案 2 :(得分:0)

您使用的是ColdFusion 9还是Railo?如果是,写入in-memory files并包括{{3}}可能是一种快速而简单的解决方案。只需使用CreateUUID()之类的内容生成文件名即可避免冲突。

答案 3 :(得分:0)

所以基本上,在研究和阅读答案后,似乎这些是我的选择:

  1. 在表格中为每个变量分别添加字段并单独评估它们。例如nameVariable,reprNameVariable,然后我可以使用如下代码构建正文:

    This is an email body containing lots of different variables. Dear #evaluate(nameVariable)#, <br/> Please contact #evaluate(reprNameVariable)# for further details.

  2. 拥有一个包含所有文本和适用字段名称的“emailBody”字段,并将其写入临时文件并将其包含在内。 (正如亚当·卡梅隆所说,我认为这就是塞尔吉斯所得到的)

  3. 有一个“emailBody”字段并编写代码循环遍历它,找到所有的coldfusion变量,并用它们的“evaluate”d版本替换它们。 (根据Dale Fraser的建议)

  4. 拥有小型模板文件,每个报告类型一个,带有电子邮件正文,并有一个字段“emailBodyTemplate”,指示要包含的模板。 (正如Adam Cameron所建议的那样)

  5. 现在我只需要决定使用哪个:)当我这样做时,我会接受建议该方法的人的答案(除非它是一个没有建议的人,在这种情况下我可能会接受这个,或者如果有人提出另一种更有意义的方法)

答案 4 :(得分:0)

你发布这篇文章已经有一段时间了 - 但这完全是我做的事情。我在寻找其他东西时找到了你的问题。

当我将电子邮件写入数据库时​​,我只是为变量创建了自己的简单语法:

Hello ~FirstName~ ~LastName~,

然后,在我的发送cfm文件中,我从数据库中提取电子邮件文本,并将其保存到变量中:

<cfset EmailBody = mydatabasequery.HTMLBody>

然后我用我的变量(来自另一个名为RecipientList的查询)快速删除我自己的语法:

<cfset EmailBody = ReplaceNoCase(EmailBody, "~FirstName~", "#RecipientList.First#", "ALL")>
<cfset EmailBody = ReplaceNoCase(EmailBody, "~LastName~", "#RecipientList.Last#", "ALL")>

然后我只是发送电子邮件:

<cfmail ....>#EmailBody#</cfmail>

我希望你能看到这一点。如果您控制电子邮件的创作,我怀疑您这样做,这应该可以正常工作。

罗素

相关问题