2010-04-19 2 views
2

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

Я понимаю, что это, вероятно, какая-то «структура», но я чрезвычайно новый для 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 не определен в ПРИЛОЖЕНИИ».

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

+1

Вероятно тупой вопрос, но вы перезапуск приложения после добавления нового кода? Если вы просто изменили application.cfc без перезапуска, структура не была бы создана (поскольку метод onApplicationStart уже запущен). Я сталкивался с этим несколько раз. – derivation

+0

Dummie me, исходящий из ASP.NET, я предположил, что редактирование файла application.cfc будет делать трюк - тем более что изменения, которые я делаю для application.cfc, вызывают ошибки, когда они не компилируются. Как сбросить приложение? (У меня есть только доступ к файловому серверу на сервере, нет доступа к инструментам администрирования CF.) – richardtallent

ответ

4

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

ColdFusion использует специальный файл Application.cfc, который вы ввели в маршрут своего веб-приложения (аналогично Global.asax в ASP.Net). У него есть метод in в вызове 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!

  • Джон
+0

Я должен использовать более старую версию ColdFusion ... Я получаю 'Invalid token '{'' в строке для 'cfset application.constants'. – richardtallent

+0

Ах, вы можете узнать, какую версию вы используете, используя SERVER.ColdFusion.ProductVersion. Вы не можете использовать сокращенный синтаксис для структур до CF8, но вы можете создать их как: application.constants = StructNew(); application.constants.key1 = 123; application.constants.key2 = "ABC"; –

0

Все они есть в руководстве Developing ColdFusion 9 Applications. (CF8's here)

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

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

+0

Спасибо, но руководство (и ссылка) сидит рядом со мной в другом окне. Проблема заключается в том, чтобы объединить 20 различных понятий в некоторый рабочий код, когда я в буквальном смысле вижу CFML/CFScript в первый раз. – richardtallent

+0

Разбейте большую проблему на более мелкие, изучите, переварите и решите их по своему усмотрению. Удачи. :) – Henry

0

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

application.definedterms(thisdef).term 

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

application.definedterms[thisdef].term 

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

+0

Спасибо ... исправлено, но он не работает на линии выше, вызов ArrayLen(). – richardtallent

+0

Попробуйте передать массив структур как аргумент функции, а не пытаться вызвать область приложения из вашей функции. например ReplaceDefinitions (inputstring, definedterms) и ссылка как часть области аргументов. –

1

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

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

После того как вы это сделали и внесли некоторые изменения, о которых упоминал Бен. Функция должна работать. Примечание: Вы можете использовать более короткий < = и ++ оператор, если вы используете 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>