Обновление 2:
Вот еще более плохая задница (или это плохо утверждать?).Предупреждение: недокументированные функции ниже (но все еще круто):
Предположим, что пользовательский тег возвращает значение примерно так:
<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>
Таким образом, атрибут результата тега ожидает имя переменной, которое будетустановить в звонящего.Теперь, используя метод ниже, мы можем получить доступ к этому результату через 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>
Обновление:
Приведенное ниже решение может вызвать нежелательный побочный эффект.Если ваш пользовательский тег возвращает значение, у вас не будет доступа к нему, так как тег вызывается из компонента, возвращаемая переменная помещается в область видимости переменных компонента, а не в вызывающий шаблон.Конечно, если вы возвращаете значение, вы, вероятно, должны в любом случае использовать CFC (как я прокомментировал выше), поэтому используйте на свой страх и риск.
Как насчет этого подхода (модифицированного по сравнению с Джейком):
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>