Выполнить код Coldfusion, хранящийся в строке динамически? - PullRequest
1 голос
/ 09 ноября 2011

У меня есть тело письма, хранящееся в виде строки в базе данных, что-то вроде этого:

Это тело письма, содержащее множество различных переменных. Уважаемый # имя #, <br/> Пожалуйста, свяжитесь с # представителем Имя # для получения более подробной информации.

Я извлекаю это поле из базы данных, используя сохраненный процесс, а затем хочу оценить его на стороне Coldfusion, чтобы вместо "# name #" он вставил значение переменной name.

Я пытался использовать метод оценки, но, похоже, это работает, только если просто имя переменной. Выдает ошибку из-за другого текста.

(Я не могу просто использовать заполнители и поиск / замену, как это - Разрешение переменных внутри строки Coldfusion , потому что весь смысл хранения этого в базе данных состоит в том, что переменные, используемые для построения Строка является динамической. Например, в одном случае поле имени может называться «имя», а в другом - «firstName» и т. д.)

Ответы [ 5 ]

2 голосов
/ 09 ноября 2011

Я бы перебрал каждую ссылку # variableName # и заменил ее оценочной версией.

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

1 голос
/ 09 ноября 2011

Вам необходимо записать его в файл и CFINCLUDE. Это повлечет за собой компиляцию, но это неизбежно.

Не можете ли вы сохранить код в файловой системе и просто сохранить ссылку на то, где он находится в БД? Таким образом, он будет перекомпилирован только при изменении, а не каждый раз, когда вы его используете?

<!--- pseudo code --->
<cfquery name="q">
    SELECT fileContent // [etc]
</cfquery>
<cfset fileWrite(expandPath("/path/to/file/to/write/code.cfm"), q.fileContent)>
<cfinclude template="/path/to/file/to/write/code.cfm">
<cfset fileDelete(expandPath("/path/to/file/to/write/code.cfm"))>

Это основная идея: получить код, написать код, включить код, удалить код. Хотя вам нужно убедиться, что создаваемый файл не конфликтует с каким-либо другим файлом (используйте UUID в качестве имени файла или что-то другое, согласно чьему-либо предложению).

Вы также захотите загрузить тест. Я сомневаюсь, что это будет работать очень хорошо. Другие предлагали использовать виртуальную файловую систему, но я не уверен, что это принесет большую пользу: процесс компиляции требует времени, а не фактических операций с файлами. Но это стоит исследовать.

0 голосов
/ 05 января 2012

Прошло много времени с тех пор, как вы опубликовали это, но это именно то, что я делаю. Я нашел ваш вопрос, когда искал что-то еще.

Я просто создал свой собственный простой синтаксис для переменных, когда я пишу свои электронные письма в базу данных:

Hello ~FirstName~ ~LastName~,

Затем в своем отправляющем файле cfm я извлекаю текст письма из базы данных и сохраняю его в переменную:

<cfset EmailBody = mydatabasequery.HTMLBody>

Затем я быстро убираю свой собственный синтаксис с моими переменными (из другого запроса, называемого RecipientList):

<cfset EmailBody = ReplaceNoCase(EmailBody, "~FirstName~", "#RecipientList.First#", "ALL")>
<cfset EmailBody = ReplaceNoCase(EmailBody, "~LastName~", "#RecipientList.Last#", "ALL")>

Тогда я просто отправляю свою электронную почту:

<cfmail ....>#EmailBody#</cfmail>

Надеюсь, вам удастся это увидеть. Если вы управляете созданием сообщений электронной почты, что, как я подозреваю, вы делаете, это должно работать хорошо.

Russell

0 голосов
/ 09 ноября 2011

Итак, в основном, после изучения и прочтения ответов, кажется, что это мои варианты:

  1. Имеют отдельные поля в таблице для каждой переменной и оценивают их по отдельности. например nameVariable, reprNameVariable, и затем я могу построить тело с кодом, подобным этому:

    This is an email body containing lots of different variables. Dear #evaluate(nameVariable)#, <br/> Please contact #evaluate(reprNameVariable)# for further details.

  2. Иметь поле "emailBody" со всем текстом и соответствующими именами полей, записать его во временный файл и включить в него. (По предложению Адама Кэмерона, и я думаю, что это то, к чему стремится Сергей)

  3. Имеют поле "emailBody" и пишут код для его циклического поиска, находят все переменные coldfusion и заменяют их их версией для "оценки". (По предложению Дейла Фрейзера)

  4. Иметь небольшие файлы шаблонов, по одному для каждого типа отчета, с телом электронной почты и полем "emailBodyTemplate", указывающим, какой шаблон включить. (По предложению Адама Кэмерона)

Теперь мне просто нужно решить, какой из них использовать :). Когда я это сделаю, я приму ответ человека, который предложил этот метод (если только он не был предложен, и в этом случае я, вероятно, приму это или если кто-то придумает другой способ, который имеет больше смысла)

0 голосов
/ 09 ноября 2011

Используете ли вы ColdFusion 9 или Railo? Если да, то запись в файлов в памяти включительно может быть быстрым и простым решением. Просто создайте имя файла с чем-то вроде CreateUUID(), чтобы избежать коллизий.

...