【发布时间】:2011-07-25 15:07:06
【问题描述】:
我正在尝试编写一个自定义标记,该标记将以特殊方式迭代 cfquery 对象。我找到了这个页面:http://www.zrinity.com/developers/mx/undocumentation/query.cfm 概述了如何使用底层 java 方法来导航结果集,但它似乎在 CF9 中不起作用。
我可以调用.next()、.previous()、.first()和.last()就好了,每个方法都会更新query.currentRow,但引用query.columnName总是返回第一行的值,而不是currentRow。
例子:
<cfquery name="testQuery" datasource="source">
SELECT FooName FROM NumberedFoos
</cfquery>
<cfloop from="1" to="3" index="i">
<cfoutput>#testQuery.currentRow# => #testQuery.fooName#</cfoutput><br />
<cfset testQuery.next()>
</cfloop>
生产:
1 => Foo 1
2 => Foo 1
3 => Foo 1
我知道我可以使用testQuery.fooName[testQuery.currentRow] 之类的东西,但这对于我为其制作自定义标签的人来说是非常不受欢迎的。上述链接中描述的功能是否已从 CF9 中删除?如果有,有没有替代品?
编辑
为了扩展原因,客户需要一个自定义标签,允许他们“断言”关于查询的某些事情。客户对 CF 的理解水平很低,但编写 SQL 相当扎实。他们想要的最终结果类似于:
<cfquery name="purchaseTotals">
SELECT PurchaseId, Total FROM Purchases
</cfquery>
<CF_ASSERT query="purchaseTotals">
purchaseTotals.Total gte 0
</CF_ASSERT>
所需的输出将是一个 html 表,其中每一行都是断言失败的查询中的行。所以对我来说,CF_ASSERT 标签需要能够更新当前行。
编辑 2:
主要挑战是在标签正文中允许使用 html,同时仍然从适当的行替换查询值:
<CF_ASSERT query="purchaseTotals">
<CF_CONDITION expression="purchaseTotals.Total gte 0">
<!---error message when expression is false--->
<cfoutput>
Purchase #purchaseTotals.purchaseId# has a negative total!
</cfoutput>
</CF_CONDITION>
<CF_CONDITION expression="purchaseTotals.Total eq ''">
#PurchaseTotals.purchaseId# has a null total, this may be caused by:
<ul>
<li>Edge Case 1</li>
<li>Edge Case 2</li>
</ul>
</CF_CONDITION>
<CF_ASSERT>
这里的输出是这样的:
购买 120 的总数为负数! 购买 157 的总数为负数! 购买 157 的总计为空,这可能是由于:- 边缘案例 1
- 边缘案例 2
【问题讨论】:
-
Re: “这对于我为其制作自定义标签的人来说是非常不受欢迎的” 为什么?这是完全有效的语法。我认为使用 undocumented 功能会更不可取。
-
同意它是有效的语法,但目标用户并不真正理解索引。他们希望它尽可能接近
,这允许对当前行的列进行非索引引用。 -
如果这将在自定义标签中,您的客户甚至会关心自定义标签中的内容吗?如果你的 cfloop 在标签中,你不能让它引用你的循环变量来获取当前值吗?还是我错过了什么?
-
@Limey:对行的引用在标签的正文中,而不是在标签的实现中。请参阅我的编辑澄清。我很舒服(而且我确实)使用标签实现中的索引。
-
@adharris - 也许还有更多,但为什么“purchaseTotals.Total gte 0”不仅仅是标签的属性(或处理方式)?或者他们是否也在定义所需的输出......?