我需要将FORM变量输出到报表中,但仅在存在值时才输出

时间:2013-06-21 15:52:00

标签: coldfusion

我有一个包含许多值的表单(大约25个字段)。表单发布并插入数据库后,我必须获取表单信息并将其输出到报表。报告应仅显示包含值的字段(因此,如果仅填写了5个字段,则报告中只有5个字段)。

最简单的方法是做这样的事情:

<cfif form.firstname neq "">
    <li><First Name: #FORM.FIRSTNAME#</li>
</cfif>
<cfif form.lastname neq "">
    <li><Last Name: #FORM.LASTNAME#</li>
</cfif>

有人可以推荐更好的方法吗?我想将它保留在ColdFusion方面,因为整个报告都被剥离了HTML以生成纯文本报告。

4 个答案:

答案 0 :(得分:1)

你可以像这样循环遍历

<cfloop list="#form.fieldNames#" index="i">
    <li><cfoutput>#i# = #form[i]#</cfoutput></li>
</cfloop>

不确定这是你想要的,但它可能会让你走上正确的轨道

根据您的评论试试这个:

<cfloop list="#form.fieldNames#" index="i">
    <li><cfoutput>
        <cfswitch expression="#i#">
            <cfcase value="firstName">
                First Name 
            </cfcase>
            <cfcase value="lastName">
                Last Name 
            </cfcase>
            <cfdefaultcase>
                #i#
            </cfdefaultcase>
        </cfswitch>
      : #form[i]#</cfoutput></li>
</cfloop>

答案 1 :(得分:1)

这是我对此的尝试:感谢Lance指出我朝着正确的方向前进:

<ul>
    <cfoutput>
    <cfloop list="#form.fieldNames#" index="i">
    <li>
        <cfif len(trim(form[i])) neq 0>
        <cfswitch expression="#i#">
            <cfcase value="FIRST_NAME">First Name</cfcase>
            <cfcase value="LAST_NAME">Last Name</cfcase>
            <cfdefaultcase>#i#</cfdefaultcase>
        </cfswitch>
        : #FORM[i]#
        </cfif>
    </li>   
    </cfloop>
    </cfoutput>
</ul>

答案 2 :(得分:1)

这是使用switch / case的替代方法 - 将标签放在struct

<cfset FieldLabels = 
    { 'first_name'  : "First Name"
    , 'last_name'   : "Last Name"
    , 'other stuff' : "Whatever you like"
    }/>

<cfoutput>
    <ul>
        <cfloop index="CurField" list=#Form.FieldNames# >
            <cfif len(trim( Form[CurField] )) >
                <li>
                    #StructKeyExists( FieldLabels , lcase(CurField) )
                        ? FieldLabels[ lcase(CurField) ]
                        : HtmlEditFormat( replace(CurField,'_',' ','all') )
                    #
                    : #HtmlEditFormat( Form[CurField] )#
                </li>
            </cfif>
        </cfloop>
    </ul>
</cfoutput>

请注意,它不会对len执行neq 0 - 这完全没必要。

第一个哈希中的a ? b : c构造是三元条件运算符 - 在CF10和Railo 3.3以后支持if / else的紧凑方式。

如果名称没有明确的标签,它会用空格替换下划线,如果报告是针对非技术人员的话,这可能更好。

如果您可以在不修改FieldNames列表的情况下使用在表单范围中添加(或删除)项目的代码,则可以更改此循环...

<cfloop item="CurField" collection=#Form# >
    <cfif CurField EQ 'FieldNames'>
        <cfcontinue />
    </cfif>
    ...

其中查看了Form范围中的实际键 - 尽管此方法无法保证它们的顺序。

答案 3 :(得分:0)

你如何直接循环结构本身?

<cfscript>    
for(eachKey in FORM){
    if(FORM[eachKey] neq ''){
        writeOutput('<li>' & 
                    FORM[eachKey] & ' = ' &
                    trim( FORM[eachKey] ) &
                   '</li>');
    }
}
</cfscript>

您可以在表单变量名称中添加空格。