Если у меня есть структура папок, которая похожа на это:
/
/bin/myComponent.cfc
/reports/index.cfm
Как я инициирую myComponent.cfc от index.cfm?
myService = createObject("component", "bin.myComponent");
Используя точечный синтаксис, я знаю, как перейти к более глубоким папкам, но как сделать, я поднимаюсь папка, и вниз в другую папку? Используя синтаксис наклонной черты это было бы что-то вроде этого:
../bin/myComponent.cfc
Но createObject () не прокладывает себе путь. Я хотел бы сохранить относительный путь так, чтобы я мог переместить эту папку в другой сервер, не повреждая пути.
Идеи?Спасибо!
Править:
Мой пример не отобразил достаточно глубокую структуру папок для творческих ответов, которые Вы все предоставили. Вот то, что я должен был сделать:
/[my project folder]/
/[my project folder]/bin/myComponent.cfc
/[my project folder]/reports/index.cfm
Мой основной вопрос состоял в том, если было возможно повыситься каталог при использовании createObject ("компонент", "отметьте точкой путь") от index.cfm до myComponent.cfc, ЕСЛИ название [моя папка проекта] не статично через все установки проекта.
Если ответ будет нет, то я должен буду просто выяснить, какова лучшая практика, является ли это отображением или параметром настройки приложения.
Мы обрабатываем это с помощью сопоставления в администраторе cf. Обычно все компоненты идут в одном каталоге, который находится над корнем www. В вашем случае вы можете добавить сопоставление с / которое позволит вам сделать:
myService = createObject("component", "mymapping.bin.myComponent");
просто используйте полный путь от корня
где item.cfc находится в [корне сайта] / lib / cart / - это будет работать из любого места вашего кода.
если у вас есть Application.cfc в корне структуры папок, вы можете использовать что-то вроде этого:
<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) />
, а затем получить к нему доступ через "local.bin.myComponent"
Это конец тяжелой недели, так что вполне вероятно, что следующий код может быть как-то улучшен, но в целом этот подход должен работать:
<cfscript>
// this script is here http://XXXXXXX/test/paths/relative/reports/index.cfm
// component is here http://XXXXXXX/test/paths/relative/bin/myComponent.cfc
local = {};
// initialize with dynamic mapping
local.myComponentDynamic = createObject("component", "/bin/myComponent");
// grab the current directory name
local.parentPathExpanded = ExpandPath("../");
local.scriptPathExpanded = ExpandPath(cgi.SCRIPT_NAME);
local.thisDirectory = GetDirectoryFromPath(Replace(local.scriptPathExpanded, local.parentPathExpanded, ""));
// build base path
local.scriptPathDirectory = GetDirectoryFromPath(cgi.SCRIPT_NAME);
local.basePath = Replace(local.scriptPathDirectory, local.thisDirectory, "");
// this is relative path we already know
local.relativePath = "bin/myComponent";
// initialize with slash-syntax (path starting with /)
local.myComponentSlash = createObject("component", local.basePath & local.relativePath);
// convert path to the dot-syntax
local.dottedPath = Replace(local.basePath & local.relativePath, "/", ".", "ALL");
local.dottedPath = Right(local.dottedPath, Len(local.dottedPath)-1);
// initialize with dot-syntax path
local.myComponentDot = createObject("component", local.dottedPath);
</cfscript>
<cfdump var="#local#">
Я разделил процесс на отдельные переменные и выкинул общий контейнер, просто чтобы было легче читать и понимать этот пример.
Но в любом случае, если вы можете использовать динамическое отображение в Application.cfc - используйте его.
EDIT: Я добавил такой пример, предполагая, что у вас есть следующий Application.cfc в родительской папке (например, "../Application.cfc", если смотреть из index.cfm):
<cfcomponent output="false">
<cfset this.mappings["/bin"] = getDirectoryFromPath(getCurrentTemplatePath()) & "bin/" />
</cfcomponent>
Мой пример с "преобразованием путей" - это просто забавная хитрость и игра с кодом, который на самом деле не является простым подходом для хороших приложений.