我有一个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在某处出现错误,我只会获得成功=“false”。我只在系统上远程工作,所以我不能在CFADMIN中设置AJAX调试
答案 0 :(得分: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匹配。
清除泥土?
答案 1 :(得分:2)
我认为你应该通过编写
来保持cfscript风格// call mailer
mailUser = createObject("component", "mailer_user"); // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);
这应该有效,如果没有,它就是你代码中的其他地方。尝试查看错误日志。
答案 2 :(得分:1)
您应该将变量映射到您传递的数据,然后发送结构没有问题。这样做吧
<cfset objMailer = createObject("component","mailer_user") />
<cfset objMailer.say_hi(userData:user.data)/>
这甚至在CF7中也有效。
答案 3 :(得分: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>
...
也许其他人可以使用该代码段。