Skip to content
Snippets Groups Projects
Commit 40c85d08 authored by Michael Kessler's avatar Michael Kessler
Browse files

Merge branch 'feature_filterWithMultipleCriteria' into 'master'

[TASK] Consider all filters when using the overview

See merge request !40
parents 0acaf202 e4990bd6
No related branches found
No related tags found
1 merge request!40[TASK] Consider all filters when using the overview
......@@ -30,6 +30,7 @@ use RuntimeException;
use SGalinski\SgNews\Domain\Model\Category;
use SGalinski\SgNews\Domain\Model\News;
use SGalinski\SgNews\Service\ImageService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Domain\Model\FileReference;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
......@@ -95,6 +96,9 @@ abstract class AbstractController extends ActionController {
return $this->cachedSingleNews[$newsId];
}
$fileRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\FileRepository::class);
$fileObjects = $fileRepository->findByRelation('pages', 'media', $news->getUid());
$singleNewsImageData = $this->getDataForSingleViewImage($news, $category);
$teaserImageData = $this->getDataForTeaserImage($news, $category);
......@@ -114,7 +118,8 @@ abstract class AbstractController extends ActionController {
'news' => $news,
],
$singleNewsImageData,
$teaserImageData
$teaserImageData,
['media' => $fileObjects]
);
$this->cachedSingleNews[$newsId] = $newsRecord;
......
......@@ -295,6 +295,9 @@ class OverviewController extends AbstractController {
if ($newsFilter['tag']) {
$tagIds = [(int) $newsFilter['tag']];
}
if ($newsFilter['category']) {
$categoryIds = [(int) $newsFilter['category']];
}
$news = $this->newsRepository->findAllSortedNewsByCategories(
$categoryIds, $newsLimitPerCategory, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection
);
......@@ -336,7 +339,9 @@ class OverviewController extends AbstractController {
}
// remember selection of the filter values, if any
$selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']);
$selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']);
$this->view->assign('selectedCategory', $selectedCategory);
$this->view->assign('selectedTag', $selectedTag);
$this->view->assign('tags', $tags);
$this->view->assign('categories', $categories);
......@@ -454,6 +459,9 @@ class OverviewController extends AbstractController {
}
// Get all news by tags.
if ($newsFilter['tag']) {
$tagIds = [(int) $newsFilter['tag']];
}
$news = $this->newsRepository->findAllSortedNewsByCategories(
$categoryIds, $newsLimitPerTag, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection
);
......@@ -496,8 +504,10 @@ class OverviewController extends AbstractController {
}
// remember selection of the filter values, if any
$selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']);
$selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']);
$this->view->assign('selectedCategory', $selectedCategory);
$this->view->assign('selectedTag', $selectedTag);
$this->view->assign('tags', $tags);
$this->view->assign('categories', $categories);
$this->view->assign('numberOfPages', $numberOfPages);
......
......@@ -80,12 +80,29 @@
<settings.enableFilter>
<TCEforms>
<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter</label>
<description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.enableFilter.description</description>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.enableFilter>
<settings.categoryLabel>
<TCEforms>
<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryLabel</label>
<config>
<type>input</type>
</config>
</TCEforms>
</settings.categoryLabel>
<settings.tagLabel>
<TCEforms>
<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.tagLabel</label>
<config>
<type>input</type>
</config>
</TCEforms>
</settings.tagLabel>
<settings.newsLimit>
<TCEforms>
<label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.newsLimit</label>
......
......@@ -189,6 +189,14 @@
<source><![CDATA[Categories]]></source>
<target><![CDATA[Kategorien]]></target>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.categoryLabel" approved="yes">
<source><![CDATA[Override category label]]></source>
<target><![CDATA[Kategorie-Label überschreiben]]></target>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.tagLabel" approved="yes">
<source><![CDATA[Override tag label]]></source>
<target><![CDATA[Tag-Label überschreiben]]></target>
</trans-unit>
<trans-unit id="plugin.listByCategory.flexForm.categories.description" approved="yes">
<source><![CDATA[If more than one category is selected the pagination breaks so you need to make sure to set the news limit high enough to display all news on one page.]]></source>
<target><![CDATA[Falls mehr als eine Kategorie ausgewählt ist, bricht die Paginierung, deshalb muss sichergestellt werden, dass das Anzeigelimit ausreichend hoch eingestellt ist, dass alle News auf einer Seite angezeigt werden.]]></target>
......@@ -212,8 +220,12 @@ If none are selected, all categories will be available in the frontend.]]></sour
Wenn keine ausgewählt werden, sind alle Kategorien im Frontend verfügbar.]]></target>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.enableFilter" approved="yes">
<source><![CDATA[Enable filtering by criteria that are not grouped in tabs]]></source>
<target><![CDATA[Filtern nach Kriterien, die nicht in Tabs sortiert sind, ermöglichen]]></target>
<source><![CDATA[Enable filtering by all criteria.]]></source>
<target><![CDATA[Ermögliche das Filtern mit allen Krierien.]]></target>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.enableFilter.description" approved="yes">
<source><![CDATA[Filters will be rendered as select boxes and tabs will be hidden.]]></source>
<target><![CDATA[Filter werden als Dropdown-Box angezeigt und die Tabs ausgeblendet.]]></target>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.groupBy" approved="yes">
<source><![CDATA[Group news pages in tabs by]]></source>
......
......@@ -156,12 +156,21 @@
<trans-unit id="plugin.overview.flexForm.categoryRestrictions">
<source><![CDATA[Category Selection]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.categoryLabel">
<source><![CDATA[Override category label]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.tagLabel">
<source><![CDATA[Override tag label]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.categoryRestrictions.description">
<source><![CDATA[You can select specific categories to be shown in the tabs.
If none are selected, all categories will be available in the frontend.]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.enableFilter">
<source><![CDATA[Enable filtering by criteria that are not grouped in tabs]]></source>
<source><![CDATA[Enable filtering by all criteria.]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.enableFilter.description">
<source><![CDATA[Filters will be rendered as select boxes and tabs will be hidden.]]></source>
</trans-unit>
<trans-unit id="plugin.overview.flexForm.groupBy">
<source><![CDATA[Group news pages in tabs by]]></source>
......
<f:form id="tx-sgnews-filter" method="get" objectName="newsFilter">
<div class="tx-sgnews-filter-bar">
<f:if condition="!{categoryTabs}">
<div class="tx-sgnews-filter-bar-form-control">
<label for="filter-categories">
<f:translate key="frontend.filter.category" />
</label>
<f:form.select class="tx-sgnews-select form-control" multiple="0" size="1" value="{selectedCategory.uid}"
property="category" optionLabelField="title" optionValueField="uid" options="{categories}"
id="filter-categories" prependOptionLabel="" prependOptionValue="" />
</div>
</f:if>
<f:if condition="!{tagTabs}">
<div class="tx-sgnews-filter-bar-form-control">
<label for="filter-tags">
<f:translate key="frontend.filter.tag" />
</label>
<f:form.select class="tx-sgnews-select form-control" multiple="0" size="1" value="{selectedTag.uid}"
property="tag" optionValueField="uid" options="{tags}" id="filter-tags"
optionLabelField="title" prependOptionLabel="" prependOptionValue="" />
</div>
</f:if>
<div class="tx-sgnews-filter-bar-form-control">
<label for="filter-categories">
<f:if condition="{categoryLabel}">
<f:then>
{categoryLabel}
</f:then>
<f:else>
<f:translate key="frontend.filter.category"/>
</f:else>
</f:if>
</label>
<f:form.select class="tx-sgnews-select form-control" multiple="0" size="1" value="{selectedCategory.uid}"
property="category" optionLabelField="title" optionValueField="uid" options="{categories}"
id="filter-categories" prependOptionLabel="" prependOptionValue=""/>
</div>
<div class="tx-sgnews-filter-bar-form-control">
<label for="filter-tags">
<f:if condition="{tagLabel}">
<f:then>
{tagLabel}
</f:then>
<f:else>
<f:translate key="frontend.filter.tag"/>
</f:else>
</f:if>
</label>
<f:form.select class="tx-sgnews-select form-control" multiple="0" size="1" value="{selectedTag.uid}"
property="tag" optionValueField="uid" options="{tags}" id="filter-tags"
optionLabelField="title" prependOptionLabel="" prependOptionValue=""/>
</div>
</div>
</f:form>
......@@ -7,83 +7,93 @@
<f:render partial="OverviewSchema" arguments="{newsItems: allNews}" />
<f:if condition="{settings.enableFilter}">
<div id="tx-sgnews-newslist">
<f:render partial="Filter" arguments="{tagTabs: tagTabs, categoryTabs: categoryTabs, categories: categories,
tags: tags, selectedTag: selectedTag, selectedCategory: selectedCategory}" />
</div>
</f:if>
<br />
<div class="tx-sgnews-categories m-tabs" data-more-label="Mehr">
<div class="m-tabs__tablist" role="tablist">
<button class="m-tabs__tab" role="tab" aria-controls="news-category-0" id="tab-news-0" aria-selected="true">
<f:translate key="frontend.overview.allTabLabel" />
</button>
<f:for each="{newsItems}" as="dataItems" iteration="iterator">
<button class="m-tabs__tab" role="tab" aria-controls="news-category-{iterator.index + 1}" id="tab-news-{iterator.index + 1}" aria-selected="false">
<f:if condition="{dataItems.recordType} == 'category'">
<f:then>
{dataItems.record.subtitleWithFallbackToTitle}
</f:then>
<f:else>
{dataItems.record.title}
</f:else>
</f:if>
</button>
</f:for>
</div>
<div class="m-tabs__panellist">
<div class="m-tabs__panel" role="tabpanel" aria-labelledby="tab-news-0" id="news-category-0">
<h4 class="tx-sgnews-tab-title"><f:translate key="frontend.overview.allTabLabel" /></h4>
<ul class="tx-sgnews-list tx-sgnews-list-0 row" data-record="0">
<f:for each="{allNews}" as="newsMetaDataEntry">
<li class="col-md-4 col-sm-6 col-xs-12">
<f:render partial="Teaser" arguments="{
newsMetaData: newsMetaDataEntry,
headerTag: '<h2>',
closingHeaderTag: '</h2>',
showCategory: '{f:if(condition: \'{groupBy} == \" category\"\', then: 0, else: 1)}'
}" />
</li>
</f:for>
</ul>
<f:then>
<div id="tx-sgnews-newslist" class="tx-sgnews-categories">
<f:render partial="Filter" arguments="{tagTabs: tagTabs, categoryTabs: categoryTabs, categories: categories,
tags: tags, selectedTag: selectedTag, selectedCategory: selectedCategory, categoryLabel: settings.categoryLabel, tagLabel: settings.tagLabel}" />
<br />
<f:render section="content" arguments="{_all}" />
</div>
</f:then>
<f:else>
<div class="tx-sgnews-categories m-tabs" data-more-label="Mehr">
<div class="m-tabs__tablist" role="tablist">
<button class="m-tabs__tab" role="tab" aria-controls="news-category-0" id="tab-news-0" aria-selected="true">
<f:translate key="frontend.overview.allTabLabel" />
</button>
<f:for each="{newsItems}" as="dataItems" iteration="iterator">
<button class="m-tabs__tab" role="tab" aria-controls="news-category-{iterator.index + 1}" id="tab-news-{iterator.index + 1}" aria-selected="false">
<f:if condition="{dataItems.recordType} == 'category'">
<f:then>
{dataItems.record.subtitleWithFallbackToTitle}
</f:then>
<f:else>
{dataItems.record.title}
</f:else>
</f:if>
</button>
</f:for>
</div>
<div class="m-tabs__panellist">
<div class="m-tabs__panel" role="tabpanel" aria-labelledby="tab-news-0" id="news-category-0">
<h4 class="tx-sgnews-tab-title"><f:translate key="frontend.overview.allTabLabel" /></h4>
<f:render section="content" arguments="{_all}" />
</div>
<f:for each="{newsItems}" as="dataItems" iteration="iterator">
<div class="m-tabs__panel m-tabs__panel--closed" role="tabpanel" aria-labelledby="tab-news-{iterator.index + 1}" id="news-category-{iterator.index + 1}">
<f:if condition="{dataItems.newsCount} == 0">
<p>
<f:translate key="frontend.filter.no_result" />
</p>
</f:if>
<h4 class="tx-sgnews-tab-title">{dataItems.record.title}</h4>
<ul class="tx-sgnews-list tx-sgnews-list-{dataItems.record.uid} row" data-record="{dataItems.record.uid}">
<f:for each="{dataItems.newsMetaData}" as="newsMetaDataEntry">
<f:if condition="{newsMetaDataEntry.news}">
<li class="col-md-4 col-sm-6 col-xs-12">
<f:render partial="Teaser" arguments="{
<f:for each="{newsItems}" as="dataItems" iteration="iterator">
<div class="m-tabs__panel m-tabs__panel--closed" role="tabpanel" aria-labelledby="tab-news-{iterator.index + 1}" id="news-category-{iterator.index + 1}">
<f:if condition="{dataItems.newsCount} == 0">
<p>
<f:translate key="frontend.filter.no_result" />
</p>
</f:if>
<h4 class="tx-sgnews-tab-title">{dataItems.record.title}</h4>
<ul class="tx-sgnews-list tx-sgnews-list-{dataItems.record.uid} row" data-record="{dataItems.record.uid}">
<f:for each="{dataItems.newsMetaData}" as="newsMetaDataEntry">
<f:if condition="{newsMetaDataEntry.news}">
<li class="col-md-4 col-sm-6 col-xs-12">
<f:render partial="Teaser" arguments="{
newsMetaData: newsMetaDataEntry,
headerTag: '<h2>',
closingHeaderTag: '</h2>',
showCategory: '{f:if(condition: \'{groupBy} == \" category\"\', then: 0, else: 1)}'
}" />
</li>
}" />
</li>
</f:if>
</f:for>
</ul>
<f:if condition="{dataItems.recordType} == 'category'">
<div class="text-center">
<a class="btn btn-md btn-success category-{dataItems.recordId}" href="{f:uri.page(pageUid: '{dataItems.recordId}')}">
<f:translate key="frontend.overview.showAllEntries" />
</a>
</div>
</f:if>
</f:for>
</ul>
<f:if condition="{dataItems.recordType} == 'category'">
<div class="text-center">
<a class="btn btn-md btn-success category-{dataItems.recordId}" href="{f:uri.page(pageUid: '{dataItems.recordId}')}">
<f:translate key="frontend.overview.showAllEntries" />
</a>
</div>
</f:if>
</f:for>
</div>
</f:for>
</div>
</div>
</div>
</f:else>
</f:if>
<sg:pageBrowser numberOfPages="{numberOfPages}" />
</f:section>
<f:section name="content">
<ul class="tx-sgnews-list tx-sgnews-list-0 row" data-record="0">
<f:for each="{allNews}" as="newsMetaDataEntry">
<li class="col-md-4 col-sm-6 col-xs-12">
<f:render partial="Teaser" arguments="{
newsMetaData: newsMetaDataEntry,
headerTag: '<h2>',
closingHeaderTag: '</h2>',
showCategory: '{f:if(condition: \'{groupBy} == \" category\"\', then: 0, else: 1)}'
}" />
</li>
</f:for>
</ul>
</f:section>
## Upgrade from ```9.5.x``` to ```9.6.x```
- Filters are now visible when using the option ```settings.enableFilter``` in the **Overview** plugin.
# Upgrade from ```8.x.x``` to ```9.x.x```
- Dropped TYPO3 8 support
......
......@@ -36,7 +36,7 @@ call_user_func(
'SGalinski.sg_news',
'Overview',
['Overview' => 'overview',],
['Overview' => '',]
['Overview' => 'overview',]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment