【问题标题】:TYPO3 fluid: count filtered iterationsTYPO3 流体:计算过滤迭代次数
【发布时间】:2016-11-08 13:50:56
【问题描述】:

我知道这不是推荐的做法,数据过滤应该在 controller 存储库中完成。但这经常发生在我身上:

您有一个数据列表并希望根据某些条件显示它(在示例中,plugin.myext.settings.year = 2015):

<f:for each="{events}" as="event">
  <f:if condition="{f:format.date(date: event.date, format: 'Y')}=={settings.year}">
  {event.name}
  </f:if>
</f:for>

这是获取 2015 年所有事件的一种简单而简单的方法。

但是如何计算那些临时过滤的事件? 输出类似:2015 年的 123 个事件

&lt;f:count&gt;{events}&lt;/f:count&gt; 不会遵守条件。是否可以保持一些计数器运行,至少能够输出底部的命中数?或者根本没有办法(自定义视图助手除外)?

【问题讨论】:

  • 我认为您应该考虑在您的存储库中而不是在视图中过滤标准。 scnr.

标签: typo3 fluid extbase


【解决方案1】:

据我所知,自定义 viewhelper 将是您计数的唯一选择。 不过,您可能有机会使用 vhs,https://fluidtypo3.org/viewhelpers/vhs/ vhs:variable.get / set。

<vhs:variable.set('eventCount', 0) />    
<f:for each="{events}" as="event">
      <f:if condition="{f:format.date(date: event.date, format: 'Y')}=={settings.year}">
         <vhs:variable.set('eventCount' ,{variable.get('eventCount')}+1) />
      {event.name}
      </f:if>
    </f:for>
<span>count: <vhs:variable.get('eventCount) />

这可能有效,但我怀疑流体是否允许添加。

但是,如果您可以添加 javascript,您可以计算列表元素。

使用 jquery 的 Javascript 看起来像:

var eventCount = jQuery('listId .event').length;
var countHtml = jQuery('<div />', {id: 'eventCount', html: "event count:" + eventCount});
jQuery('.tx_extkey').append(countHtml);

【讨论】:

  • 听起来不错!我试试看!
  • 高达 7.6 您无法直接在流体中计算。您需要一个额外的 VH 来计算。但是最干净的解决方案(每个人都希望它在那里并且运行时和内存消耗最少)是在您的存储库中进行过滤和计数。
  • 只是为了完成这个(虽然存储库是正确的方式):我将如何使用v:math.sum 编写&lt;vhs:variable.set('eventCount' ,{variable.get('eventCount')}+1) /&gt;&lt;vhs:variable.set('eventCount' ,{v:math.sum({variable.get('eventCount')},1)} /&gt; 之类的东西——你能用这种方式将 VH 嵌套在内联符号中吗?
  • 嵌套 VH 有多种可能性。这是一种可能性。如果将 VH 嵌套在字符串中,请小心,因为如果它们是字符串,您可能需要转义包含的参数。 (这可能是一个很好的问题,本身就有很多答案)
【解决方案2】:

您可以在您的事件模型中添加一个 getter“getYear”。您可以使用GroupedForViewHelper 将您的活动按年份分组:

<f:groupedFor each="{events}" as="eventsByYear" groupBy="year" groupKey="year">
  <f:if condition="{year} == {settings.year}">
    <f:then>
       <h3>{eventsByYear -> f:count()} events in {year}</h3>
       <ul>
         <f:for each="{eventsByYear}" as="event">
           <li>{event.name}</li>
         </f:for>
       </ul>
    </f:then>
  </f:if>
</f:groupedFor>

但正如您自己所注意到的:要过滤事件,请根据您的需要在 EventRepository 中创建一个自己的过滤器。

【讨论】:

  • 出于好奇:在模型中,getter 是否会插入现有的“日期”字段并从中提取年份,这就是您的意思,对吗?不向数据库添加“年份”列
  • 对,年份获取器只是从日期字段中获取十进制的年份,没有额外的列。
  • 谢谢!这是一个有趣的可能性。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2013-01-07
  • 2013-10-11
相关资源
最近更新 更多