为什么在 Coldfusion 中不可能按顺序调用同一组件的两个方法



所以,我花了一整夜的时间追逐一个错误......找到了,不知道出了什么问题。

我在Coldfusion有发送两封电子邮件的脚本。两封邮件都在我调用的邮件脚本中,cfinvoke如下所示:

<cfinvoke component="form_mailer_basket" method="msg_order_seller"> 
... parameters
</cfinvoke>
<cfinvoke component="form_mailer_basket" method="msg_order_retailer">
... parameters
</cfinvoke>

两个邮件参数都没问题,但是第二个邮件程序抛出了一个错误:

mailer orders 
************************************************************************************ 
type: Application 
************************************************************************************ 
message: Could not find the ColdFusion Component or Interface form_mailer_basket. 
************************************************************************************ 
detail: Ensure that the name is correct and that the component or interface exists. 
************************************************************************************ 

问题:
谁能告诉我为什么第二封邮件找不到组件,而上面的第一个脚本 5 行可以?

谢谢!

编辑
这是我调用这两种方法的代码:

<cfif new_mail.recordcount GT 0>
    <cfloop query="new_mail">
        <cfset variables.newMail = new_mail.email_bestelleingang>
            <cfinvoke component="form_mailer_basket" method="msg_order_seller"> 
                <cfinvokeargument name="delDate" value="#variables.liefdatum_mail#"/>
                <cfinvokeargument name="delMsg" value="#variables.bestell_text_mail#"/>
                <cfinvokeargument name="delOrd" value="#LOCAL.Basket.bestelltyp#"/>
                <cfinvokeargument name="mailto" value="#variables.newMail#"/>
                <cfinvokeargument name="client" value="#LOCAL.Basket.re_firma#"/>
                <cfinvokeargument name="rebate" value="#variables.kopf_rabatt#"/>
                <cfinvokeargument name="sellerIln" value="#variables.iln_verkaeuferNEU#"/>
                <cfinvokeargument name="ordNo" value="#variables.bestellnummer_neu#"/>
            </cfinvoke> 
    </cfloop>
</cfif>
...
 <cfloop query="active_check">
      <cfif active_check.freigeschaltet NEQ "1" AND active_check.freigeschaltet NEQ "0">
           <cfinvoke component="form_mailer_basket" method="msg_order_retailer">
                <cfinvokeargument name="delDate" value="#variables.liefdatum_mail#" />
                <cfinvokeargument name="delOrd" value="#LOCAL.Basket.bestelltyp#" />
                <cfinvokeargument name="mailto" value="#variables.cusMail#" />
                <cfinvokeargument name="client" value="#order_recipients.firma#" />
                <cfinvokeargument name="rebate" value="#variables.kopf_rabatt#" />
                <cfinvokeargument name="sellerIln" value="#variables.iln_verkaeuferNEU#" />
                <cfinvokeargument name="ordNo" value="#variables.bestellnummer_neu#" />
                <cfinvokeargument name="total" value="#variables.gesamtsumme#" />
                <cfinvokeargument name="menge" value="#variables.gesamtmenge#" />
                <cfinvokeargument name="curr" value="#variables.waehrung#" />
                <cfinvokeargument name="agentF" value="#variables.agentFirma#" />
               <cfinvokeargument name="agentN" value="#variables.agentName#" />
            </cfinvoke>
         </cfif>
    </cfloop>

第一个有效,第二个无效。方法名称正确,所有参数都可以(我知道我应该使用参数Colletion...),所以我一无所知,需要小睡一会儿。稍后再回来查看!

和 cfc:

<cfcomponent output="false" hint="basket mailing cfc - sends out all basket related mail messages">
    <!--- LOAD LANGUAGES --->
    <cfinclude template="../templates/tmp_lang.cfm">
    <!--- INIT --->
    <cffunction name="Init" access="public" returntype="any" output="false" hint="Initialize">
        <!--- nothing here for now --->
        <cfreturn true />
    </cffunction>
    ... msgs like this:
    <!--- NEW ORDER SELLER --->
    <cffunction name="msg_order_seller" access="public" output="false" hint="msg for new orders"> 
        <cfargument name="delDate" type="date" required="true" hint="delivery date" />
        <cfargument name="delMsg" type="string" required="true" hint="text message by retailer" />
        <cfargument name="delOrd" type="string" required="true" hint="order type pre/asap" />
        <cfargument name="mailto" type="string" required="true" hint="email adress" />
        <cfargument name="client" type="string" required="true" hint="buyer" />
        <cfargument name="rebate" type="string" required="true" hint="rebate 1/0" />
        <cfargument name="sellerIln" type="string" required="true" hint="seller ILN" />
        <cfargument name="ordNo" type="string" required="true" hint="order number" />
        <cfprocessingdirective suppresswhitespace="No">
            <cfmail
                    TO="#mailto#"
                    FROM="automailer@..."
                    SERVER="mail.bbb.de"
                    USERNAME="ddd"
                    PASSWORD="123456"
                    SUBJECT="#tx_automailer_order_new# - #client#">
#tx_automailer_default_anrede#
#tx_automailer_order_info#
#tx_automailer_order_type#: #ordertype# #rebateTxt#
#tx_automailer_order_del#: #deliveryDate#
#tx_automailer_order_no#:     #ordNo#
#tx_automailer_order_date#:      #DateFormat(now(),"dd.Mm.yyyy")#
#tx_kaeufer#:            #client#
#tx_automailer_order_msg#:
#delMsg#
#tx_automailer_order_iln#:  #sellerIln#
#tx_automailer_default_gruss#
#tx_automailer_default_team#
-------------
#tx_automailer_default_disclaimer#
                    </cfmail>
              </cfprocessingdirective>      
          <cfreturn />
    </cffunction>  
    ...
 </cfcomponent>     

如果你只是想解决你的问题,而不是试图找出导致它的原因,我有一个建议。 与其多次对同一组件使用 cfinvoke 标签,不如使用 cfobject 或 CreateObject() 只创建它的一个实例。 然后直接调用这些方法。

即使你确实得到了你目前的工作方法,它也会比我的建议慢。 cfinvoke 每次调用它时都会创建一个对象,这需要处理时间。

您确定这两种方法都存在并且是公共的吗?

  1. 在 cfc 中使用 cfinclude 不是很好的做法,尽管不可否认,我有时也不得不这样做。
  2. 您的错误Could not find the ColdFusion Component or Interface form_mailer_basket似乎暗示组件本身发生了一些事情 - 我怀疑这与Init()方法中的 return 语句有关。
  3. 早期版本的 CF 中(我认为大约在 6/7 可能是 8 版)中,您可以通过在 cfc 中设置同名变量来覆盖您的函数。您没有提到您正在运行的 CF 版本。

最新更新