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>
Grazie Jake, proprio quello che stavo cercando. – ryankeairns
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. –
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