2010-04-19 5 views
2

나는 정의 된 용어 (키, 값)의 사전 인 데이터베이스 테이블을 가지고있다. 데이터베이스에서 응용 프로그램 범위의 사전을로드하고 성능을 유지하기 위해 사전을로드하려고합니다 (변경되지 않음).ColdFusion 정적 키/값 목록?

나는 아마도 "struct"라고 일컫는 바가 있지만, 은 매우 (다른 팀을 도와 줌)입니다.

그런 다음 브라우저에 출력되는 일부 문자열에 대해 간단한 문자열 바꾸기를 수행하고 정의 된 용어를 반복하며 단어를 마우 가지 또는 링크로 정의하는 일부 HTML로 바꾸기를 원합니다. 중요한 것은 아니지만 나중에 연습해야 함). 나는 함수를 호출 할 때

function ReplaceDefinitions(inputstring) { 
    for (thisdef = 1 ; 
     thisdef LTE ArrayLen(application.definedterms); 
     thisdef = (thisdef+1)) { 
     inputstring = Replace(inputstring, 
      application.definedterms(thisdef).term, 
      application.definedterms(thisdef).definition, "ALL"); 
    } 
    return inputstring; 
} 

가, 내가 돌아올 :

<cffunction name="onApplicationStart"> 
<cfquery name="qryDefinedTerms" datasource="mydsn"> 
     SELECT term, definition FROM definedterms 
    </cfquery> 
<cfset application.definedterms = Array(1)> 
<cfloop query="qryDefinedTerms"> 
    <cfset myHash = structNew()> 
    <cfset myHash.put("term", qryDefinedTerms.term)> 
    <cfset myHash.put("definition", qryDefinedTerms.definition)> 
    <cfset ArrayAppend(application.definedterms, myHash)> 
</cfloop> 
</cffunction> 

호출 페이지가 다음과 같이 사용을 시도 :

이것은 application.cfc 파일에 현재 코드는 다음과 같습니다 "DEFINEDTERMS 요소가 응용 프로그램에서 정의되지 않았습니다."

편집 : ColdFusion의 application.cfc는 ASP.NET의 web.config와 같지 않습니다. OnApplicationStart()가 호출되면 응용 프로그램이 재설정되지 않습니다.

+1

아마 바보 같은 질문을 사용하는 경우는 < 짧은 = 및 ++ 연산자를 사용할 수 있습니다,하지만 당신은 당신이 새로운 코드를 추가하기 때문에 응용 프로그램을 다시 시작한 참고 :? 다시 시작하지 않고 application.cfc를 방금 수정 한 경우에는 onApplicationStart 메소드가 이미 실행되었으므로 구조체가 작성되지 않았을 것입니다. 나는 몇 번 전에 이것에 빠져 들었다. – derivation

+0

Dummie 내가 ASP.NET에서 왔을 때, 나는 application.cfc 파일을 편집하는 것이 트릭을 할 것이라고 생각했습니다. 특히 컴파일하지 않을 때 application.cfc에 대한 변경 사항을 던지기 때문에. 응용 프로그램을 어떻게 재설정합니까? (나는 단지 서버에 대한 파일 서버 액세스 권한이 있으며 CF 관리 도구에 액세스 할 수 없습니다.) – richardtallent

답변

4

가 별도의 질문을 많이 당신이 요청했습니다있다하지만 난 그 대답에 이동을해야합니다 ! 또한 사용중인 ColdFusion 버전을 언급하지 않았으므로 ColdFusion 8 이상에서 작동하는 코드로 대답하겠습니다.

ColdFusion은 웹 응용 프로그램의 경로에 Application.cfc라는 특별한 파일을 사용합니다 (ASP.Net의 Global.asax와 비슷 함). 이 메소드에는 onApplicationStart라는 메소드가 있습니다.이 메소드는 응용 프로그램이 시작될 때만 실행됩니다 (각 요청마다 그렇지 않으므로). 이것은 어떤 상수라도 넣을 수있는 좋은 장소입니다. 다음은 {} 구문을 사용하여 구조체 (다른 언어의지도처럼)를 설정하는 간단한 예제입니다.

응용 프로그램.CFC

<cfcomponent> 
    <cffunction name="onApplicationStart"> 
    <!--- set global constants here ---> 
    <cfset application.foo = { a=1, b=2, c="my string" }> 
    </cffunction> 
