2012-02-09 11 views
6

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.¿Puedo llamar una etiqueta personalizada en cfscript?

La otra solución que puedo pensar sería escribir una función de envoltura y llamar a mi etiqueta personalizada, pero eso parece redundante.

Parece que estoy simplificando demasiado un problema mucho más complejo, por lo que se apreciará cualquier idea (incluso sobre por qué esto no es/no debería ser compatible).

Respuesta

6

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 utilizar la cfscript equivalent to the <cfmodule> tag: Actualización

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

Gracias Jake, justo lo que estaba buscando. – ryankeairns

+3

Algunos argumentarían que las etiquetas son buenas para las acciones basadas en la interfaz de usuario y los componentes se adaptan mejor a los modelos/servicios. Por lo tanto, es raro que uno tenga la necesidad de hacer tal cosa. –

+0

Punto válido @Todd Sharp, estoy volviendo a escribir una aplicación con FW/1 y estoy teniendo que lidiar con un montón de etiquetas personalizadas preexistentes que son utilizadas por muchas otras aplicaciones ... tiene usted razón, si se le da el adecuado Es hora de volver a escribirlos como componentes. – ryankeairns

11

2:

es un culo aún más malo aquí (o es mala asser?) camino. Advertencia: características no documentadas por debajo (pero todavía fresco):

asumir la etiqueta personalizada devuelve un valor de este 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> 

lo que el atributo resultado de la etiqueta espera un nombre de variable que se ajusta a 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> 

Actualización:

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), así que use bajo su propio riesgo.

¿Qué hay de este enfoque (modificado a partir 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> 
+1

+1. Slick idea. – Leigh

+0

coldfusion.tagext.lang.ModuleTag ftw –

+0

aquí hay un montón de otras etiquetas que puedes hacer en cfscript usando este método –

Cuestiones relacionadas