Vraag Hoe initialiseer ik in Coldfusion een component die zich boven de huidige padmap bevindt?


Als ik een mappenstructuur heb die er zo uitziet:

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

Hoe start ik myComponent.cfc vanuit index.cfm?

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

Met behulp van de puntsyntax weet ik hoe ik naar diepere mappen moet gaan, maar hoe ga ik te werk, ga ik naar een map en naar de andere map? Met de syntaxis van slash zou het ongeveer zoiets zijn als dit:

../bin/myComponent.cfc

Maar createObject () werkt niet zo. Ik wil graag een relatief pad behouden zodat ik deze map naar een andere server kan verplaatsen zonder de paden te overschrijden.

Ideeën? Bedankt!

BEWERK:

Mijn voorbeeld toonde geen diep genoeg mappenstructuur voor de creatieve antwoorden die jullie allemaal hebben gegeven. Dit is wat ik had moeten doen:

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

Mijn belangrijkste vraag was of het mogelijk was om een ​​map OMHOOG te gaan bij het gebruik van createObject ("component", "puntpad") van index.cfm naar myComponent.cfc ALS de naam van [mijn projectmap] niet statisch is voor alle installaties van het project.

Als het antwoord NEEN is, moet ik er gewoon achter komen wat de beste werkwijze is, of het nu een mapping- of een applicatie-instelling is.


16
2018-03-26 18:35


oorsprong


antwoorden:


Dit doen we met behulp van een toewijzing in de cf-beheerder. Gewoonlijk gaan alle componenten in één map boven de www-root. In uw geval kunt u een toewijzing toevoegen aan / waarmee u het volgende kunt doen:

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

15
2018-03-26 18:47



als u de Application.cfc in de hoofdmap van uw mappenstructuur hebt, kunt u zoiets als dit gebruiken:

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

en toegang tot het via "local.bin.myComponent"


17
2018-03-26 20:00



Het is een einde aan de harde week, dus het is zeer waarschijnlijk dat de volgende code op de een of andere manier kan worden verbeterd, maar over het algemeen zou deze aanpak moeten werken:

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

Ik heb het proces opgesplitst in de afzonderlijke variabelen en de algemene container gedeponeerd om het gemakkelijk te maken dit voorbeeld te lezen en te begrijpen.

Maar in ieder geval, als u dynamische toewijzing in Application.cfc kunt gebruiken - gebruik deze.

BEWERK: Ik heb een dergelijk voorbeeld toegevoegd, ervan uitgaande dat u Application.cfc in de bovenliggende map hebt gevolgd (bijvoorbeeld "../Application.cfc" als u kijkt vanuit index.cfm):

<cfcomponent output="false">

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

</cfcomponent>

Mijn voorbeeld van "paden-omzetten" is gewoon een leuke truc en spelen met code die niet echt rechtlijnig is voor goede toepassingen.


4
2018-03-26 21:11



gebruik gewoon het volledige pad vanaf de root

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

waarbij item.cfc zich bevindt in [website root] / lib / cart / - dit werkt overal in uw code.


3
2018-03-26 20:04



Ik had dezelfde kwestie en dit was mijn oplossing. Het is vrij eenvoudig, maar het kostte me een paar uur om het te slaan. Hopelijk bespaart dit iemand wat tijd.

Ik ben begonnen met

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

en kreeg altijd de foutmelding dat het niet beschikbaar was, dus ik heb het volledige pad geschreven

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

en het probleem is opgelost.

Ik hoop dat dit helpt.


0
2017-07-05 22:29