</cfcomponent>

는 데이터베이스에서 데이터를 얻고 싶다면

, 여기에 그것을 할 수있는 간단한 방법입니다 (아마도 더 나은 그러나 이것은 당신이 시작해야 다른 많은 방법이있다!)

<cfcomponent> 
    <cffunction name="onApplicationStart"> 
    <!--- set global constants here ---> 
    <cfset application.datasource = "mydsn"> 

    <cfquery name="qryConstants" datasource="#application.datasource#"> 
     select key, value 
     from tblConstants 
    </cfquery> 

    <cfset application.constants = {}> 
    <cfloop query="qryConstants"> 
     <cfset application.constants[ qryConstants.key ] = qryConstants.value> 
    </cfloop> 
    </cffunction> 

</cfcomponent>
다음 같은 것을 할 수있는 문자열 값을 교체로

:

somescript.cfm을

<cfsavecontent variable="somestring"> 
Hello, ${key1} how are you? My name is ${key2} 
</cfsavecontent> 

<!--- replace the ${key1} and ${key2} tokens ---> 
<cfloop collection="#application.constants#" item="token"> 
    <cfset somestring = ReplaceNoCase(somestring, "${#token#}", application.constants[ token ], "all")> 
</cfloop> 

<!--- show the string with tokens replaced ---> 
<cfoutput>#somestring#</cfoutput>

내가 말했듯이 당신의 질문을 해결할 수있는 방법이 많이 있지만,이 테스트를 시작하지는 않았지만 좋은 출발점을 찾을 수 있기를 바랍니다.

ColdFusion에 오신 것을 환영합니다.

application.definedterms[thisdef].term 

CF에서 (많은 언어 같은) 괄호 :

application.definedterms(thisdef).term 

이 같아야합니다

  • 너무 깊게 보지 않고 존
+0

ColdFusion의 이전 버전을 사용해야합니다 ...'cfset application.constants'에'{ ''잘못된 토큰'{ ''이 표시됩니다. – richardtallent

+0

아 좋아, SERVER.ColdFusion.ProductVersion을 사용하여 사용중인 버전을 확인할 수 있습니다. CF8 이전에 구조체의 속기 구문을 사용할 수는 없지만 다음과 같이 작성할 수 있습니다. application.constants = StructNew(); application.constants.key1 = 123; application.constants.key2 = "ABC"; –

0
+0

감사하지만 가이드 (및 참조)가 다른 창에서 나 옆에 앉아 있습니다. 문제는 처음으로 CFML/CFScript를 문자 그대로 볼 때 20 개의 다른 개념을 일부 작업 코드로 함께 묶는 것입니다. – richardtallent

+0

큰 문제를 작은 문제로 분해하고, 배우고, 소화하고, 자신의 속도로 해결하십시오. 행운을 빕니다. :) – Henry

0

, 나는이 것을 볼 함수 호출을 암시하며 대괄호는 배열 참조를 의미합니다.

+0

고마워 ...하지만 위의 줄에있는 ArrayLen() 호출이 실패했습니다. – richardtallent

+0

함수 내에서 응용 프로그램 범위를 호출하는 대신 구조체 배열을 함수 인수로 전달해보십시오. 예 : ReplaceDefinitions (inputstring, definedterms) 및 인수 범위의 일부로 참조. –

1

또한 Application.cfc에서 배열 선언을 수정하십시오. Array (1) 대신 ArrayNew (1)이어야합니다. 그런 다음 응용 프로그램 변수를 다시 초기화하십시오. 한 가지 방법은 cfinvoke를 사용하는 것입니다.

<cfinvoke component="Application" method="OnApplicationStart" /> 

일단 수정하고 Ben이 언급 한 변경 사항을 적용하면됩니다. 함수가 작동해야합니다. 당신이 CF8 +

<cfscript> 
    // Added variable scoping 
    function ReplaceDefinitions(inputstring) { 
     var thisdef = ""; 
     var newString = arguments.inputstring; 
     for (thisdef EQ 1 ; thisdef LTE ArrayLen(application.definedterms); thisdef = thisdef+1) { 
      newString = Replace( newString, 
           application.definedterms[thisdef].term, 
           application.definedterms[thisdef].definition, 
           "ALL"); 
     } 
     return newString; 
    } 
</cfscript>