Coldfusion:动态cfif

时间:2017-02-07 08:44:49

标签: coldfusion cfml

我有一个包含五列的数据库表(星期一到星期五)。列值为1(工作日)或0(不是工作日)。我正在尝试创建cfif语句,该语句仅在cfloop的实际日期为工作日时执行。我想我需要一个动态的if语句,还是有另一种方法来解决我的问题?

我知道以下代码不起作用,但(我希望)它显示了我想要的东西。谢谢你的帮助

    <cfset ifstatement = "">
    <cfif realholidays.Montag is 0>
        <cfset ifstatement = " AND #DayOfWeek(holidaydatum)# is not 2">
    </cfif>
    <cfif realholidays.Dienstag is 0>
        <cfset ifstatement = " AND #DayOfWeek(holidaydatum)# is not 3">
    </cfif>
    <cfif realholidays.Mittwoch is 0>
        <cfset ifstatement = " AND #DayOfWeek(holidaydatum)# is not 4">
    </cfif>
    <cfif realholidays.Donnerstag is 0>
        <cfset ifstatement = " AND #DayOfWeek(holidaydatum)# is not 5">
    </cfif>
    <cfif realholidays.Freitag is 0>
        <cfset ifstatement = " AND #DayOfWeek(holidaydatum)# is not 6">
    </cfif>

    <cfif #DayOfWeek(holidaydatum)# is not 1#ifstatement#>...</cfif>

    The result should be:

    <cfif #DayOfWeek(holidaydatum)# is not 1 AND #DayOfWeek(holidaydatum)# is not 3  AND #DayOfWeek(holidaydatum)# is not 5></cfif>

2 个答案:

答案 0 :(得分:1)

动态if语句很少听起来会解决任何无法以“更清晰”和更易读的方式实现的问题。

您可能希望研究使用函数(cffunction)。由于你的例子难以理解,我只能提供一些伪代码来帮助你。

<cffunction name="isHoliday">
    <cfargument name="realholidaysValue" type="string" required="false" default="" />
    <cfargument name="holidaydatum" type="string" required="false" default="" />
</cffunction>

<cfif isHoliday(realholidays, 1)></cfif>

您可能需要考虑的其他事项,因为您的示例有多个条件,即使用cfstructcfswitch进行查找:

<cfswitch expression="#DayOfWeek(holidaydatum)#"> 
    <cfcase value="1">
        ... do something, return etc
    </cfcase>
</cfswitch>

<cfset lookup.Donnerstag="5" />
<cfset lookup.Mittwoch="4" />

尝试将问题分解为更小,更清晰的例程,然后重新构建它们以解决您的整体问题 - 当您在6个月内回到它时,您会感谢自己。

答案 1 :(得分:0)

与动态生成代码相关的一般方法在理论上听起来不错,但在实践中存在问题。考虑这个动态创建的CF代码的简单示例。

<cfif condition1>
<cfset dynamicCode = "
   <cfif condition2>
   code for condition2 being true
   <cfelse>
   code for condition2 being false
   </cfif>">

<cfelse>
<cfset dynamicCode = "some different programing code than above">
</cfif>

<cfoutput>
#dynamicCode#
</cfoutput>

有人可能认为这会导致dynamicCode被执行,但事实并非如此。事实上,它甚至不会卷曲。它只是一个将显示的字符串变量。

如果你想要它执行,你必须:

  1. 创建如上所示的代码
  2. 将该代码写入.cfm文件。您可以使用cffile
  3. 包含cfinclude标记的文件。
  4. 这当然是一般的。根据您的问题,我认为您不需要像所有人那样创建动态代码。