2010-10-22 16 views
5

Ho visto tutti i tipi di soluzioni per l'estensione di cfcs nelle cartelle padre con accesso ai file principali o all'amministrazione CF, ma non ho visto una soluzione praticabile per estendere un cfc in un "condiviso"/fratello cartella senza accesso alle cartelle principali.CFC estende la cartella di pari livello

This solution richiede l'accesso alle cartelle principali? (Non sono sicuro di quali siano queste mappature, ma non ho alcun accesso a Application.cfc)

This solution richiede la possibilità di creare un'applicazione.cfc che non funziona per me (la creazione di una in myApp non fa nulla perché l'ambiente sono in include la pagina indice in myApp e costruisce il da lì ... il cliente non chiama mai direttamente a fuoco il riconoscimento di Application.cfc)

per esempio:

  • wwwroot/qualche/percorso /myApp/Shared/Base.cfc
  • wwwroot/alcuni/percorso/miaApp/Funzione/Funzione .cfc

Sto cercando di essere in grado di chiamare la funzionalità in Base.cfc (che contiene i metodi comuni utilizzati nell'applicazione) da Function.cfc tramite super ed estensione.

Ho accesso a tutti i file in myApp, ma non a "wwwroot", "some" o "path".

Per estendere Base.cfc all'interno di Function.cfc, devo estendere il percorso completo di "some.path.myApp.Shared.Base" Ciò causerebbe problemi se qualcuno rinominasse la cartella myApp poiché avrei dovuto modifica ogni Function.cfc che estende Base.cfc

Quello che sto cercando di farlo crea una "barriera" specifica dell'applicazione quindi se il nome della cartella dell'app cambia non causerà il caos di massa che richiede di modificare tutti i CFC file che utilizzano funzionalità dal Base.cfc.

Poiché non posso utilizzare percorsi relativi alla Base ("..Shared.Base") Mi chiedo se c'è un modo per creare un CFC nella cartella myApp da cui posso estendere e alleviare il mal di testa che cambia se dovesse accadere o un modo per dargli un nome generico come "myApp" ed estendersi da lì. (myApp.Shared.Base)

Non ho accesso a Application.cfm, né all'amministrazione di Coldfusion.

risposta

2

Personalmente vorrei andare in modo più semplice: incapsulare la Base nella Funzione.

Sembra che si desideri utilizzare il set di componenti principali per alcune funzionalità comuni. Se questo è vero, l'incapsulamento è ancora più applicabile.

Percorsi verso oggetti possono essere costruiti in modo dinamico, ad esempio (procedura passo-passo per facilitarne la lettura):

<cfscript> 

    path1 = GetDirectoryFromPath(cgi.SCRIPT_NAME); 
    path2 = ListToArray(path1, "/"); 
    path3 = path2; 
    path3[ArrayLen(path3)] = "shared"; 
    path4 = ArrayToList(path3, "."); 
    path5 = ArrayToList(path2, "."); 

    myBase = CreateObject("component", "#path4#.Base"); 

    myFunction = CreateObject("component", "#path5#.Function").init(myBase); 

</cfscript> 

Nel Function creare funzione init:

<cffunction name="init"> 
    <cfargument name="base"> 
    <cfset variables.Base = arguments.base /> 
    <cfreturn this /> 
</cffunction> 

Naturalmente, potresti avere forti motivi per estendere, ma almeno questo approccio non è sensibile alla rinominazione delle directory madri.

0

Il modo più semplice che posso vedere per fare ciò è creare un collegamento simbolico o un punto di giunzione alla directory di base nella directory delle funzioni di estensione.

Sfortunatamente, non è una soluzione CF pura, né portatile se è necessario spostare il codice. Si spera che qualcuno abbia una risposta migliore, ma questo potrebbe essere un punto di riserva se non ne viene presentato nessuno.

+0

Non ho il controllo del server, quindi questo non funzionerà, ma è una buona ipotesi. L'unico problema che vedo con questo è che in realtà causerebbe ancora lo stesso problema. Se cambi il percorso in ogni caso, il parser Coldfusion morirebbe quando proverai ad estendere il percorso che non c'è. – Andir

0

generare il codice a inizio app/reset ...

Per esempio il tag componente potrebbe essere in questo modo in un file che non deve essere eseguito direttamente ...

<cfabort> 
<cfcomponent extends="{sharedpath}.Base"> 
... 

poi in un funzione o chiamato da Application.cfc fare qualcosa di simile ...

<cfdirectory name="codetemplates" action="list" directory="wwwroot/some/path/myApp/codetemplates" /> 
<cfloop query="codetemplates"> 
    <cffile name="temp" action="read" path="#tempfilepath##filename#" /> 
    <cfset newfilecontent = replace(temp.filecontent, '{sharedpath}', configvarwithrightpath) /> 
    <cfset filecontent = replace(newfilecontent , '<cfabort>', '') /> 
    <cffile name="temp" action="write" path="#livefilepath##filename#" /> 
</cfloop> 

l'altro approccio è quello di avere un processo di compilazione a livello locale che si esegue per creare il codice necessario, ma il mio esempio di cui sopra wo Permetterebbe di aggiornare una variabile di configurazione e aggiornare i cfc come necessario in un ambiente live.

1

Se Base.cfc non estende un altro cfc, è possibile includere il file Base.cfc in un altro file cfc nella cartella delle funzioni.

Per esempio creare un file CFC nella cartella funzione con contenuti:

<cfinclude template="../shared/base.cfc" /> 

quindi estendere il nuovo file al posto del CFC nella cartella condivisa.

0

Perché preoccuparsi di inserire il codice condiviso in una cartella separata? Se lo metti nella stessa cartella dei tuoi "funzioni" cfcs, possono essere tutti estesi usando un percorso relativo.

Così, invece di:

  • wwwroot/qualche/percorso/myApp/Shared/Base.cfc
  • wwwroot/qualche/percorso/frontend/funzione/Function.cfc

Usa :

  • wwwroot/qualche/percorso/frontend/funzione/Base.cfc
  • wwwroot/some/p ath/frontend/funzione/Function.cfc

e:

<cfcomponent extends="Base"></cfcomponent> 

Tuttavia, se avete/bisogno di più "funzione" cartelle -Level, allora si può fare qualcosa di simile. Mettere un Proxy.cfc all'interno di ogni cartella -level "funzione", con questo codice:

<cfcomponent extends="some.path.myApp.shared.Base"></cfcomponent> 

E poi ogni CFC nelle cartelle -Level "funzione" sarebbe estendere il loro locale Proxy.cfc (extends="proxy").Questo ti dà 1 Proxy per cartella, che non è ancora l'ideale, ma è meno problematico dell'aggiornamento di ogni cfc.