SilverStripe模板:显示DataObject :: Count而不重复

时间:2012-02-08 16:55:46

标签: silverstripe

我有一个页面,这个页面有很多,一个或没有评论。 在某一点上,我只想显示注释的数量,而不是遍历所有注释。但是由于翻译,需要区分注释计数的两个复数版本,因此只需调用$Comment.Count即可。由于翻译器组件似乎没有任何多元化支持,我需要在模板级别上进行。

到目前为止,我得到的只是:

<% if Comments %>
<% control Comments %>
<span class="comments">
 <% if Count == 1 %> ein Kommentar<% else %>$Count Kommentare<% end_if %></span>
<% end_control %>
<% end_if %>

这可行,但重复计数时间。这有解决方法吗?我知道在我的Page类中创建函数的可能性,如

function CommentCount(){
  return $this->Comments->Count();
}

但这感觉有点单调乏味。

2 个答案:

答案 0 :(得分:3)

我做了一个狡猾的装饰师,因为这种事让我烦恼。

对于这么小的东西来说,它可能有点重量级,但你可以轻松扩展它以提供你需要的东西。

基本上它为DataObjectSet添加了一个方法,你可以这样做:

$Comments.Count $Comments.Plural(SingularWord, PluralWord)

目前,如果您不提供PluralWord,它将尝试使用典型的英语拼写更改来猜测复数。

代码在这里:   https://github.com/lingo/silverstripe-bits-and-bobs/blob/master/code/Pluraliser.php

帮助和自述文件在这里:   https://github.com/lingo/silverstripe-bits-and-bobs/

答案 1 :(得分:2)

从我的头脑 - 它应该工作,但我不确定这些陈述是否有问题:

<% if Comments.TotalItems == 1 %>Singular<% else %>Plural (inklusive 0)<% end_if %>

或者你可以构建这样的东西(也是未经测试的,如果它不起作用,评论,我会尝试修复它):

<% if Comments %>
    <% control Comments %>
        <% if TotalItems == 1 %>
            Singular
        <% else %>
            Plural
        <% end_if %>
    <% end_control %>
<% else %>
    0
<% end_if %>

然而,这非常丑陋和臃肿(除了必须重复0的复数)。我更喜欢像SingleComment()这样的方法,对于1个条目返回true,对于0或更多,返回false,因为它是恕我直言的清晰。