Тег <cfinclude>. Скрытые возможности.

Наверняка вы уже давно знаете, что тег <cfinclude> предназначен только для того, чтобы «на лету» компилировать файлы и вставлять их код в ваш файл. Это не так и эта статья докажет вам это.

 

<cfinclude> как средство вставить код из внешнего файла

С самого начала мы знаем, что тег <cfinclude> предназначен для того, чтобы вставлять код из внешнего файла. Самым распространенным примером является использование верхней (header) и нижней (footer) частей сайта как подключаемых внешних файлов. Такие подключения мы делаем так: <cfinclude template="header.cfm">. Результатом будет то, что данный подключаемый файл header.cfm будет в начале каждой страницы. Если нам понадобиться изменить все верхние части сайта, то достаточно отредактировать всего лишь один файл header.cfm и изменения будут видны сразу на всех страницах.

Возможно, вы также знаете, что основной и подключаемый файлы имеют доступ к одним и тем же контейнерам переменных. Например, если мы в основном файле main.cfm определим переменную name:
Затем, в подключаемом файле included.cfm переопределим ту же переменную:
В результате основной файл выведет на экран имя Ольга.

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

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

Вы сами можете посмотреть, как и где CFMX создает откомпилированные Java классы. В Windows откройте папку cfusionmx\wwwroot\WEB-INF\cfclasses. По-умолчанию все компилируемые файлы хранятся здесь.

Еще одно доказательство необычности тега <cfinclude> заключается в том, что мы может устанавливать подключаемый файл динамически. Да, подключаемый фал может быть переменной!

 

<cfinclude> как инструмент вывода обработанного кода

Как мы уже поняли, тег <cfinclude> не просто получает код из внешнего файла. Код сначала обрабатывается, а потом вставляется в основной файл. Но, что если нам нужно подключить не CFML файл? Можем ли мы подключить, например, XML файл? Конечно! Подключая файл, мы вставляем не код, а то, что возвращает подключаемый файл.

Некоторые подключаемые файлы могут неправильно отображаться, пока мы не укажет соответствующий им MIME тип. Вот пример:
Если у вас возникают проблемы с отображением этого файла в Internet Explorer’e, то попробуйте запустить тот код под Netscape’ом. Дело в том, что IE пытается обработать подключаемый XML файл, используя свои встроенные стили. Если отображаемый результат не является чистым XML, то IE вообще не покажет страницу.

 

<cfinclude> как инструмент передачи содержимого

Если мы может подключать XML файлы, то тег <cfinclude> предназначен для работы не только с кодом. Как насчет подключения PDF файлов? Конечно и это сработает, если сначала вы укажите правильный MIME тип:

Многие спросят: «Зачем в данном примере использовать тег <cfinclude>, если вызываемый файл можно указать прямо в атрибуте file тега <cfcontent>?». Между двумя этими способами подключения внешнего файла существует, по крайней мере, одно отличие:

В атрибуте file тега <cfcontent> следует указывать абсолютный путь к файлу (имя диска/папка/файл), а в атрибуте template тега <cfinclude> следует указывать относительный путь (здесь также можно использовать маппинг). Кроме того, тег <cfcontent > позволяет указывать MIME тип прямо в теге и это останавливает дальнейшую обработку страницы. Безусловно, тег <cfcontent> имеет свои преимущества, но, если они вам не подходят, то тег <cfinclude> будет хорошей альтернативой.

 

<cfinclude> как альтернатива тегу <cffile>

А что, если мы используем тег <cfinclude> как способ считывания текстового файла, предварительно окружив его тегами <cfsavecontent>? Будет ли это означать то же самое, что и <cffile action=”read”>? Да. Вот пример:

Конечно, есть еще и другие способы считывать файл: тег <cfhttp> или Java классы. В этом не ничего особенного, но многих может удивить.

 

Обрабатываем Application.cfm в подключаемых файлах

Когда вы вызываете подключаемый файл или пользовательский тег, то эти внешние файлы не обрабатывают относящиеся к ним файлы Application.cfm и OnRequestEnd.cfm. Но бывают случаи, когда хочется, чтобы они обрабатывали эти файлы.

В документации по CFMX можно найти функцию, которая позволяет подключать внешние JSP файлы в CFML файлы. Пример выглядит так: getpagecontext().include(“mypage.jsp”). Но таким способом можно подключать не только JSP, но и CFML файлы. Таким образом, если мы вызовем файл напрямую, то он подключиться как обычная CFML страница, предварительно обработав все относящиеся к нему файлы Application.cfm и OnRequestEnd.cfm.

 

Заключение

В любом случае, используете ли вы CFMX, CF 4, CF 5 или BlueDragon, надеюсь, что вы узнали из этой статьи много интересного.

Мы узнали, что тег <cfinclude> не просто средство для включения кода из внешнего файла. Он открывает двери к интересным сходствам с тегами <cfcontent> и <cffile>. А также, мы узнали, что можно подключать внешние файлы напрямую, как обычные CFML страницы, которые предварительно обрабатывают относящиеся к ним файлы Application.cfm и OnRequestEnd.cfm.


Источник: The Secret Powers of Includes

 


Hosted by uCoz