ColdFusion статический ключ / список значений? - PullRequest
2 голосов
/ 19 апреля 2010

У меня есть таблица базы данных, которая представляет собой словарь определенных терминов - ключ, значение. Я хочу загрузить словарь в области приложения из базы данных и сохранить его там для производительности (он не изменяется).

Я понимаю, что это, вероятно, своего рода "структура", но я чрезвычайно новичок в ColdFusion (помогаю другой команде).

Затем я хотел бы сделать простую замену строк для некоторых строк, выводимых в браузер, циклически просматривая определенные термины и заменяя термины некоторым HTML-кодом, чтобы определить термины (указатель мыши или ссылку, подробности, которые необходимо позже отработано, не важно).

Этот код в настоящее время находится в файле application.cfc:

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

Страница вызова пытается использовать его следующим образом:

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

Когда я вызываю функцию, я получаю ответ: «Элемент DEFINEDTERMS не определен в приложении».

Редактировать: принудительное выполнение вызова OnApplicationStart (), по-видимому, application.cfc Cold Fusion не похож на web.config в ASP.NET, его изменение не сбрасывает приложение.

Ответы [ 4 ]

4 голосов
/ 20 апреля 2010

Есть много отдельных вопросов, которые вы задали, но я постараюсь ответить на них! Вы также не сказали, какую версию ColdFusion вы используете, поэтому я собираюсь ответить с кодом, который будет работать в ColdFusion 8 и выше.

ColdFusion использует специальный файл Application.cfc, который вы помещаете в маршрут вашего веб-приложения (аналогично Global.asax в ASP.Net). В нем есть метод in с именем onApplicationStart, который выполняется только при запуске приложения (поэтому не для каждого запроса). Это отличное место для любых констант. Вот простой пример, который устанавливает структуру (например, карту на других языках), используя синтаксис {}:

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

  • John
1 голос
/ 20 апреля 2010

Также исправьте объявление массива в Application.cfc. Это должно быть ArrayNew (1) , а не Array (1). Затем попробуйте переинициализировать переменные приложения. Одним из способов является использование cfinvoke:

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

Как только вы это сделаете и внесете некоторые изменения, упомянутые Беном. Функция должна работать. Примечание: Вы можете использовать более короткие операторы <= и ++, если вы используете CF8 + </p>

<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>
0 голосов
/ 20 апреля 2010

Не глядя слишком глубоко, я вижу, что это:

application.definedterms(thisdef).term

должно быть так:

application.definedterms[thisdef].term

В CF (как и во многих языках) парены подразумевают вызов функции, а квадратные скобки - ссылку на массив.

0 голосов
/ 19 апреля 2010

Все они есть в руководстве Разработка приложений ColdFusion 9 . ( CF8 здесь )

Как определить структуру (если это то, что мне нужно для списка пар ключ / значение)?

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec09f0b-7fe9.html

Как сделать запрос?

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-6efa.html

Как [что-то сделать] при запуске приложения?

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7d39.html#WS6B589054-1E47-45e3-99F0-BAD7FFDF0E92

Лучший способ заменить строку

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7a49.html

...