2013-04-22 1 views
1

Хорошо, у меня есть файлы шаблонов, которые я знаю потребует, чтобы быть между <cfoutput> тегов, однако размещение <cfoutput> тег вокруг <cfinclude> не будет работать, и ничего с <cfmodule> не будет работать, как и не позволяет мне манипулировать областью variables.cfInclude без cfoutput тегов

Итак, любые идеи - независимо от того, насколько сложны - что позволило бы мне включить такой файл шаблона и заставить его действовать так, как будто это между <cfoutput> тегами?


бит контекста: Это для «рамок» я работаю и требующих каждый файл шаблона, чтобы начать и закончить с <cfoutput> теге кажется реальной отходы, особенно потому что меньше «coldfusiony» шаблоном из файлы выглядят, тем лучше ИМО.

+2

AFAIK '' должен быть в том же .cfm и нет никакого способа вокруг него. Если вы не выполняете какое-то динамическое программирование, где вы читаете свой .cfm и записываете новый .cfm, который имеет '' – Henry

+0

Это определенно было бы одним из вариантов, хотя удар по производительности был бы неплохим. Я рассмотрел этот вариант в контексте вызова оценки (который ограничен выражениями), и на самом деле писать файл будет еще дороже :( –

+0

Я понятия не имел, что это так. Вот почему я считаю, что ответы на вопросы на форумах образовательный. –

ответ

6

Я собирался предложить опцию render(), с предостережением это чертовски ужасная часть функциональности в OpenBDML (или что бы они ни называли своей версией CFML), и я думаю, этого следует избегать. Я не вижу, как это не приводит к тому, что CFML перекомпилирует каждый запрос, что является накладной. Я думаю, что вам лучше изменить разметку, когда она будет сохранена/прочитана, чтобы обернуть/развернуть ее в тегах <cfoutput>. Таким образом, полученный CFML будет только перекомпилирован, когда файл действительно изменится. Который будет действительно намного реже, чем он будет прочитан.

Подсказка по вашему вопросу, я сделал a bit of a write up on the CFML compile process, показывая, почему наличие тегов <cfoutput> в отдельном файле не работает. Извинялся, что понадобилось так много времени, чтобы написать &.

+0

По сути, я понял, что это так, как я отметил в своем собственном ответе, и я выразил надежду, что тот факт, что cfml на страницах относительно прост, минимизирует накладные расходы, но я думаю, что я буду проводить бенчмаркинг в этой области (сравнение хэширования + запись на диск для рендеринга() без необходимости «версии» файлов). –

+0

О да, я имею в виду «как общее решение». Думаю, render() - это ужасная перспектива, аналогичная оценке(). Однако до тех пор, пока кто-то помнит это, если окажется, что это полностью соответствует вашей ситуации, тогда не позволяйте догме или педантизму препятствовать вам использовать ее. Я думаю, что это хорошая идея - сравнить его; но в равной степени помните, что, возможно, лучше взять удар по коду, который * изменяет * содержимое, чем код, который * читает * содержимое. Похоже, что у вас есть хорошая ручка. Надеюсь, по крайней мере, мои комментарии были пищей для размышлений! –

0

Найден OpenBD конкретный способ решить эту проблему. По-видимому, я был не единственным, кто столкнулся с этой проблемой, и OpenBD содержит полезный render(), который занимается оценкой содержимого cfml. Так что я закончил с

<cfset cfml = fileRead(expandPath(...))> 
... 
<cfoutput>#render("<cfoutput>"&cfml&"</cfoutput>")#</cfoutput> 

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

+0

Запись фактического файла на диск будет скомпилирована до класса, который может хорошо работать в конечном итоге. До тех пор, пока вы будете писать только один раз до изменения. :) – Henry

+0

«запись его до тех пор, пока не будет изменено» -> Это потребует от меня отслеживания предыдущего состояния файла и сравнения его с тем состоянием, которое также может привести к значительным накладным расходам (особенно, поскольку я должен отслеживать это в файловой системе (нет доступа к db)). –

+0

Вот почему я предпочитаю руководство '? Init = true' – Henry

1

Что мы делаем в колесе просто обернуть cfinclude с cfsavecontent тегом

<cffunction name="renderInclude"> 
    <cfargument name="template" value="string" required="true"> 
    <cfset var myOutput = ""> 

    <cfsavecontent variable="myOutput"><cfoutput><cfinclude template="#arguments.template#"></cfoutput></cfsavecontent> 


    <cfreturn trim(myOutput)> 
</cffunction> 
+0

Это довольно умное решение. – TheGerm