Domanda

Ho visto tutti i tipi di soluzioni per estendere i CFC in cartelle principali con l'accesso ai file controllanti o l'amministrazione CF, ma non ho visto una soluzione praticabile per estendere un CFC in una cartella / di pari livello "condivisa" senza accesso cartelle principali.

Questa soluzione richiede l'accesso a cartelle superiori? (Non so cosa questi mapping sono, ma non ho accesso a Application.cfc comunque)

Questa soluzione richiede poter creare un Application.cfc che doesn 't lavoro per me (la creazione di uno in myApp non fa nulla perché l'ambiente sono in include la pagina indice in myApp e costruisce il là dal ... il cliente non chiama mai direttamente al riconoscimento fuoco della Application.cfc)

Per esempio:

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

Sto cercando di essere in grado di chiamare funzionalità nel Base.cfc (che contiene i metodi più comuni utilizzati nell'applicazione) dal Function.cfc attraverso super e l'estensione.

Ho accesso a tutti i file all'interno myApp, ma non "wwwroot", "alcuni", o "strada".

Al fine di estendere Base.cfc entro Function.cfc devo estendere il percorso completo di "some.path.myApp.Shared.Base" Questo potrebbe causare problemi se qualcuno rinominato la cartella myApp dal momento che avrebbe dovuto modificare mano ogni Function.cfc che si estende che Base.cfc

Quello che sto cercando di farlo creare un'applicazione specifica "barriera", quindi se il nome della cartella app cambia lo farà non causare il caos di massa che richiede modificare i Tutti i file CFC che la funzionalità uso dal Base.cfc.

Dal momento che non posso utilizzare i percorsi relativi alla Base ( "..Shared.Base") mi chiedo se c'è un modo per creare un CFC nella cartella myApp che posso estendere da e alleviare il mal di testa, se rinomina dovesse verificarsi o un modo per dare un nome generico come "myApp" ed estendere da lì. (MyApp.Shared.Base)

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

È stato utile?

Soluzione

Personalmente vorrei andare modo più semplice:. Incapsulate Base nella funzione

Sembra che si desidera utilizzare il set di componenti di base per alcune funzionalità comuni. Se questo è vero -. Incapsulamento ancora più applicabile

Tracciati agli oggetti può essere costruito 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 di init:

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

Naturalmente, si può avere validi motivi per estendere, ma almeno questo approccio non è sensibile alle directory superiori ridenominazione.

Altri suggerimenti

Se Base.cfc non si estende un altro CFC, allora potreste essere in grado di includere il file in un altro file Base.cfc CFC nella cartella funzione.

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.

Il modo più semplice che posso vedere per farlo è quello di creare un punto di collegamento simbolico o di giunzione alla directory di base nella directory funzione di estensione.

Purtroppo, non è una soluzione CF pura, né portatile se è necessario spostare il codice. Si spera, qualcuno avrà una risposta migliore, ma questo potrebbe essere un punto di ripiego se nessuno si presenta.

Genera 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 una funzione o richiamato dal 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 avrebbe permesso di aggiornare una variabile di configurazione e aggiornare il CFC, se necessario in un ambiente vivo.

Perché preoccuparsi di mettere il codice condiviso in una cartella separata? Se hai appena messo nella stessa cartella del CFC "funzioni", allora tutti possono estenderlo utilizzando 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 / qualche / percorso / frontend / funzione / Function.cfc

e

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

Tuttavia, se avete / "Funzione" bisogno di più 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" si estenderebbe la loro Proxy.cfc locale (extends="proxy"). Questo ti dà 1 Proxy per cartella, che è ancora non è l'ideale, ma meno di un fastidio che aggiornare ogni cfc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top