2008-11-21 14 views
13

Mam następujące dwa pliki i chciałby drugi przedłużyć pierwszy:Rozszerzanie application.cfc w podkatalogu

  1. Wwwroot \ Site \ application.cfc
  2. wwwroot \ site \ Application \ dir. cfc

Jednak, gdy idę do deklarowania komponentu dla drugiego pliku, nie jestem pewien, co umieścić w atrybucie extends. Moim problemem jest to, że kilka stron dev (ze wspólnym repozytorium SVN) są zjechania tę samą instancję ColdFusion, więc nie można po prostu utworzyć odwzorowanie w admin CF tak:

<cfcomponent extends="site.application"> 

jednak ColdFusion nie lubi:

<cfcomponent extends="..application"> 

ani żadnego dynamicznego wprowadzania podobnego:

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

Tworzenie odwzorowania wykonawczego (like here) również nie wydaje się możliwe. Utworzenie go w bazowym pliku application.cfc jest bezużyteczne, ponieważ kod ten nie został jeszcze wykonany przed deklaracją dziedziczącego cfc; i nie mogę utworzyć mapowania przed zdefiniowaniem składnika dziedziczącego, ponieważ nie ma jeszcze aplikacji, do której można by dołączyć.

Czy istnieje sposób, w jaki mogę odwołać się do katalogu nadrzędnego, aby zrealizować moje rozszerzenia?

Edytuj, aby wyjaśnić: Rozwiązanie ApplicationProxy nie działa z powodu pogrubionego tekstu powyżej. W tej chwili, po obejściu tego problemu, po prostu nie sprawdzamy \ dir \ application.cfc w SVN, aby każdy programista mógł zachować wersję, która rozszerza jego własny program root.cfc. Oczywiście nie jest to idealne.

Odpowiedz

4

Poniższy kod działa dla mnie. Zauważyłem jednak, że plik application.cfc wydaje się być buforowany, więc zmiany w aplikacji macierzystej cfc mogą nie zostać odzwierciedlone. Zająłem się tym, dokonując drobnej zmiany w aplikacji cfc dla dzieci.

<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> 
16

Sean Corfield ma a blog entry explaining how to extend a root Application.cfc.

Poniżej znajduje się odpowiednia informacja skopiowana z tego wpisu.


Oto twój korzeń CFC /Application.cfc:

<cfcomponent> 

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

</cfcomponent> 

Oto proxy CFC /ApplicationProxy.cfc:

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

To całkowicie pusta i służy jedynie do tworzenia aliasu dla twój root /Application.cfc. Oto Twoja podkatalogu 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> 

Korzeń każdy indywidualna strona powinna mieć swój własny Mistrz aplikacji:

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

Wszystkie te aplikacje są oddzielne poszczególne aplikacje z niczym nie dzielonym między nimi.

Jeśli którakolwiek z tych witryn wymaga aplikacji podrzędnych, powinna istnieć ApplicationProxy.CFC alonside Mistrza,

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

Następnie dla każdego sub-aplikacji masz taki, który rozciąga się Proxy:

e.g. 
/site1/subA/Application.cfc 
/site1/subB/Application.cfc 
/site2/subA/Application.cfc 
+0

Czy to nie zakłada, że ​​katalog główny witryny jest katalogiem głównym? Wydaje się, że nie działa dla mnie. – Soldarnal

+0

Soldernal, jeśli katalog główny witryny nie jest katalogiem głównym, konieczne będzie mapowanie do katalogu głównego witryny. Jeśli twoja nazwa odwzorowania jest foo, to rozszerzasz "foo.application". –

+0

Wygląda na to, że po raz kolejny napotkałem mój pierwotny problem. Jeśli utworzę mapowanie dla foo na \ devsite1 \, to \ devsite2 \ dir \ application.cfc rozszerzy \ devsite1 \ application.cfc – Soldarnal

3

Wiem, że to stary temat, ale znalazłem sposób to zrobić (który wydaje się działać w moich testów) bez użycia mapowania administratora CF.

Można to zrobić poprzez dodanie mapowania za-stosowaniu w swoim dzieckiem Application.cfc stosując rozszerzoną ścieżkę względną:

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

Tak, to czuje się trochę hacky, ale wydaje się działać.

+0

To nie wydaje się działać dla mnie. Czy mógłbyś wyjaśnić to dalej i może wymienić, z której wersji ColdFusion korzystasz? Wygląda na to, że mapowanie nie zostanie zdefiniowane, dopóki aplikacja Application.cfc nie zostanie przetworzona, co nie może się zdarzyć, ponieważ mapowanie jest wymagane do przejścia przez pierwszą linię. – Nicholas