2012-04-02 11 views
2

Wir haben den folgenden Code in unserem Application.cfc:Coldfusion „Routinen können nicht mehr deklariert werden als einmal“

<cffunction name="onError" returnType="void" output="false"> 
    <cfargument name="exception" required="true"> 
    <cfargument name="eventname" type="string" required="true"> 
    <cfset cfcatch = exception> 
    <cfinclude template="standalone/errors/error.cfm"> 
</cffunction> 

Im error.cfm Seite wir diesen Code haben (ich habe es nicht geschrieben):

<cfscript> 
     function GetCurrentURL() { 
      var theURL = "http"; 
      if (cgi.https EQ "on") theURL = "#TheURL#s"; 
      theURL = theURL & "://#cgi.server_name#"; 
      if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#"; 
      theURL = theURL & "#cgi.path_info#"; 
      if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#"; 
      return theURL; 
     } 
</cfscript> 

Dies ist alles Teil eines Skripts, das viele Details zum Fehler zusammenfasst und in der Datenbank speichert.

Wenn ein Fehler auftritt, erhalten wir die Nachricht "Die Routine GetCurrentURL wurde zweimal in verschiedenen Vorlagen deklariert." Allerdings habe ich die gesamte Codebasis auf verschiedene Arten durchsucht und festgestellt, dass "GetCurrentURL" nur zweimal verwendet wurde, beide Male in error.cfm. Das erste Mal ist die Deklaration, und das zweite Mal ist die tatsächliche Verwendung. Ich bin also nicht sicher, warum CF "in verschiedenen Vorlagen" sagt.

Mein nächster Gedanke war, dass das Problem ein rekursiver Aufruf ist, und dass error.cfm ist erroring und die sich selbst, so dass ich versuchte, diese beiden Änderungen, von denen das Problem gelöst haben sollte und entlarvt den wahren Fehler:

<cfif StructKeyExists(variables,"GetCurrentURL") IS "NO"> 
    <cfscript> 
      function GetCurrentURL() { 
       var theURL = "http"; 
       if (cgi.https EQ "on") theURL = "#TheURL#s"; 
       theURL = theURL & "://#cgi.server_name#"; 
       if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#"; 
       theURL = theURL & "#cgi.path_info#"; 
       if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#"; 
       return theURL; 
      } 
    </cfscript> 
</cfif> 

Und:

<cfscript> 
    if (!StructKeyExists(variables,"GetCurrentURL")) { 
      function GetCurrentURL() { 
       var theURL = "http"; 
       if (cgi.https EQ "on") theURL = "#TheURL#s"; 
       theURL = theURL & "://#cgi.server_name#"; 
       if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#"; 
       theURL = theURL & "#cgi.path_info#"; 
       if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#"; 
       return theURL; 
      } 
    } 
</cfscript> 

Weder gearbeitet. Ich habe auch versucht, diese kurz vor dem Funktionsaufruf der Seite hinzugefügt:

<cfoutput>"#StructKeyExists(variables,"GetCurrentURL")#"</cfoutput> 

Es verursachte das Wort „YES“ auf dem Bildschirm gedruckt werden. Dies deutet darauf hin, dass das obige funktionieren sollte, da der Inhalt der if-Anweisung eindeutig mit "YES" bewertet wird, und daher die if-Anweisung als false ausgewertet wird und somit die Funktion nicht deklariert wird und ich somit meine geistige Gesundheit behalten werde. Aber aus irgendeinem Grund bleibt dieses Problem bestehen.

Haben Sie irgendwelche Gedanken darüber, was als nächstes auftreten könnte oder wie Sie den Fehler beheben können? Ich stecke an diesem Punkt fest.

+0

Sind Sie sicher, dass error.cfm nirgendwo enthalten ist? Ist es nur in onError() enthalten? –

+0

Ja, das war nur in onError(). – Nicholas

Antwort

3

ColdFusion erkennt die Funktionsdeklaration immer noch, wenn sie in Bytecode kompiliert wird. Sie können eine cfinclude verwenden, um die Funktionsdeklaration enthalten:

<cfif StructKeyExists(variables,"GetCurrentURL") IS "NO"> 
<cfinclude template="udf.cfm" /> 
</cfif> 

Dann in der udf.cfm platzieren Sie Ihre Funktionsdeklaration. Das sollte so funktionieren, wie Sie wollen, und verhindern, dass CF den Fehler verursacht.

+0

oh ja !! Warum habe ich das nicht gesehen? Es reicht nicht aus, die Erklärung zu analysieren. Ich wette, du hast Recht Sean ... schön! –

+0

Ich habe dies gelöst, indem ich die Deklarationen in Application.cfc verschoben habe, aber das beinhaltet einige negative Rückwirkungen. Erstes lokales Testen zeigt an, dass Ihre Lösung viel besser zu funktionieren scheint, also werde ich daran arbeiten, diese QAed zu bekommen. Ich danke dir sehr! :) – Nicholas

-1

Eine andere Lösung besteht darin, die Funktion vor der Definition aus dem Bereich zu löschen. Zum Beispiel ...

<cfset StructDelete(variables,'myFunction')> 
<cffunction name="myFunction">...</cffunction> 
+0

Willkommen bei SO Marius, können Sie beschreiben, wo, wie und warum das Löschen der OP-Funktion das Problem lösen würde? – CPHPython

Verwandte Themen