2012-07-18 58 views
0

我有一個CFC文件,可處理從應用程序發送的所有電子郵件(使用Coldfusion8)。如何使用CFINVOKE將結構傳遞給Coldfusion CFC?

我用CFINVOKE調用這個CFC內部的各功能,並通過一個結構沿着像這樣所有用戶數據:

<cfscript> 
var User.data = {}; 
    User.data.name = "John Doe"; 
    User.data.email = "[email protected]"; 
    ... 
</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」。我只在系統上遠程工作,所以我不能設置AJAX調試中CFADMIN

+0

如果你使用argumentCollection傳遞數據,你會得到什麼錯誤?另外,如果您使用的是cfscript,爲什麼不使用oMailer = createObject(「component」,「mailer_user」); oMailer.say_hi(argumentcollection = user.data); – 2012-07-18 07:54:05

+0

我沒有使用cfscript,因爲我不知道語法:-)(第2個月Coldfusion)。我沒有收到任何錯誤,因爲AJAX只報告「成功」或「失敗」......我仍然想知道是否有辦法打開某種錯誤報告,因爲這種猜測肯定會縮短時間。 – frequent 2012-07-18 07:59:33

+0

ColdFusion服務器有大量的調試選項。在調試和日誌記錄中查看管理員。請記住,開啓調試會將所有內容添加到所有頁面的底部,包括ajax結果,除非您使用cfsetting另外聲明它。事情是,如果不是拋出一個錯誤,那麼這些都不會幫助你。你需要使用傳統的調試與cfdump,cfabort,cflog等來幫助。 – 2012-07-18 08:07:34

回答

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" /> 

當您將collection作爲argumentCollection傳遞時,您應該執行argumentCollection =「#user#」,以便userData部分與函數中的cfargument匹配。

清澈如泥?

+0

試圖抹去我眼中的泥... :-) – frequent 2012-07-18 08:05:47

+0

嗯。其實我有USER = {};作爲我的結構。 USER有USER.success,USER.fail和USER.Userdata作爲...對象/結構體?我經常在我的腳本中引用USER.Userdata.name,USER.Userdata.email,這個工作正常。我只是無法將這個東西傳遞到郵件程序CFC中......其實我現在正在做的是,首先用郵件程序調用,它只需要幾個字段,但現在我有一個有25個字段的程序...所以當我以前工作的很好的時候,我只是不願意一個接一個地通過它們。 – frequent 2012-07-18 08:08:46

+0

好吧,如果它在工作正常之前,那麼你的功能發生了一些變化,導致它停止工作。正如Henry所說的那樣,語法沒問題。如果您使用cf9 +或參數(如果使用cf8),請在本地cfarguments之後粘貼轉儲並中止。確保你得到你認爲你應該的東西。 – 2012-07-18 08:14:26

2

我想你應該留在CFSCRIPT風格寫

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

這應該工作,如果它不是,它是代碼中的其他位置。嘗試查看錯誤日誌。

+0

我也可以用CFINVOKE來做這個嗎?如果我可以避免,不想創建對象 – frequent 2012-07-18 07:57:38

+0

爲什麼你更喜歡cfinvoke? cfinvoke在調用方法之前也會創建該對象。無論如何,你在問題中的含義是正確的語法。如果它失敗了,那不是因爲那條線。 – Henry 2012-07-18 08:07:33

+0

我總是讀cfobject在Coldfusion8中不好,我應該使用cfinvoke。這也適用於單個電子郵件,它不會經常被調用,所以我認爲CFINVOKE更好,因爲一旦電子郵件消失,CFINVOKE將被丟棄,並且我的服務器保持「乾淨」。請糾正我,如果我在這裏錯了。 – frequent 2012-07-18 08:10:37

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> 
    ... 

也許別人可以使用的片段。

1

您應該將變量映射到您傳遞的數據,然後發送結構沒有問題。做這種方式

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

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

這個工程即使在CF7。

+0

是的,但我現在更傾向於CFINVOKE,所以我沒有「創建任何對象」。我在下面發表,我的mailer.cfc中有一個輸入錯誤,我沒有看到,因爲我的系統只是在AJAX上工作,而且我不能在CFAdmin中進行AJAX調試。所以我只是「AJAX失敗」。我有一個cfprocessing指令郵件文本,其中一個變量有## some_text#,導致整個cfc中斷。無論如何。感謝您的建議。 – frequent 2012-07-19 07:37:54