2013-12-05 4 views
3

Я пытаюсь найти лучший способ включить как заголовочный файл, так и файл нижнего колонтитула на страницу без необходимости включать два cfincludes на каждую страницу. В принципе, я хочу, чтобы текущая страница была просто содержимым. Я нашел способ, которым это удалось, поместив следующий код в файл application.cfm, но мне интересно, есть ли какая-либо производительность или технические последствия для этого. Есть ли лучший способ сделать это?Как программно включить файл заголовка и нижнего колонтитула в ColdFusion?

application.cfm

<cfset application.header = "/someApplication/applicationHeader.cfm"> 
<cfset application.footer = "/someApplication/applicationFooter.cfm"> 

<cfinclude template="#application.header#"> 
<cfinclude template="#CGI.PATH_INFO#"> 
<cfinclude template="#application.footer#"> 

<!--- somewhat of a hack to make the page content load with the header and footer automatically inserted in the proper places. 
The cfabort prevents the actual page from being loaded a 2nd time. ---> 
<cfabort> 

ответ

3

У Криса хорошее предложение. На самом деле, если вы посмотрите на код большинства фреймворков, вы увидите подходы, похожие на те, которые вы предложили. Вот еще несколько вещей, о которых нужно подумать.

Во-первых, рассмотрите возможность использования Application.cfc вместо Application.cfm. Application.cfc имеет функции onRequestStart() и «onRequestEnd()», которые могут срабатывать в начале (заголовке) и конце (foooter), а также в функции onRequest(), где вы можете включая контент. Это кажется мне более разумным и организовано так, как вы ищите.

Во-вторых, код выше зависит от «cgi.path_info» - это приведет к возникновению некоторых проблем с безопасностью на передней панели. Эта переменная создается с помощью CF, но создается путем разбора URL-адреса - так что возможно, кто-то может понять, как включить файл, отличный от законного веб-файла. Общим примером может быть что-то из папки «temp» CF (которая существует в общем пути на большинстве CF-серверов). Используя этот подход в сочетании с некоторой умной загрузкой хорошего хакера, можно даже получить произвольный код для выполнения.

И, наконец, если вы используете application.cfc, это не ваша чашка чая, вы можете легко использовать вместо этого собственный тег. Пользовательский тег имеет начало и конец «режим выполнения» - так внутри тега вы можете иметь:

<cfif thistag.executionmode IS "start"> 
... write out your header code 
<Cfselseif thistag.executionmode is "end"> 
... write out your footer code 
</cfif> 

Чтобы использовать его, вы бы кронштейну ваш path_info включают так:

<!--- name of your custom tag ---> 
<!--- spits out header here ---> 
<cf_mytagfilename> 

<!--- tacks on content from this include into the buffer ---> 
<cfinclude template="#cgi.path_info#"/> 

<!--- spits out footer here ---> 
</cf_mytagfilename> 

Это и многие другие подходы используются с ColdFusion.CF чрезвычайно гибкий и предоставляет множество возможностей, когда дело доходит до такого рода вещей. Это и благословение, и проклятие, я полагаю :) Удачи!

+0

Это внутри 'application.cfc'? –

+0

@JamesMohler нет, это специальный тег. Может быть где угодно, если вы используете '', или на том же уровне, что и вызывающий, если вы этого не сделаете. Посмотрите, какой пользовательский тег в CF dev doc. – Henry

+0

Спасибо. Я думаю, что в итоге я перейду по маршруту cfc, но если это не закончится, я проверю другие предложения. Один из них будет работать лучше всего. – Javadocs

4

Вы можете рассмотреть структуру, такие как предложенный Крис. Но если у вас нет времени, чтобы начать чтение, обучение и т. Д., Это может быть более чистое решение, чем выше.

сделать файл template.cfm и поместить его в корневой папке (или папка шаблона)

Template.cfm

<html> 
<head> 
</head> 
<body> 
<div>Your header stuff here</div> 

<div><cfoutput>#attributes.mainContent#</cfoutput></div> 

<div>Your footer stuff here</div> 
</body> 
</html> 

В отдельных страницах, вы могли бы настроить что-то вроде этого:

index.cfm

<cfsavecontent variable="maincontent"> 
All your HTML and stuff goes here 
</cfsavecontent> 

<cfmodule template="template.cfm" mainContent="#maincontent#"> 

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

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

+0

Когда будет вызываться 'template.cfm'? –

+0

он вызывается в нижней части каждой страницы сайта. Это также дает вам гибкость при вызове разных шаблонов. Например, я использую шаблоны бутстрапа twitter для моего макета, а иногда мои страницы вызывают всплывающее окно colorbox jquery ... У меня будет отдельный шаблон, который я использую для этого colorbox, который отличается от моего основного шаблона. – steve

Смежные вопросы