В Coldfusion, как делают меня init компонент, который расположен выше текущей папки пути?

Если у меня есть структура папок, которая похожа на это:

/
/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, ЕСЛИ название [моя папка проекта] не статично через все установки проекта.

Если ответ будет нет, то я должен буду просто выяснить, какова лучшая практика, является ли это отображением или параметром настройки приложения.

17
задан Dan Sorensen 26 March 2010 в 23:33
поделиться

4 ответа

Мы обрабатываем это с помощью сопоставления в администраторе cf. Обычно все компоненты идут в одном каталоге, который находится над корнем www. В вашем случае вы можете добавить сопоставление с / которое позволит вам сделать:

myService = createObject("component", "mymapping.bin.myComponent");
16
ответ дан 30 November 2019 в 11:26
поделиться

просто используйте полный путь от корня

где item.cfc находится в [корне сайта] / lib / cart / - это будет работать из любого места вашего кода.

3
ответ дан 30 November 2019 в 11:26
поделиться

если у вас есть Application.cfc в корне структуры папок, вы можете использовать что-то вроде этого:

<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) />

, а затем получить к нему доступ через "local.bin.myComponent"

17
ответ дан 30 November 2019 в 11:26
поделиться

Это конец тяжелой недели, так что вполне вероятно, что следующий код может быть как-то улучшен, но в целом этот подход должен работать:

<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
ответ дан 30 November 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: