在前端按年度分组新闻(TYPO3,新闻系统)

时间:2019-05-21 20:59:59

标签: typo3 tx-news typo3-9.x

我正在使用TYPO3 9,新闻插件(新闻系统)。

我正在寻找一种按年份对新闻文章进行分组的方法,例如:

2019
--------
article 1
article 2
article 3
--------
2018
--------
article 1
article 2
...

我找不到一个简单的解决方案,很难相信实现此目的的唯一方法是编辑TYPO3的源代码...

有人可以帮忙吗?

--------------------------编辑

Bernd Wilke建议的固定工作代码:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
      data-namespace-typo3-fluid="true">
<f:layout name="General" />
<!--
    =====================
        Templates/News/List.html
-->

<f:section name="content">
    <!--TYPO3SEARCH_end-->
    <f:if condition="{news}">
        <f:then>
            <f:variable name="oldYear">2010</f:variable>
            <f:for each="{news}" as="newsItem" iteration="iterator">
                <f:variable name="currentYear"><f:format.date format="%Y">{newsItem.datetime}</f:format.date></f:variable>
                <f:if condition="{oldYear} < {currentYear}">
                    <hr />
                    <h3>{currentYear}</h3>
                    <hr />
                </f:if>
                <f:render partial="List/Item" arguments="{newsItem: newsItem,settings:settings,iterator:iterator}" />
            </f:for>
        </f:then>
        <f:else>
            <div class="alert ">
                <f:translate key="list_nonewsfound" />
            </div>
        </f:else>
    </f:if>
    <!--TYPO3SEARCH_begin-->
</f:section>
</html>

但是,我将这个问题授予格奥尔格·林格(Georg Ringer),因为他的解决方案马上就起作用了。

2 个答案:

答案 0 :(得分:3)

当然可以通过使用ViewHelper f:groupedFor(请参阅official documentation)来实现。

docs of the news extension中也有一个示例。所以这个例子应该像这样

<f:groupedFor each="{news}" as="groupedNews" groupBy="yearOfDatetime" groupKey="year">
        <div style="border:1px solid blue;padding:10px;margin:10px;">
                <h1>{year}</h1>
                <f:for each="{groupedNews}" as="newsItem">
                        <div style="border:1px solid pink;padding:5px;margin:5px;">
                                {newsItem.title}
                        </div>
                </f:for>
        </div>
</f:groupedFor>

但是我也要警告以下内容

  

关注性能!

     

为了能够对记录进行分组,流畅   将加载每个记录本身,然后将其分组。如果你计划   分组许多记录只是为了获得计数,也许   最好直接触发查询,并且不要为此浪费精力。

     

但是,如果结果在可缓存页面上,则该问题仅与第一次匹配有关。

答案 1 :(得分:1)

没有像这样的分组拼写选项。

但是您可以在FLUID中进行操作:
将用于新闻列表的模板文件复制到您的(站点)扩展程序中,然后根据需要进行修改:内置在组处理中。

<f:variable.set name="oldYear">0000</f:variabel.set>
<f:for each="{news}" as="newsItem" iteration="iterator">
    <f:variable.set name="currentYear">{newsItem.datetime->f:format.date("Y")}</f:varaible.set>
    <f:if condition="{oldYear} == {currentYear}">
        <hr />
        <h3>{currentYear}</h3>
        <hr />
        <f:variable.set name="oldYear">{currentYear}</f:variable.set>
    </f:if>
    <f:render partial="List/Item" arguments="{newsItem: newsItem,settings:settings,iterator:iterator}" />
</f:for>

您可以使用this answerthis answer中提到的一种视图帮助器。