2012-04-02 1 views
2

우리는 다음과 같은 우리의 Application.cfc 코드가 : 우리가이 코드를 (내가 그것을 작성하지 않은)이있는 error.cfm 페이지 내에서ColdFusion에서 "루틴이 두 번 이상 선언 할 수 없습니다"

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

를 :

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

이것은 모두 오류에 대한 세부 정보를 모아 데이터베이스에 기록하는 스크립트의 일부입니다.

오류가 발생하면 "루틴 GetCurrentURL이 다른 템플릿에서 두 번 선언되었습니다."라는 메시지가 나타납니다. 그러나 나는 여러 가지 방법으로 전체 코드베이스를 검색했으며 "GetCurrentURL"은 error.cfm에서 두 번만 사용된다는 것을 발견했습니다. 처음은 선언이고, 두 번째는 실제 사용입니다. 그래서 왜 CF가 "다른 템플릿에서"말하는지 잘 모르겠습니다.

나의 다음 생각은 문제가 재귀 호출하고, 그 error.cfm이 erroring 자체를 호출된다, 그래서이 문제를 해결해야 하나있는이 두 가지 변화를 시도하고 실제 오류 폭로 :

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

그리고 :

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

을 어느했다. 함수 호출 바로 전에이 페이지를 추가하려고 시도했습니다.

"YES"라는 단어가 화면에 인쇄되었습니다. 이것은 if 문의 내용이 "YES"로 평가되므로 if 문이 false로 평가되어 함수가 선언되지 않으므로 위의 내용이 작동 함을 나타냅니다. 따라서 제 정신을 유지할 것입니다. 그러나 어떤 이유로이 문제는 계속 발생합니다.

어떤 문제가 발생했는지 또는 다음 문제를 해결하는 방법에 대한 의견이 있으십니까? 나는이 시점에서 붙어있다.

+0

error.cfm이 elswhere에 포함되어 있지 않은 것은 확실합니까? onError()에만 포함됩니까? –

+0

예, onError()에서만 사용되었습니다. – Nicholas

답변

3

ColdFusion은 여전히 ​​바이트 코드로 컴파일 할 때 함수 선언을 봅니다. cfinclude를 사용하여 함수 선언을 포함 할 수 있습니다.

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

그런 다음 udf.cfm에 함수 선언을 입력하십시오. 원하는대로 작동하고 CF가 오류를 던지지 않도록해야합니다.

+0

오 예! 내가 왜 그것을 보지 못했을까요? 선언문을 분석하는 것으로는 충분하지 않습니다. 너가 맞을거야 Sean ... 멋져! –

+0

선언을 Application.cfc로 옮겨서이 문제를 해결했지만 결국에는 부정적인 반향이있었습니다. 로컬 초기 테스트에서는 솔루션이 훨씬 더 잘 작동하는 것으로 나타나므로 QAed를 사용하여 생산성을 높이도록 노력할 것입니다. 정말 고맙습니다! :) – Nicholas

-1

다른 해결책은 정의 이전에 범위에서 함수를 삭제하는 것입니다. 예를 들어 ...

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

SO 마리우스에 오신 것을 환영합니다. OP의 기능을 삭제하면 문제를 어떻게, 어떻게, 왜 삭제할 수 있습니까? – CPHPython