【问题标题】:SilverStripe Templates: Displaying DataObject::Count without repeatingSilverStripe 模板:显示 DataObject::Count 而不重复
【发布时间】:2012-02-08 16:55:45
【问题描述】:

我有一个页面,这个页面有很多、一个或没有 cmets。 在某一时刻,我只想显示 cmets 的数量,而不是遍历所有这些。然而,由于翻译需要区分评论计数的两个复数版本,所以一个简单的$Comment.Count 调用已经结束。由于翻译器组件似乎没有任何复数支持,我需要在模板级别进行。

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

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

这可行,但会重复 Count-Times。有解决方法吗?我知道可以在我的 Page 类中创建一个函数,例如

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

但这感觉有点乏味。

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    我做了一个小装饰器,因为这种事情让我很烦。

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

    基本上它向 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/

    【讨论】:

      【解决方案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,因为它更清晰。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-02
        • 1970-01-01
        • 2013-04-17
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多