2012-03-23 41 views
10

我们正在编写一些代码来控制从Tridion Broker数据库查询(使用API​​)返回的结果的分页。Tridion分页 - 获取结果总数

我们使用的是SDL Tridion 2011 SP1,并且可以使用PagingFilter获取所选页面上组件的tcmIds。

但是,在写出分页控件时,我们需要知道结果的总数(以确定将有多少页)。有没有一种更有效的机制来完成这个工作,而不仅仅是为'全部'结果运行一个单独的查询并对字符串数组返回一个.Length? (显然你只会运行这个查询一次,并保持该值,因为用户点击页面之间)

如果我们得到所有的结果,那么为什么我会打扰使用PagingFilter,当我们可以只处理返回的信息在'全部'查询中?

很多感谢, 乔纳森

注意:有可能会是一个最大的2000个结果返回的任何一种类型的。

+0

我知道前内容交付返回的对象被缓存,但现在(完全匹配)代理查询被缓存(自Tridion 2011?) - _也许_可能是使用特定过滤器的原因?我已经看到了基于JavaScript的分页,但不能确定比两种查询方法更好的想法。 – 2012-03-23 13:25:48

+1

伟大的问题乔恩,看起来不像你可以做一个“COUNT(....)”风格的查询。 – Neil 2012-03-23 13:55:06

+0

谢谢尼尔。是的,我们认为可能还有更有效的COUNT(...)机制。 如果你知道有多少页面或者不需要知道有多少页面(并且处理有效返回的空数组),那么PagingFilter方法非常有用,但是我认为这很少见。 – 2012-03-23 14:21:01

回答

6

我有3个可能的答案给你,虽然没有一个可能是正确的或你想要的。

  1. 没有办法使用CD API来读取返回项目的COUNT。你可以写一些延伸。无论是CD存储扩展,还是直接的数据库查询等。

  2. 您读取了您的收藏中的物品的确切数量。如果您对组件使用查询,这样做尤其棘手,因为有意为这些组件检索DCP。可能是因为给定组件没有DCP,因此您需要先阅读所有DCP才能知道要分页的项目的确切数量。显然这将打败分页的整个目的。您可以通过运行一次查询来缓解这种性能下降,然后缓存一段时间,但根据您查询的内容,可能每个网站访问者都会查询不同的条款,因此性能受到很大影响。

  3. 你并不关心分页中的项目总数。因此,例如,不要显示“第1页,共23页”,“第2页,共23页”等,您只需在页面旁边显示页面1和页面2的下一页和上一页按钮。

希望这有助于!

+0

谢谢Mihai。我没有考虑过没有DCP对组件的影响(正如你在第二个建议中强调的那样)。我喜欢CD存储扩展的想法(因为我们可能必须允许网站用户在以后过滤)。但是,现在我认为我们可能会实施建议2并使用缓存。非常感谢! – 2012-03-23 17:23:31

8

在发布组件的过程中,您可以实现TBB来计算所有已发布的组件,然后将结果作为使用标准system.io函数读取的二进制文件发布到文本或XML文件中。您也可以专门发布一个单独的DCP来保存计数(然后您需要每个发布的模式和组件)。

这个想法是确定计数在呈现时间,并以某种方式发布该数字。在演示端拉出单个数字肯定会比拉动2000个DCP更快。

+0

谢谢Nickoli。我认为这是一个很好的答案,并同意在发布时间这样做会更有效率。我认为,为了得到Tridion客户端之间的一致性,想出一个'最佳实践'eXtension实现是很好的....只需要现在就找时间! – 2012-08-29 13:47:37