【问题标题】:In CF, can I call a custom tag using a variable for its name?在 CF 中,我可以使用变量作为名称来调用自定义标签吗?
【发布时间】:2019-10-18 11:36:17
【问题描述】:

我想使用名称中的变量来调用自定义标签。像这样

<cfset slist = 'product_categories'>
<cf_cu_show_#slist#>

这让我在 # 上出现错误。当我以传统方式调用它时,自定义标签 cu_show_product_categories 存在并且正在工作。 这个想法是建立一个列表来循环,调用几个自定义标签。

<cfset slist = 'product_categories'>
<cfif a = 'blogs'>
    <cfset slist = listAppend(slist,"blogs")>
</cfif>
<cfif b = 'posts'> 
    <cfset s_list = listAppend(slist,"last_posts")>
</cfif>
<cfloop list="#slist#" index="i">
    <cf_cu_show_#i#>
</cfloop>

我试图用谷歌搜索,但找不到任何有用的东西。任何帮助,将不胜感激。

【问题讨论】:

  • 为了使用变量名调用自定义标签,您必须改用&lt;cfmodule&gt; 语法来调用它。虽然&lt;cf_cu_show_#slist#&gt; 无效(如您所见),但您可以使用&lt;cfmodule template="cu_show_#slist#.cfm"&gt; 来调用它以实现您的目标。
  • 您的整体方法似乎相当费力。与其拥有多个自定义标签,不如拥有一个可以接受各种输入参数的标签,这似乎是一种用更少代码完成工作的方法。
  • @Dan Bracuk,感谢您的建议。我给出的示例是一段非常简化的代码。现实情况是 9 个环境使用自定义标签,每个环境都有不同的条件,也有不同的显示顺序。出于可读性目的,我选择了这种方法,因此我们在不同的自定义标签中拥有这些部分,并且不需要使用大量变量来调用它。此外,我发现很难构建 1 个自定义标签,我需要在其中确定以特定顺序排列的部分。

标签: coldfusion cfml


【解决方案1】:

正如您已经发现的那样,在调用自定义标签时使用变量名是无效的。解决这个问题的方法是使用 &lt;cfmodule&gt; 语法来调用自定义标签。在您的第一个场景中,您可以这样称呼它。

<cfset slist = 'product_categories'>
<cfmodule template="cu_show_#slist#.cfm">

在下面的示例中,您可以这样修改您的代码。

<cfset slist = 'product_categories'>
<cfif a = 'blogs'>
    <cfset slist = listAppend(slist,"blogs")>
</cfif>
<cfif b = 'posts'> 
    <cfset s_list = listAppend(slist,"last_posts")>
</cfif>
<cfloop list="#slist#" index="i">
    <cfmodule template="cu_show_#i#.cfm">
</cfloop>

这是有关如何使用&lt;cfmodule&gt; 的文档链接。 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-m-o/cfmodule.html

我还找到了另一个不错的链接,他们在其中演示了您需要动态提供标签名称的场景,如https://flylib.com/books/en/2.375.1.420/1/ 中所示

【讨论】:

  • 重要的是要注意,我认为应该编辑这个答案以反映这一点,自定义标签通常被调用两次,一次在开始时(thisTag.executionMode ==“start”),并且最后一次(thisTag.executionMode == “end”)。使用 cfmodule 调用自定义标签时,只会在开始时调用一次。
  • 语法和 语法中,只有在标签关闭时才会再次调用自定义标签。这可以通过在标签的“>”之前添加“/”或使用结​​束标签来完成。 cfmodule 的使用不会改变其工作方式的基本性质。
  • 当包含/执行的文件名中有动态部分时,Pentesters 喜欢抱怨。注意不要将 URL 或 FORM 变量作为文件名传递。
  • @SteveBryant,我很抱歉,假设呼叫是在标记模式下进行的,您是正确的。但是,在 cfscript 中调用 cfmodule 时行为不同,因为无法“结束”标记。
  • @Veni templatename 属性在您的方案中工作相同的原因是因为您没有指定自定义标记的文件路径。但是,如果您确实需要指定文件路径,则用法会有所不同。如需更完整的说明,请参阅此处cfdocs.org/cfmodule
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2021-07-22
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多