diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 1c710e0e2bc6a2f36737ab58669751ddac1875e5..d4d44b186b280961a27327a1d275649559436abb 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -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; diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index 9edb1e09206e0a8594214fb932c2197344276ebe..119482456c1b015f30a5ebe5894c894a30f27c21 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -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); diff --git a/Configuration/FlexForms/Overview.xml b/Configuration/FlexForms/Overview.xml index e41b3c61dc9d0aa052c86ec86d78cb891a5352e5..3825dd256d5b310f69bfbeceb8fabfa9cf9b3fa3 100644 --- a/Configuration/FlexForms/Overview.xml +++ b/Configuration/FlexForms/Overview.xml @@ -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> diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf index 26620a5827670dbbd35b337cce312a627d370ecd..576cf8f149cb5a40d0f39263c14650da514916f2 100644 --- a/Resources/Private/Language/de.locallang_db.xlf +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -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> diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index 61360d4b7daedbc1e7a800123d8f99d8acba297d..542ce47e3794e70eb077d06881f6480c8e51ffc2 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -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> diff --git a/Resources/Private/Partials/Filter.html b/Resources/Private/Partials/Filter.html index cf6dda5dba7d40f1b294f0efe65a277e62b1e51a..f3aa59fb9a1e79a40d3494bda31e2f14d8008b5e 100644 --- a/Resources/Private/Partials/Filter.html +++ b/Resources/Private/Partials/Filter.html @@ -1,24 +1,34 @@ <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> diff --git a/Resources/Private/Templates/Overview/Overview.html b/Resources/Private/Templates/Overview/Overview.html index 0b0b056e89ddb2f74204c2776f30e1f79054675c..7f7ddec62ab3c3c45508376ef5416e785b4a47da 100644 --- a/Resources/Private/Templates/Overview/Overview.html +++ b/Resources/Private/Templates/Overview/Overview.html @@ -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> diff --git a/Upgrade.md b/Upgrade.md index f16523ce47f5682bf3dd619dd1d7d15a2fe9a087..140b41e2afea0854efbd877c96159f33c16d1ad2 100644 --- a/Upgrade.md +++ b/Upgrade.md @@ -1,3 +1,7 @@ +## 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 diff --git a/ext_localconf.php b/ext_localconf.php index d08914f19d27a0e5a168b254eebdf2138548a874..050de5bb24d54bb615a436ea248bdc11858932f4 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -36,7 +36,7 @@ call_user_func( 'SGalinski.sg_news', 'Overview', ['Overview' => 'overview',], - ['Overview' => '',] + ['Overview' => 'overview',] ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(