【问题标题】:ColdFusion custom tag calling cfmail as attibuteCollection and throwing errorColdFusion 自定义标签调用 cfmail 作为 attibuteCollection 并抛出错误
【发布时间】:2012-07-18 16:44:30
【问题描述】:

我在 CF 8.0.1 上尝试这个,但失败了。我正在尝试将自定义值传递给自定义标签,如下所示:

<cf_call ckmail="#{to='test@test.com',from='test@test.com',subject='Error reported',mailserver='mail.domain.com',username='1234',password='tested'}#">

在自定义标签 call.cfm 我有以下内容:

<cfparam name="attributes.ckmail" default="">
<cfmail attributecollection = "#attributes.ckmail#">

我得到的错误是:

在第 11 行第 18 列发现无效的 CFML 构造。ColdFusion 正在查看以下文本:{

它在 CF9 中运行良好,但在 CF8.0.1(或以前的版本)中失败并显示上述消息。


截至 2012 年 7 月 18 日的代码更新


我尝试使用 dan 的代码,但现在我面临一个不同的问题,在我的自定义标签中我使用的是这样的

       <cfset emailSetting = StructNew()>
   <!--- loop our query string values and set them in our structure --->
   <cfloop list="#attributes.ckmail#" index="key" delimiters=",">
     <cfset emailSetting["#listFirst(key,'=')#"] = urlDecode(listLast(key,"="))>
   </cfloop>
   <cfdump var="#emailSetting#"><cfabort>
       <cfmail attributecollection = "#emailSetting#"> 

以上是我在自定义标签中的设置,我在代码中将其称为

       <cf_call ckmail="to=i@test.com,from=test@domain.com,subject='Error reported',
    server=mail.domain.com,username=test@domain.com,password=tes@,type=html">

我现在得到的错误是“smtp”服务器未定义,

如果我在 cfadmin 中添加 smtp 详细信息,它可以工作,可能是它忽略了我输入的字段中的值,但是当 cfadmin 中也没有定义 smtp 设置时它会显示错误。

【问题讨论】:

    标签: coldfusion structure coldfusion-8 cfmail


    【解决方案1】:

    隐式结构应该可以在 CF8.0.1 中正常工作。

    您当然可以使用以下代码来使用 structNew() 函数构建您的结构:

    <cfset mailArgs             = StructNew() />
    <cfset mailArgs.to          = 'test@test.com' />
    <cfset mailArgs.from        = 'test@test.com' />
    <cfset mailArgs.subject     = 'Error reported' />
    <cfset mailArgs.mailserver  = 'mail.domain.com' />
    <cfset mailArgs.username    = '1234' />
    <cfset mailArgs.password    = 'tested' />
    
    <cf_call ckmail="#mailArgs#"> 
    

    您能否在此处发布来自 ColdFusion 的更详细的错误报告,以便我们帮助您找到错误的确切位置?或者您可以发布更多代码吗?

    【讨论】:

    • 这是我从代码中得到的详细报告,我的困惑在于 CF9 执行此进程而在 CF 8 中它失败了,我看到你已经以不同的方式声明了一个 Struct 然后将它传递给cfmail 标记,我希望它与自定义标记一起传递,但不想单独声明,并且再次在自定义标记中使用上面编写的代码:,我想传递实际的写在上面而不是在这里再次评估它
    【解决方案2】:

    您在 ckmail 属性中使用了结构文字语法,我认为这改变了 CF8 和 CF9 之间的行为。我会尝试用老式的方式创建一个结构,看看是否可行。

    【讨论】:

    • 所以使用正确的 Structnew(),顺便说一句,我在自定义标签中传递它,所以有点困惑它是如何工作的
    • 它看起来就像 它没有任何构造器语法——这一切都是提前完成的。查看第一个答案 - 马特的例子很清楚。
    【解决方案3】:

    嗯....我想知道在自定义标签调用中,英镑符号对其他任何人来说是否看起来很奇怪?结构符号通常如下所示:

    <cfset mystruct = {to='test@test.com',from='test@test.com',subject='Error reported',mailserver='mail.domain.com',username='1234',password='tested'}/>
    

    井号会导致 CF 尝试“做某事”来合并值(就像你做 &lt;cfset z = #x+y#/&gt; 时一样……但不使用它们会让 CF “看到”构造函数指示符(大括号)。

    但我不确定自定义标签在该实例中的行为方式。你有没有试过这样称呼它:

    <cf_call 
     ckmail={to='test@test.com',from='test@test.com',subject='Error reported',mailserver='mail.domain.com',username='1234',password='tested'}/>
    

    或者失败 - 正如建议的那样 - 提前将其设置为:

    <cfset args = {to='test@test.com',from='test@test.com',subject='Error reported',mailserver='mail.domain.com',username='1234',password='tested'}/>
    

    然后调用:

    <cf_call ckmail="#args#"/>
    

    看看这些是否有效?

    【讨论】:

    • 我尝试了你在这里所说的所有方式,但我仍然面临同样的问题,我已经更新了我的问题,请检查,这次我得到了一些不同的错误“smtp is not defined”跨度>
    猜你喜欢
    • 2016-05-30
    • 2018-03-14
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多