0

我有一个 CFC 文件,它处理我从应用程序发送的所有电子邮件(使用 Coldfusion8)。

我正在使用 CFINVOKE 调用此 CFC 中的相应函数,并传递一个包含所有用户数据的结构,如下所示:

<cfscript>  
var User.data = {};
    User.data.name = "John Doe";
    User.data.email = "john@doe.com";
    ...
</cfscript>     
// call mailer
<cfinvoke component="mailer_user" method="say_hi">
    <cfinvokeargument name="userData" value="#User.data#">
</cfinvoke>

在我的 mailer.cfc 里面

<cffunction name="say_hi" access="public" output="false">
    <cfargument name="userData" type="struct" required="true" /> 
 ....

出于某种原因,这现在失败了,如果我将字段作为cfargument单独传递,我只能让它工作,这很痛苦,因为我传递了很多数据。

问题:如何使用argumentCollection使其工作。

即使我这样 CFINVOKE:

 <cfinvoke component="mailer_user" argumentcollection="#User.data#" method="say_hi"></cfinvoke>

它仍然没有做任何事情。我在 cfinvoke 之前和之后设置输出标志,以及在进出的“say_hi”函数内部。我只是在 CFINVOKE 之前拿到了旗帜。

旁注:这都是通过 AJAX 完成的,如果我的 CFC 在某处出现错误,我只会返回 success="false"。我只在系统上远程工作,所以无法在CFADMIN中设置AJAX调试

4

4 回答 4

3

当我输入上面的评论时,我想到了问题可能是什么。

您正在将结构传递给您的函数。您传递具有名称、电子邮件、等等作为该结构中的键的 User.data。这些键需要与函数中的参数匹配

<cffunction name="say_hi" access="public" output="false">
    <cfargument name="name" type="struct" required="true" /> 
    <cfargument name="email" type="struct" required="true" /> 
    <cfargument name="blah" type="struct" required="true" /> 
    <cfargument name="etc" type="struct" required="true" /> 

如果您想将结构作为参数传递,则需要将 user.userData 作为用户数据的结构,并且您的函数应该是

<cffunction name="say_hi" access="public" output="false">
    <cfargument name="userData" type="struct" required="true" /> 

当您将集合作为argumentCollection 传递时,您应该执行argumentCollection="#user#",以便userData 部分与您在函数中的cfargument 匹配。

清如泥?

于 2012-07-18T08:02:47.170 回答
2

我认为你应该通过写作保持 cfscript 风格

// call mailer
mailUser = createObject("component", "mailer_user");    // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);

这应该有效,如果没有,它在你的代码中的其他地方。尝试查看错误日志。

于 2012-07-18T07:50:05.037 回答
1

您应该将变量映射到您传递的数据,然后发送结构没有问题。这样做

<cfset objMailer = createObject("component","mailer_user") />

<cfset objMailer.say_hi(userData:user.data)/>

这甚至在 CF7 中也有效。

于 2012-07-19T07:14:42.013 回答
0

行。我的邮件 CFC 中有一个错字,其中我有一个带有“##”的变量。就像在我的电子邮件文本中一样,它没有被注意到......

所以你可以使用这个来传递一个结构:

<cfinvoke component="mailer_user" method="say_hi">
    <cfinvokeargument name="userData" value="#User.userdata#">
</cfinvoke>

并在你调用的函数中抓取它,如下所示:

<cffunction name="say_hi" access="public" output="false" hint=""> 
    <cfargument name="userData" type="struct" required="true" hint="user data  passed" /> 
    <cfscript>  
        var internalInfo = "";
        var User = {};
        User.userdata = userData;                   
    </cfscript> 
    ...

也许其他人可以使用该片段。

于 2012-07-18T08:37:14.583 回答