2012-02-09 14 views
6

Ad esempio, se ho un tag personalizzato come <cf_AppSwitch action="Check">, la mia ipotesi sarebbe qualcosa come AppSwitch(action="Check"), ma non sono sicuro che CF possa risolverlo come tag personalizzato.Posso chiamare un tag personalizzato in cfscript?

L'altra soluzione che posso pensare sarebbe scrivere una funzione wrapper e chiamare il mio tag personalizzato, ma che sembra ridondante.

Sembra che sto semplificando eccessivamente un problema molto più complesso, quindi qualsiasi intuizione sarebbe apprezzata (anche sul perché questo non è/non dovrebbe essere supportato).

risposta

6

Supponendo che si stia utilizzando Adobe CF, sfortunatamente la risposta è no. Devi scrivere una funzione wrapper basata su CFML. Per esempio:

<cffunction name="myCustomTag"> 
    <cfset var returnVal = ""> 
    <cfsavecontent variable="returnVal"><cf_myCustomTag attributeCollection=arguments></cfsavecontent> 
    <cfreturn returnVal> 
</cffunction> 

<cfscript> 
myCustomTag(a="b"); 
</cfscript> 

Ora, se si utilizza Railo, è possibile utilizzare il cfscript equivalent to the <cfmodule> tag:

<cfscript> 
    module name="myCustomTag"; 
</cfscript> 
+0

Grazie Jake, proprio quello che stavo cercando. – ryankeairns

+3

Alcuni sostengono che i tag siano validi per le azioni basate sull'interfaccia utente e che i componenti siano più adatti al modello/ai servizi. Pertanto è raro che si abbia la necessità di fare una cosa del genere. –

+0

Punto valido @Todd Sharp, sto riscrivendo un'app con FW/1 e sto avendo a che fare con un gruppo di tag personalizzati preesistenti che sono utilizzati da diverse altre app ... hai ragione, se hai dato il giusto tempo vorrei riscriverli come componenti. – ryankeairns

11

Aggiornamento 2:

Ecco un asino ancora più cattivo (o è cattiva asser?) modo. Attenzione: caratteristiche non documentate qui sotto (ma ancora fresco):

Assumere il tag personalizzato restituisce un valore in questo modo:

<cfif thisTag.executionMode eq "start"> 
    <cfparam name="attributes.name" default="Dude" /> 
    <cfparam name="attributes.result" type="variablename" default="result" /> 
    <cfset caller[attributes.result] = "Hello, " & attributes.name & "!!" /> 
</cfif> 

Così l'attributo risultato del tag si aspetta un nome di variabile che verrà impostato nel chiamante . Ora usando il metodo qui sotto possiamo accedere a quel risultato tramite cfscript.

<cfscript> 

test = createObject("java", "coldfusion.tagext.lang.ModuleTag"); 
test.setPageContext(getPageContext()); 
test.setTemplatePath(expandPath('echo.cfm')); 
test.setAttributeCollection({name="Todd Sharp", result="testResult"}); 
test.doStartTag(); 
test.doEndTag(); 
test.releaseTag(); 

writeDump(testResult); 

</cfscript> 

Aggiornamento:

La soluzione qui di seguito può causare un effetto collaterale indesiderato. Se il tuo tag personalizzato restituisce un valore, non avrai accesso ad esso poiché il tag viene chiamato dal componente, la variabile return viene inserita nello scope delle variabili del componente, non nel modello chiamante. Ovviamente, se restituisci un valore dovresti comunque usare un CFC (come ho commentato sopra), quindi usalo a tuo rischio.

Che ne dite di questo approccio (modificato da Jake):

CustomTagProxy.cfc:

<cfcomponent> 

    <cffunction name="onMissingMethod" output="false"> 
     <cfargument name="missingMethodName" type="string"/> 
     <cfargument name="missingMethodArguments" type="struct"/> 

      <cfset var returnVal = ""> 
      <cfsavecontent variable="returnVal"><cfmodule template="#arguments.missingMethodName#.cfm" attributecollection="#arguments.missingMethodArguments#" /></cfsavecontent> 
      <cfreturn returnVal> 
    </cffunction> 

</cfcomponent> 

echo.cfm:

<cfif thisTag.executionMode eq "start"> 
    <cfparam name="attributes.name" default="Dude" /> 
    <cfoutput>Hello, #attributes.name#!!</cfoutput> 
</cfif> 

time.cfm:

<cfif thisTag.executionMode eq "start"> 
    <cfoutput>It is now #now()#.</cfoutput> 
</cfif> 

index.cfm:

<cfscript> 
proxy = new CustomTagProxy(); 
echoTest = proxy.echo(name="Todd"); 
timeTest = proxy.time(); 

writeOutput(echoTest); 
writeOutput("<br />"); 
writeOutput(timeTest); 
</cfscript> 
+1

+1. Ottima idea. – Leigh

+0

coldfusion.tagext.lang.ModuleTag ftw –

+0

qui ci sono un sacco di altri tag che puoi fare in cfscript usando questo metodo –

Problemi correlati