Можно ли вызвать пользовательский тег в cfscript? - PullRequest
7 голосов
/ 09 февраля 2012

Например, если у меня есть пользовательский тег типа <cf_AppSwitch action="Check">, мое предположение будет примерно таким же, как AppSwitch(action="Check"), но я не уверен, что CF может разрешить это как пользовательский тег.

Другое решение, которое я могу придумать, - написать функцию-обертку и вызвать мой пользовательский тег, но это кажется излишним.

Кажется, я упрощаю гораздо более сложную проблему, поэтому Любое понимание будет оценено (даже если это не поддерживается или не должно поддерживаться).

Ответы [ 2 ]

11 голосов
/ 10 февраля 2012

Обновление 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>
6 голосов
/ 09 февраля 2012

Если вы используете Adobe CF, к сожалению, ответ - нет.Вы должны написать функцию-оболочку, основанную на CFML.Например:

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

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

Теперь, если вы используете Railo, вы можете использовать cfscript, эквивалентный тегу <cfmodule> :

<cfscript>
    module name="myCustomTag";
</cfscript>
...