Как передать структуру в 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> 
    ...

Может быть, кто-то еще может использовать фрагмент.

Другие вопросы по тегам