Использование относительных путей в файлах cfinclude'd - PullRequest
3 голосов
/ 20 сентября 2009

Я немного новичок в ColdFusion и пытаюсь понять, как лучше всего использовать файлы cfinclude'd. Единственное, что я нахожу ограничивающим, это то, что файлы включаются как строки, как если бы они были частью включающего шаблона. Это красиво и просто, но это означает, что любые относительные пути внутри включаемого файла разрешаются относительно включающего, а не включаемого файла. Это становится проблемой в следующем макете файла:

a.cfm   <--- cfincludes b.cfm
b.cfm   <--- cfincludes c.cfm
c.cfm
somedir/d.cfm   <--- cfincludes ../b.cfm

Когда a.cfm включает b.cfm, все работает хорошо. Когда d.cfm включает ../b.cfm, включение в b.cfm из c.cfm завершится ошибкой, поскольку оно разрешено относительно d.cfm. Итак, два вопроса для моего назидания:

  • Есть ли лучшая практика для CF по типу "файлы, которые вы ожидаете включить из других файлов, не должны включать относительные ссылки"?

  • Я пытаюсь понять проектное решение. Я понимаю, что эффект cfinclude заключается в том, что включаемый файл является частью включающего элемента - в этом есть элегантная простота. Но есть ли непатологические случаи, когда предпочитают разрешать относительные связи таким образом? Я могу вспомнить случаи, когда я хочу, чтобы они были разрешены «традиционно», то есть относительно файла, в котором они находятся. Может быть, я что-то упустил.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2009

Лучший способ объяснить это состоит в том, чтобы рассматривать (на любом языке) включения как копирование / вставка на стороне сервера. Это относится к ColdFusion, ASP, PHP, .NET, вы называете это ... Включенный файл считается работающим в контексте его родительской страницы. Сервер по существу берет содержимое файла , включенного , и вставляет его в родительский файл.

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

Dan

2 голосов
/ 20 сентября 2009

В основном эта тема покрыта руководством . Но просто чтобы показать идею использования. Предположим, что наше приложение находится на http://localhost/myapp/

Это просто особая функция путей ColdFusion: «абсолютный» путь здесь - это web-root »/myapp/".

Затем в Application.cfc (Application.cfm) вы можете определить базовый URL:

<!--- hardcoded --->
<cfset application.basePath = "/myapp/" />
<!--- more intelligent --->
<cfset application.basePath = GetDirectoryFromPath(CGI.SCRIPT_NAME) />

и включать шаблоны каждый раз как

<cfinclude template="#application.basePath#b.cfm" />

Это просто дает базовое представление о том, как сделать независимым от текущего местоположения шаблона.

Другой способ - использовать сопоставления: сервер или динамический (CF8 +), но это немного другая история.

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

...