Как передать структуру в Coldfusion CFC с помощью CFINVOKE?
У меня есть 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" />
....
По какой-то причине это сейчас не работает, и я могу заставить его работать, только если я передам поля отдельно в качестве аргумента, что является болью, так как я передаю много данных.
Вопрос: Как я могу заставить это работать, используя argumentsCollection.
Даже если я CFINVOKE, как это:
<cfinvoke component="mailer_user" argumentcollection="#User.data#" method="say_hi"></cfinvoke>
это все еще ничего не делает. Я устанавливаю флаги вывода прямо перед cfinvoke и после, а также внутри функции say_hi, входящей и выходящей. Я получаю флаг только перед CFINVOKE.
Примечание: все это делается через AJAX, и я получаю только успех = "ложь", если мой CFC где-то имеет ошибку. Я работаю только удаленно в системе, поэтому я не могу установить отладку AJAX в CFADMIN
4 ответа
Когда я набрал комментарий выше, мне пришло в голову, что проблема, вероятно, будет.
Вы передаете структуру своей функции. Вы передаете 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" />
Когда вы передаете коллекцию в качестве argumentsCollection, вы должны выполнить аргумент argumentsCollection="#user#", чтобы часть userData соответствовала вашему cfargument в функции.
Ясно как грязь?
Я думаю, что вы должны остаться в стиле cfscript, написав
// call mailer
mailUser = createObject("component", "mailer_user"); // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);
Это должно работать, если это не так, это где-то еще в вашем коде. Попробуйте посмотреть журнал ошибок.
Вы должны сопоставить переменную с данными, которые вы передаете, чтобы не было проблем с отправкой структуры. Сделай это так
<cfset objMailer = createObject("component","mailer_user") />
<cfset objMailer.say_hi(userData:user.data)/>
Это работает даже в CF7.
Хорошо. Внутри моего почтового 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>
...
Может быть, кто-то еще может использовать фрагмент.