В Coldfusion, как мне начать компонент, расположенный над текущей папкой пути?
Если у меня есть структура папок, которая выглядит так:
/
/bin/myComponent.cfc
/reports/index.cfm
Как мне запустить myComponent.cfc из index.cfm?
myService = createObject("component", "bin.myComponent");
Используя синтаксис точек, я знаю, как перейти к более глубоким папкам, но как это сделать, я поднимаю папку и вниз в другую папку? Используя синтаксис слэш, это будет примерно так:
../bin/myComponent.cfc
Но createObject() не работает таким образом. Я хотел бы сохранить относительный путь, чтобы переместить эту папку на другой сервер, не нарушая пути.
Идеи? Спасибо!
EDIT:
В моем примере не было достаточно глубокой структуры папок для ответов на объявления, которые вы все предоставили. Вот что я должен был сделать:
/[my project folder]/
/[my project folder]/bin/myComponent.cfc
/[my project folder]/reports/index.cfm
Мой основной вопрос состоял в том, было ли возможно перейти в каталог при использовании createObject ( "component", "dot path" ) из index.cfm в myComponent.cfc ЕСЛИ имя [папка моего проекта] не является статическим в все установки проекта.
Если ответ НЕТ, тогда мне просто нужно выяснить, что такое лучшая практика, будь то сопоставление или настройка приложения.
Ответы
Ответ 1
Мы обрабатываем это с помощью сопоставления в администраторе cf. Обычно все компоненты входят в один каталог, который находится выше корня www. В вашем случае вы можете добавить сопоставление в /, которое позволит вам сделать:
myService = createObject("component", "mymapping.bin.myComponent");
Ответ 2
если у вас есть Application.cfc в корне вашей структуры папок, вы можете использовать что-то вроде этого:
<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) />
а затем получить доступ к нему через "local.bin.myComponent"
Ответ 3
Это конец тяжелой недели, поэтому довольно вероятно, что следующий код может быть как-то усилен, но в целом этот подход должен работать:
<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>
Мой пример "преобразования путей" - это просто забавный обман и игра с кодом, который не очень простой подход для хороших приложений.
Ответ 4
просто используйте полный путь из корня
<cfset obj = createObject("component", "bin.cart.item")>
где item.cfc находится в [веб-корневой]/lib/cart/- это будет работать из любого места вашего кода.
Ответ 5
У меня была такая же проблема, и это было мое решение. Это довольно прямолинейно, но потребовалось несколько часов, чтобы он ударил меня. Надеюсь, это немного сэкономит.
Я начал с
<bean id="ColdBooksConnectionService" class="myservice.model.service.ConnectionService" />
и всегда получил ошибку, что он недоступен, поэтому я написал полный путь
<bean id="ColdBooksConnectionService" class="/CFIDE.administrator.myservice.model.service.ConnectionService" />
и проблема решена.
Надеюсь, что это поможет.