групповые новости по годам во внешнем интерфейсе (TYPO3, система новостей) - PullRequest
0 голосов
/ 21 мая 2019

Я использую TYPO3 9, плагин новостей (система новостей).

Я ищу способ группировки новостных статей по годам, например:

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

Я не могу найти простое решение для этого и мне трудно поверить, что единственный способ реализовать это - отредактировать исходный код TYPO3 ...

Может кто-нибудь помочь?

-------------------------- Редактировать

Фиксированный и рабочий код, предложенный Берндом Вилке:

<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>

Однако я задаю этот вопрос Георгу Рингеру, поскольку его решение работало сразу.

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Конечно, это возможно с помощью ViewHelper f:groupedFor, см. официальную документацию .

Также есть пример в документах расширения новостей . Таким образом, пример должен работать так

<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 голос
/ 22 мая 2019

Нет такой опечатки для группировки, как эта.

Но вы можете сделать это во 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>

Вы можете использовать один из помощников вида, упомянутых в этот ответ или этот ответ .

...