que - coldfusion tutorial español
¿Puedo llamar una etiqueta personalizada en cfscript? (2)
Suponiendo que está utilizando Adobe CF, desafortunadamente la respuesta es no. Debe escribir una función de envoltura basada en CFML. Por ejemplo:
<cffunction name="myCustomTag">
<cfset var returnVal = "">
<cfsavecontent variable="returnVal"><cf_myCustomTag attributeCollection=arguments></cfsavecontent>
<cfreturn returnVal>
</cffunction>
<cfscript>
myCustomTag(a="b");
</cfscript>
Ahora, si está utilizando Railo, podría usar el cfscript equivalente a la etiqueta <cfmodule>
:
<cfscript>
module name="myCustomTag";
</cfscript>
Por ejemplo, si tengo una etiqueta personalizada como <cf_AppSwitch action="Check">
mi suposición sería algo así como AppSwitch(action="Check")
, pero no estoy seguro de que CF pueda resolver eso como una etiqueta personalizada.
La otra solución que puedo pensar sería escribir una función de contenedor y llamar a mi etiqueta personalizada, pero eso parece redundante.
Parece que estoy simplificando demasiado un problema mucho más complejo, por lo que cualquier idea sería apreciada (incluso por qué esto no es / no debería ser compatible).
Actualización 2:
Aquí hay una manera de culo aún más malo (¿o es malo aser?). Advertencia: características indocumentadas a continuación (pero aún son interesantes):
Supongamos que la etiqueta personalizada devuelve un valor como ese:
<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>
Entonces, el atributo de resultado de la etiqueta espera un nombre de variable que se establecerá en la persona que llama. Ahora, usando el método a continuación, podemos acceder a ese resultado a través de 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>
Actualizar:
La solución a continuación puede causar un efecto secundario no deseado. Si su etiqueta personalizada devuelve un valor, no tendrá acceso a él, ya que la etiqueta se llama desde el componente y la variable de retorno se coloca en el ámbito de variables del componente, no en la plantilla de llamada. Por supuesto, si está devolviendo un valor, probablemente debería estar usando un CFC de todos modos (como comenté anteriormente), por lo tanto, use bajo su propio riesgo.
¿Qué tal este enfoque (modificado de 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>