2016-11-08 5 views
1

データのフィルタリングは、 コントローラ リポジトリで行われることが推奨されています。しかし、これはかなり頻繁に私に何が起こる:TYPO3流体:ろ過回数をカウントする

あなたはデータのリストを持っていると(例では、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から受信します。

これらのアドホックフィルタリングされたイベントをカウントするにはどうすればよいですか? 123イベントを2015に出力します。

<f:count>{events}</f:count>は条件を尊重しません。最低でもヒット数を出力できるように、いくつかのカウンタを稼働させることは可能ですか?または、まったく(カスタムビューヘルパーを除く)

+1

私は、ビューではなく、リポジトリのcriteraをフィルタリングする努力をすることを検討するべきだと思います。 scnr。 – j4k3

答えて

2

私が知る限り、カスタムビューヘルパーはカウントのための唯一のオプションです。 しかし、vhs:variable.get/set https://fluidtypo3.org/viewhelpers/vhs/ vhsを使用するチャンスがあります。

<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を追加できれば、リスト要素の数をカウントできます。あなたのイベントモデルにゲッター "getYearメソッド" を追加することができます

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

いいね!私はそれを試してみます! – Urs

+2

最大7.6まで流体中で直接計算することはできません。数学をするには追加のVHが必要です。しかし、最もクリーンなソリューション(誰もがそれを期待し、ランタイムとメモリ消費量は最小限に抑える)は、リポジトリのフィルタリングとカウントを行うことです。 –

+0

これを完了するだけです(リポジトリは正しい方法です): ' :math.sum'? VHDLをインライン表記でネストすることはできますか? – Urs

2

:jqueryのを使用して

Javascriptが次のようになります。あなたのイベントは今年でgroupped取得する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に自身のフィルタを作ります。

+0

好奇心を失っています:モデルでは、ゲッターを既存の「日付」フィールドに差し込み、その年を取り除くことを意味します。「年」列をデータベースに追加しない場合 – Urs

+1

右、年ゲッターは、日付フィールドから余分な列を除いて10進数で年を取得するだけです。 –

+0

ありがとう!興味深い可能性があります。 – Urs

関連する問題