Расширение application.cfc в подкаталоге - PullRequest
13 голосов
/ 21 ноября 2008

У меня есть следующие два файла, и я хотел бы, чтобы второй расширил первый:

  1. Wwwroot \ сайт \ Application.cfc
  2. Wwwroot \ сайт \ реж \ Application.cfc

Однако, когда я иду, чтобы объявить компонент для второго файла, я не уверен, что добавить в атрибут extends. Моя проблема в том, что несколько сайтов разработчиков (с общим SVN-репозиторием) работают на одном экземпляре ColdFusion , поэтому я не могу просто создать отображение в администраторе CF, например:

<cfcomponent extends="site.application">

Однако ColdFusion не нравится:

<cfcomponent extends="..application">

или любой динамический ввод, такой как:

<cfcomponent extends="#expandpath('..').#application">

Создание отображения времени выполнения ( как здесь ) также не представляется возможным. Создание его в базовом application.cfc бесполезно, потому что этот код еще не был выполнен к моменту объявления наследующего cfc; и я не могу создать сопоставление до того, как будет определен наследующий компонент, потому что еще нет приложения для его подключения.

Можно ли как-то ссылаться на родительский каталог для выполнения моих расширений?

Изменить, чтобы уточнить: Решение ApplicationProxy не работает из-за выделенного текста выше. Прямо сейчас, в качестве обходного пути, мы просто не проверяем \ dir \ application.cfc в SVN, чтобы каждый разработчик мог сохранить версию, которая расширяет его собственный корневой application.cfc. Очевидно, это не идеально.

Ответы [ 3 ]

16 голосов
/ 21 ноября 2008

У Шона Корфилда есть запись в блоге, объясняющая, как расширить корневой файл Application.cfc .

Ниже приведена соответствующая информация, скопированная из этой записи.


Вот ваш корневой CFC /Application.cfc:

<cfcomponent>

    <cfset this.name = "cf7app" />
    <cfset this.sessionmanagement = true />

</cfcomponent>

Вот ваш прокси CFC /ApplicationProxy.cfc:

<cfcomponent extends="Application">
</cfcomponent>

Он абсолютно пустой и служит просто для создания псевдонима для вашего корневого каталога /Application.cfc. Вот ваш подкаталог CFC /app/Application.cfc:

<cfcomponent extends="ApplicationProxy">

    <cffunction name="onSessionStart">
        <cfoutput><p>app.Application.onSessionStart()</p></cfoutput>
        <cfset session.counter = 0 />
    </cffunction>

    <cffunction name="onRequestStart">
        <cfoutput><p>app.Application.onRequestStart()</p></cfoutput>
        <cfdump label="application" var="#application#"/>
    </cffunction>

</cfcomponent>

Корень каждого отдельного сайта должен иметь собственное главное приложение:

/site1/Application.cfc
/site2/Application.cfc
/site3/Application.cfc

Все эти приложения являются отдельными индивидуальными приложениями, между которыми ничего нет.

Если на каком-либо из этих отдельных сайтов должны быть вложенные приложения, то вместе с мастером должен быть ApplicationProxy.cfc,

e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc

Затем для каждого подприложения у вас есть тот, который расширяет прокси:

e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
4 голосов
/ 22 ноября 2008

Следующий код работает для меня. Однако я заметил, что application.cfc кэшируется, поэтому изменения в cfc родительского приложения могут не отражаться. Я справился с этим, сделав тривиальные изменения в дочернем приложении cfc.

<cfcomponent output="false">
        <cfset variables.higherPath = ReReplace(GetMetaData(this).name,"\.[^\.]+\.[^\.]+$","") />
        <cfset variables.extendApp = CreateObject("component", "#variables.higherPath#.Application") />

        <cfloop item="variables.key" collection="#variables.extendApp#">
            <cfif IsCustomFunction(variables.extendApp[variables.key])>
                <cfset super[variables.key] = variables.extendApp[variables.key]>
            <cfelse>
                <cfset this[variables.key] = variables.extendApp[variables.key] >
            </cfif>
        </cfloop>
        <cffunction name="onApplicationStart" output="false">
            <cfset super.onApplicationStart() />
        </cffunction>
3 голосов
/ 08 марта 2010

Я знаю, что это старая тема, но я нашел способ сделать это (что, похоже, работает в моем тестировании) без использования сопоставлений CF Administrator.

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

<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>

Да, это кажется немного хакерским, но, похоже, работает.

...