In Coldfusion, come faccio a init un componente che si trova sopra la cartella percorso corrente?

StackOverflow https://stackoverflow.com/questions/2525785

  •  22-09-2019
  •  | 
  •  

Domanda

Se ho una struttura di cartelle che assomiglia a questo:

/
/bin/myComponent.cfc
/reports/index.cfm

Come faccio Io inizio myComponent.cfc da index.cfm?

myService = createObject("component", "bin.myComponent");

Utilizzando la sintassi del punto, so come andare alle cartelle più profonde, ma come faccio ad andare su una cartella, e giù nella altra cartella? Utilizzando sintassi della barra che sarebbe stato qualcosa di simile:

../bin/myComponent.cfc

Ma createObject () non funziona in questo modo. Mi piacerebbe mantenere un percorso relativo in modo che possa spostare questa cartella a un altro server senza rompere i percorsi.

Idee? Grazie!

EDIT:

Il mio esempio non visualizzava una struttura di cartelle abbastanza profonda per le risposte creative che tutti voi avete fornito. Ecco quello che ho dovuto fare:

/[my project folder]/
/[my project folder]/bin/myComponent.cfc
/[my project folder]/reports/index.cfm

La mia domanda fondamentale è se fosse possibile salire una directory quando si utilizza CreateObject ( "componente", "percorso punto") da index.cfm al myComponent.cfc se il nome della [mia cartella del progetto] non è statico in tutta tutte installa del progetto.

Se la risposta è NO, allora io solo bisogno di capire che cosa la pratica migliore è, se si tratta di una mappatura o un impostazione dell'applicazione.

È stato utile?

Soluzione

Ci occupiamo di questo utilizzando una mappatura a l'amministratore cfr. Di solito tutti i componenti vanno in una directory che si trova sopra la radice www. Nel tuo caso si potrebbe aggiungere una mappatura a / che consentirebbe di fare:

myService = createObject("component", "mymapping.bin.myComponent");

Altri suggerimenti

se avete l'Application.cfc nella root della struttura delle cartelle, si potrebbe usare qualcosa di simile:

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

e poi accedervi tramite "local.bin.myComponent"

Si tratta di una fine della settimana duro, in modo abbastanza probabile che seguente codice può essere migliorata in qualche modo, ma in generale questo approccio dovrebbe funzionare:

<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#">

Ho diviso il processo nelle variabili separati e scaricai il contenitore comune solo per rendere più facile da leggere e capire questo esempio.

Ma in qualsiasi modo, se è possibile utilizzare la mappatura dinamica Application.cfc - usarlo .

Modifica Ho aggiunto come ad esempio, supponendo che siano presenti i seguenti Application.cfc nella cartella principale (ad esempio "../Application.cfc" se si guarda dal index.cfm):

<cfcomponent output="false">

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

</cfcomponent>

I miei "percorsi di conversione" esempio è solo un inganno divertimento e giocare con il codice che non approccio davvero semplice per le buone applicazioni.

basta utilizzare il percorso completo dalla radice

<cfset obj = createObject("component", "bin.cart.item")>

dove item.cfc in situato nel [root sito] / lib / carrello / -. Questo sarà il lavoro da qualsiasi punto del codice

Ho avuto questo stesso problema e questa è stata la mia soluzione. E 'piuttosto semplice ma ci sono voluti un paio d'ore perché mi da colpire. Speriamo che questo vi farà risparmiare qualcuno un po 'di tempo.

Ho iniziato con

<bean id="ColdBooksConnectionService" class="myservice.model.service.ConnectionService" />

e sempre ottenuto l'errore che non era disponibile, così ho scritto il percorso completo

<bean id="ColdBooksConnectionService" class="/CFIDE.administrator.myservice.model.service.ConnectionService" />

e il problema è risolto.

Spero che questo aiuti.

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