diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index 119482456c1b015f30a5ebe5894c894a30f27c21..0a524e79e7966522e1870240086221a28012e863 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -28,20 +28,18 @@ namespace SGalinski\SgNews\Controller; use SGalinski\SgNews\Domain\Model\Category; use SGalinski\SgNews\Domain\Model\News; -use SGalinski\SgNews\Domain\Model\Tag; use SGalinski\SgNews\Domain\Repository\CategoryRepository; use SGalinski\SgNews\Domain\Repository\NewsRepository; use SGalinski\SgNews\Domain\Repository\TagRepository; use SGalinski\SgNews\Service\ConfigurationService; use SGalinski\SgNews\Service\HeaderMetaDataService; use TYPO3\CMS\Core\Http\ImmediateResponseException; +use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Persistence\Generic\Query; use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult; use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Frontend\Controller\ErrorController; use TYPO3\CMS\Frontend\Page\PageAccessFailureReasons; -use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; /** * Controller that handles the overview page of categories and their news @@ -108,88 +106,43 @@ class OverviewController extends AbstractController { * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException */ public function overviewAction(array $newsFilter = [], int $currentPageBrowserPage = 0) { - switch ((int) $this->settings['groupBy']) { - case 1: - $this->overviewWithCategories([], [], $newsFilter, $currentPageBrowserPage); - break; - case 2: - $this->overviewWithTags([], [], $newsFilter, $currentPageBrowserPage); - break; - default: - $this->forward('overviewWithoutCategories', NULL, NULL, $this->request->getArguments()); - break; + if ((int) $this->settings['groupBy'] === 0 && (bool) $this->settings['enableFilter'] === FALSE) { + $this->forward('overviewWithoutCategories', NULL, NULL, $this->request->getArguments()); } - } - /** - * Highlights the best fitting news in the metadata of the page - * - * @param array|null $categoryIds - * @param array|null $tagIds - * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException - */ - protected function highlightBestFitNews(array $categoryIds = NULL, array $tagIds = NULL) { + // Setup settings $startTime = (int) $this->settings['starttime']; $endTime = (int) $this->settings['endtime']; + $newsLimit = (int) $this->settings['newsLimit']; + $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimit); + $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); + $sortBy = $configurationService->getConfiguration('sortBy', $this->settings); + $sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings); + $this->tagRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]); + $this->categoryRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]); + $useAllFilters = (bool) $this->settings['enableFilter']; + $isCategoryFiltered = $useAllFilters || (int) $this->settings['groupBy'] === 1; + $isTagFiltered = $useAllFilters || (int) $this->settings['groupBy'] === 2; - /** @var News $highlightedNews */ - $highlightedNews = $this->newsRepository - ->findLastUpdatedOrHighlightedNewsByCategories( - 1, FALSE, $categoryIds, 0, FALSE, $this->settings['sortBy'], $tagIds, $startTime, $endTime - )->getFirst(); - if (!$highlightedNews) { - return; - } - - /** @var Category $category */ - $category = $this->categoryRepository->findByUid($highlightedNews->getPid()); - $highlightedNewsMetaData = NULL; - if ($category) { - $highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category); - } - - if (!version_compare(ExtensionManagementUtility::getExtensionVersion('sg_seo'), '5.0.0', '>=')) { - if ($highlightedNewsMetaData['image']) { - HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']); - } elseif ($highlightedNewsMetaData['teaserImage']) { - HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']); - } + // Get tag pid + $tagPid = (int) $this->settings['tagPid']; + if (!$tagPid) { + $tagPid = $GLOBALS['TSFE']->id; } - } - - /** - * Renders the news overview grouped by categories - * - * @param array $newsByCategory - * @param array $allNews - * @param array $newsFilter - * @param int $currentPageBrowserPage - * @return void - * @throws \InvalidArgumentException - * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException - * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException - * @throws ImmediateResponseException - * @throws \TYPO3\CMS\Core\Error\Http\PageNotFoundException - */ - protected function overviewWithCategories( - array $newsByCategory = [], array $allNews = [], array $newsFilter = [], int $currentPageBrowserPage = 0 - ) { - $newsLimitPerCategory = (int) $this->settings['newsLimit']; - $this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); - - $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerCategory); if ($this->settings['onlyNewsWithinThisPageSection']) { $categories = $this->categoryRepository->findCategoriesInRootLine($GLOBALS['TSFE']->id); + $tags = $this->tagRepository->findTagsInRootLine($tagPid); } else { + $tags = $this->tagRepository->findAll()->toArray(); $categories = $this->categoryRepository->findAll()->toArray(); } - if (count($categories) <= 0) { - return; - } - + // Apply category restrictions $categoryRestrictions = GeneralUtility::intExplode(',', $this->settings['categoryRestrictions'], TRUE); + if (!$isCategoryFiltered) { + $categoryRestrictions = []; + } if (count($categoryRestrictions) > 0) { foreach ($categories as $key => $category) { $categoryId = $category->getUid(); @@ -211,114 +164,106 @@ class OverviewController extends AbstractController { } } - if (count($categories) <= 0) { - return; + // Apply tag restrictions + $tagRestrictions = GeneralUtility::intExplode(',', $this->settings['tagRestrictions'], TRUE); + if (!$isTagFiltered) { + $tagRestrictions = []; } - - $startTime = (int) $this->settings['starttime']; - $endTime = (int) $this->settings['endtime']; - - $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); - $sortBy = $configurationService->getConfiguration('sortBy', $this->settings); - $sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings); - - $categoryIds = []; - $categoriesById = []; - $newsMetaData = []; - foreach ($categories as $category) { - /** @var Category $category */ - $categoryId = $category->getUid(); - $categoryIdsForSelect = [$categoryId]; - $categoryIds[] = $category->getUid(); - $categoriesById[$categoryId] = $category; - if ($category->_getProperty('_languageUid') > 0) { - $originalLangCategory = $this->categoryRepository->findOriginalLanguageById($category->getUid()); - if ($originalLangCategory) { - $originalLangCategoryId = $originalLangCategory->getUid(); - $categoryIdsForSelect[] = $originalLangCategoryId; - $categoryIds[] = $originalLangCategoryId; - $categoriesById[$originalLangCategoryId] = $originalLangCategory; - } - } - - $tagIds = NULL; - if ($newsFilter['tag']) { - $tagIds = [(int) $newsFilter['tag']]; - } - foreach ($categoryIdsForSelect as $categoryIdsForSelectId) { - $news = $this->newsRepository->findAllSortedNewsByCategories( - [$categoryIdsForSelectId], $newsLimitPerCategory, $offset, $sortBy, $tagIds, $startTime, $endTime, - $sortDirection - ); - - $newsMetaData[$categoryIdsForSelectId] = []; - foreach ($news as $newsEntry) { - /** @var News $newsEntry */ - $category = $categoriesById[$categoryIdsForSelectId]; - if (!$category) { - // Category isn't visible. - continue; - } - - $data = $this->getMetaDataForNews($newsEntry, $category); - $newsMetaData[$categoryIdsForSelectId][] = $data; + if (count($tagRestrictions) > 0) { + foreach ($tags as $key => $tag) { + if (!in_array($tag->getUid(), $tagRestrictions, TRUE)) { + unset($tags[$key]); } } } - $maxNewsPerCategory = 0; - foreach ($categoriesById as $categoryId => $category) { - if (!isset($newsMetaData[$categoryId]) || count($newsMetaData[$categoryId]) <= 0) { - // Hide empty categories. - continue; - } - - /** @var Category $category */ - if (isset($newsByCategory[$categoryId])) { - /** @var Category $category */ - $newsByCategory[$categoryId]['newsMetaData'] = - array_merge($newsByCategory[$categoryId]['newsMetaData'], $newsMetaData[$categoryId], $newsFilter); - } else { - $newsByCategory[$categoryId] = [ - 'record' => $category, - 'recordId' => $categoryId, - 'recordType' => 'category', - 'newsMetaData' => $newsMetaData[$categoryId], - 'newsCount' => count($newsMetaData[$categoryId]) - ]; + // Get category ids or use the one in the filter + $categoryIds = []; + if ($newsFilter['category']) { + $categoryIds = [(int) $newsFilter['category']]; + } elseif ($isCategoryFiltered) { + foreach ($categories as $category) { + $categoryIds[] = $category->getUid(); } - - $maxNewsPerCategory = \max($maxNewsPerCategory, \count($newsByCategory[$categoryId]['newsMetaData'])); + } else { + $categoryIds = NULL; } - $tagIds = NULL; + // Get tag ids or use the one in the filter + $tagIds = []; if ($newsFilter['tag']) { $tagIds = [(int) $newsFilter['tag']]; + } elseif ($isTagFiltered) { + foreach ($tags as $tag) { + $tagIds[] = $tag->getUid(); + } + } else { + $tagIds = NULL; } - if ($newsFilter['category']) { - $categoryIds = [(int) $newsFilter['category']]; - } + + // Get all news by category and tag ids $news = $this->newsRepository->findAllSortedNewsByCategories( - $categoryIds, $newsLimitPerCategory, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection + $categoryIds, $newsLimit, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection ); + // Process news result query based on filters + $allNews = []; + $newsItems = []; + $areCategoriesCreated = FALSE; foreach ($news as $newsEntry) { /** @var News $newsEntry */ - $categoryId = $newsEntry->getPid(); - $category = $categoriesById[$categoryId]; - if (!$category) { - // Category isn't visible. - continue; + $newsCategory = $this->categoryRepository->findOriginalLanguageById( + $newsEntry->getPid() + ) ?? $this->categoryRepository->findByUid($newsEntry->getPid()); + $newsCategoryId = $newsCategory->getUid(); + $newsMetaData = $this->getMetaDataForNews($newsEntry, $newsCategory); + + if ((int) $this->settings['groupBy'] === 1) { + if (!$areCategoriesCreated) { + // Add all required categories + foreach ($categories as $category) { + /** @var Category $category */ + $newsItems[$category->getUid()] = [ + 'record' => $category, + 'recordId' => $category->getUid(), + 'recordType' => 'category', + 'newsMetaData' => [], + 'newsCount' => 0 + ]; + } + $areCategoriesCreated = TRUE; + } + + $newsItems[$newsCategoryId]['newsMetaData'][] = $newsMetaData; + $newsItems[$newsCategoryId]['newsCount'] += 1; + } else { + foreach ($tags as $tag) { + $tagId = $tag->getUid(); + if (!isset($newsItems[$tagId])) { + $newsItems[$tagId] = [ + 'record' => $tag, + 'recordId' => $tagId, + 'recordType' => 'tag', + 'newsMetaData' => [], + 'newsCount' => 0 + ]; + } + + if ($newsEntry->getTags()->contains($tag)) { + $newsItems[$tagId]['newsMetaData'][] = $newsMetaData; + $newsItems[$tagId]['newsCount'] += 1; + } + } } - $data = $this->getMetaDataForNews($newsEntry, $category); - $allNews[] = $data; + $allNews[] = $newsMetaData; } - $this->highlightBestFitNews($categoryIds); + $this->highlightBestFitNews($categoryIds, $tagIds); + // Check to achieve less Ajax calls. $newsCount = $this->newsRepository->newsCountByCategories($categoryIds, $tagIds, $startTime, $endTime); - $numberOfPages = (int) ($newsLimitPerCategory <= 0 ? 0 : ceil($newsCount / $newsLimitPerCategory)); + $numberOfPages = (int) ($newsLimit <= 0 ? 0 : ceil($newsCount / $newsLimit)); if ($numberOfPages !== 0 && $currentPageBrowserPage >= $numberOfPages) { /** @var ErrorController $errorController */ $errorController = GeneralUtility::makeInstance(ErrorController::class); @@ -330,191 +275,94 @@ class OverviewController extends AbstractController { throw new ImmediateResponseException($response); } - // find all tags - $tagPid = $GLOBALS['TSFE']->id; - if ($this->settings['onlyNewsWithinThisPageSection']) { - $tags = $this->tagRepository->findTagsInRootLine($tagPid); - } else { - $tags = $this->tagRepository->findAll()->toArray(); - } - // remember selection of the filter values, if any - $selectedCategory = $this->categoryRepository->findByUid((int) $newsFilter['category']); $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); - $this->view->assign('newsItems', $newsByCategory); - $this->view->assign('groupBy', 'category'); + $this->view->assign('newsItems', $newsItems); $this->view->assign('allNews', $allNews); - $this->view->assign('categoryTabs', TRUE); + $this->setupGridColumns(); + + switch ($this->settings['groupBy']) { + case 1: + $this->view->assign('groupBy', 'category'); + $this->view->assign('categoryTabs', TRUE); + break; + case 2: + $this->view->assign('groupBy', 'tag'); + $this->view->assign('tagTabs', TRUE); + break; + default: + $this->view->assign('groupBy', 'none'); + } } /** - * Renders the news overview grouped by tags + * Assign the grid column classes to the frontend * - * @param array $newsByTag - * @param array $allNews - * @param array $newsFilter - * @param int $currentPageBrowserPage * @return void - * @throws \InvalidArgumentException - * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException - * @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException - * @throws ImmediateResponseException - * @throws \TYPO3\CMS\Core\Error\Http\PageNotFoundException */ - protected function overviewWithTags( - array $newsByTag = [], array $allNews = [], array $newsFilter = [], int $currentPageBrowserPage = 0 - ) { - $startTime = (int) $this->settings['starttime']; - $endTime = (int) $this->settings['endtime']; - $newsLimitPerTag = (int) $this->settings['newsLimit']; - $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerTag); - $tagPid = (int) $this->settings['tagPid']; - if (!$tagPid) { - $tagPid = $GLOBALS['TSFE']->id; + protected function setupGridColumns(): void { + if (!isset($this->settings['gridColumns'])) { + $this->view->assign('gridColumnClasses', 'col-md-4 col-sm-6 col-xs-12'); + return; } - $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); - $sortBy = $configurationService->getConfiguration('sortBy', $this->settings); - $sortDirection = $configurationService->getConfiguration('sortDirection', $this->settings); - - $categoryIds = NULL; - if ($newsFilter['category']) { - $categoryIds = [(int) $newsFilter['category']]; - } + $columnAmount = (int) $this->settings['gridColumns']; + $columnClasses = ''; - $this->tagRepository->setDefaultOrderings(['sorting' => QueryInterface::ORDER_ASCENDING]); - if ($this->settings['onlyNewsWithinThisPageSection']) { - $tags = $this->tagRepository->findTagsInRootLine($tagPid); - } else { - $tags = $this->tagRepository->findAll()->toArray(); + switch ($columnAmount) { + case 4: + $columnClasses .= 'col-lg-3 '; + case 3: + $columnClasses .= 'col-md-4 '; + case 2: + $columnClasses .= 'col-sm-6 '; + default: + $columnClasses .= 'col-xs-12'; } - $tagRestrictions = GeneralUtility::intExplode(',', $this->settings['tagRestrictions'], TRUE); - if (count($tagRestrictions) > 0) { - foreach ($tags as $key => $tag) { - if (!in_array($tag->getUid(), $tagRestrictions, TRUE)) { - unset($tags[$key]); - } - } - } + $this->view->assign('gridColumnClasses', $columnClasses); + } - // Get news by tag id - $tagIds = []; - $tagsById = []; - $categoriesById = []; - $newsMetaData = []; - foreach ($tags as $tag) { - /** @var $tag Tag */ - $tagId = $tag->getUid(); - $tagIds[] = $tagId; - $tagsById[$tagId] = $tag; - - $news = $this->newsRepository->findAllSortedNewsByCategories( - $categoryIds, $newsLimitPerTag, $offset, $sortBy, [$tagId], $startTime, $endTime, $sortDirection - ); - $newsMetaData[$tagId] = []; - foreach ($news as $newsEntry) { - /** @var News $newsEntry */ - $categoryId = $newsEntry->getPid(); - if (!isset($categoriesById[$categoryId])) { - $categoriesById[$categoryId] = $this->categoryRepository->findByUid($categoryId); - } - $category = $categoriesById[$categoryId]; - if (!$category) { - // Category isn't visible. - continue; - } + /** + * Highlights the best fitting news in the metadata of the page + * + * @param array|null $categoryIds + * @param array|null $tagIds + * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException + */ + protected function highlightBestFitNews(array $categoryIds = NULL, array $tagIds = NULL) { + $startTime = (int) $this->settings['starttime']; + $endTime = (int) $this->settings['endtime']; - $newsMetaData[$tagId][] = $this->getMetaDataForNews($newsEntry, $category); - } + /** @var News $highlightedNews */ + $highlightedNews = $this->newsRepository + ->findLastUpdatedOrHighlightedNewsByCategories( + 1, FALSE, $categoryIds, 0, FALSE, $this->settings['sortBy'], $tagIds, $startTime, $endTime + )->getFirst(); + if (!$highlightedNews) { + return; } - // Process news by tag id - $maxNewsPerTag = 0; - foreach ($tagsById as $tagId => $tag) { - if (\count($newsMetaData[$tagId]) <= 0) { - // Hide empty tags. - continue; - } - - if (isset($newsByTag[$tagId])) { - $newsByTag[$tagId]['newsMetaData'] = - \array_merge($newsByTag[$tagId]['newsMetaData'], $newsMetaData[$tagId]); - } else { - $newsByTag[$tagId] = [ - 'record' => $tag, - 'recordId' => $tagId, - 'recordType' => 'tag', - 'newsMetaData' => $newsMetaData[$tagId], - 'newsCount' => \count($newsMetaData[$tagId]) - ]; - } - - $maxNewsPerTag = \max($maxNewsPerTag, \count($newsByTag[$tagId]['newsMetaData'])); + /** @var Category $category */ + $category = $this->categoryRepository->findByUid($highlightedNews->getPid()); + $highlightedNewsMetaData = NULL; + if ($category) { + $highlightedNewsMetaData = $this->getMetaDataForNews($highlightedNews, $category); } - // Get all news by tags. - if ($newsFilter['tag']) { - $tagIds = [(int) $newsFilter['tag']]; - } - $news = $this->newsRepository->findAllSortedNewsByCategories( - $categoryIds, $newsLimitPerTag, $offset, $sortBy, $tagIds, $startTime, $endTime, $sortDirection - ); - foreach ($news as $newsEntry) { - /** @var News $newsEntry */ - $categoryId = $newsEntry->getPid(); - if (!isset($categoriesById[$categoryId])) { - $categoriesById[$categoryId] = $this->categoryRepository->findByUid($categoryId); - } - /** @var Category $category */ - $category = $categoriesById[$categoryId]; - if (!$category) { - // Category isn't visible. - continue; + if (!version_compare(ExtensionManagementUtility::getExtensionVersion('sg_seo'), '5.0.0', '>=')) { + if ($highlightedNewsMetaData['image']) { + HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['image']); + } elseif ($highlightedNewsMetaData['teaserImage']) { + HeaderMetaDataService::addOgImageToHeader($highlightedNewsMetaData['teaserImage']); } - - $allNews[] = $this->getMetaDataForNews($newsEntry, $category); - } - - $this->highlightBestFitNews([], $tagIds); - - // Check to achieve less Ajax calls. - $newsCount = $this->newsRepository->newsCountByCategories([], $tagIds, $startTime, $endTime); - $numberOfPages = (int) ($newsLimitPerTag <= 0 ? 0 : ceil($newsCount / $newsLimitPerTag)); - if ($numberOfPages !== 0 && $currentPageBrowserPage >= $numberOfPages) { - /** @var ErrorController $errorController */ - $errorController = GeneralUtility::makeInstance(ErrorController::class); - $response = $errorController->pageNotFoundAction( - $GLOBALS['TYPO3_REQUEST'], - 'The requested page does not exist', - ['code' => PageAccessFailureReasons::PAGE_NOT_FOUND] - ); - throw new ImmediateResponseException($response); } - - if ($this->settings['onlyNewsWithinThisPageSection']) { - $categories = $this->categoryRepository->findCategoriesInRootLine($GLOBALS['TSFE']->id); - } else { - $categories = $this->categoryRepository->findAll()->toArray(); - } - - // 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); - $this->view->assign('newsItems', $newsByTag); - $this->view->assign('groupBy', 'tag'); - $this->view->assign('allNews', $allNews); - $this->view->assign('tagTabs', TRUE); } /** @@ -651,6 +499,7 @@ class OverviewController extends AbstractController { $this->view->assign('categories', $categories); $this->view->assign('numberOfPages', $numberOfPages); $this->view->assign('newsMetaData', $newsMetaData); + $this->setupGridColumns(); } /** diff --git a/Configuration/FlexForms/Overview.xml b/Configuration/FlexForms/Overview.xml index 23ce498fe2ad094c3fbf2f4d96be4d5e2647ff1f..10b59fda4f6bbbac6dcaddcc5f0e878460b3b5f2 100644 --- a/Configuration/FlexForms/Overview.xml +++ b/Configuration/FlexForms/Overview.xml @@ -13,6 +13,7 @@ <settings.groupBy> <TCEforms> <label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.groupBy</label> + <description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.groupBy.description</description> <onChange>reload</onChange> <config> <type>select</type> @@ -36,11 +37,28 @@ </TCEforms> </settings.groupBy> + <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> + <onChange>reload</onChange> + <config> + <type>check</type> + <default>0</default> + </config> + </TCEforms> + </settings.enableFilter> + <settings.categoryRestrictions> <TCEforms> <label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryRestrictions</label> <description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.categoryRestrictions.description</description> - <displayCond>FIELD:settings.groupBy:=:1</displayCond> + <displayCond> + <or> + <value1>FIELD:settings.groupBy:=:1</value1> + <value2>FIELD:settings.enableFilter:=:1</value2> + </or> + </displayCond> <config> <type>select</type> <renderType>selectMultipleSideBySide</renderType> @@ -57,7 +75,12 @@ <TCEforms> <label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.tags</label> <description>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.overview.flexForm.tags.description</description> - <displayCond>FIELD:settings.groupBy:=:2</displayCond> + <displayCond> + <or> + <value1>FIELD:settings.groupBy:=:2</value1> + <value2>FIELD:settings.enableFilter:=:1</value2> + </or> + </displayCond> <config> <type>select</type> <renderType>selectTree</renderType> @@ -77,16 +100,6 @@ </TCEforms> </settings.tagRestrictions> - <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> @@ -220,6 +233,34 @@ </config> </TCEforms> </settings.layout> + <settings.gridColumns> + <TCEforms> + <label>LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns</label> + <config> + <type>select</type> + <renderType>selectSingle</renderType> + <default>3</default> + <items> + <numIndex index="0"> + <numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.1</numIndex> + <numIndex index="1">1</numIndex> + </numIndex> + <numIndex index="1"> + <numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.2</numIndex> + <numIndex index="1">2</numIndex> + </numIndex> + <numIndex index="2"> + <numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.3</numIndex> + <numIndex index="1">3</numIndex> + </numIndex> + <numIndex index="3"> + <numIndex index="0">LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:plugin.flexForm.gridColumns.4</numIndex> + <numIndex index="1">4</numIndex> + </numIndex> + </items> + </config> + </TCEforms> + </settings.gridColumns> </el> </ROOT> </main> diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf index 22069fcaa5e58020b26571c5b28a768defbbb1e2..10d21c38c025ad2e9731b8d48b500ae8578ab2b9 100644 --- a/Resources/Private/Language/de.locallang_db.xlf +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -113,6 +113,26 @@ <source><![CDATA[News which are excluded from the list]]></source> <target><![CDATA[News, welche nicht in der Liste dargestellt werden]]></target> </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns" approved="yes"> + <source><![CDATA[Columns]]></source> + <target><![CDATA[Anzahl der Spalten]]></target> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.1" approved="yes"> + <source><![CDATA[1 Column]]></source> + <target><![CDATA[1 Spalte]]></target> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.2" approved="yes"> + <source><![CDATA[2 Columns]]></source> + <target><![CDATA[2 Spalten]]></target> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.3" approved="yes"> + <source><![CDATA[3 Columns]]></source> + <target><![CDATA[3 Spalten]]></target> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.4" approved="yes"> + <source><![CDATA[4 Columns]]></source> + <target><![CDATA[4 Spalten]]></target> + </trans-unit> <trans-unit id="plugin.flexForm.layout" approved="yes"> <source><![CDATA[Layout]]></source> <target><![CDATA[Layout]]></target> @@ -232,16 +252,20 @@ 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 all criteria.]]></source> - <target><![CDATA[Ermögliche das Filtern mit allen Krierien.]]></target> + <source><![CDATA[Show all filters]]></source> + <target><![CDATA[Zeige alle Filter an]]></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> - <target><![CDATA[News-Seiten nach folgendem Kriterium in Tabs gruppieren]]></target> + <source><![CDATA[Group news pages by]]></source> + <target><![CDATA[News-Seiten nach folgendem Kriterium gruppieren]]></target> + </trans-unit> + <trans-unit id="plugin.overview.flexForm.groupBy.description" approved="yes"> + <source><![CDATA[News pages will be grouped in tabs.]]></source> + <target><![CDATA[News-Seiten werden in Tabs gruppiert.]]></target> </trans-unit> <trans-unit id="plugin.overview.flexForm.groupBy.I.0" approved="yes"> <source><![CDATA[No grouping]]></source> diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index a24ed7c27096f50f44c0e42f5be02a6a69ad3954..4d42520c1b82b563b95e9ebf859d6c61489b0978 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -87,6 +87,21 @@ <trans-unit id="plugin.flexForm.excludedNews"> <source><![CDATA[News which are excluded from the list]]></source> </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns"> + <source><![CDATA[Columns]]></source> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.1"> + <source><![CDATA[1 Column]]></source> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.2"> + <source><![CDATA[2 Columns]]></source> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.3"> + <source><![CDATA[3 Columns]]></source> + </trans-unit> + <trans-unit id="plugin.flexForm.gridColumns.4"> + <source><![CDATA[4 Columns]]></source> + </trans-unit> <trans-unit id="plugin.flexForm.layout"> <source><![CDATA[Layout]]></source> </trans-unit> @@ -176,13 +191,16 @@ 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 all criteria.]]></source> + <source><![CDATA[Show all filters]]></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> + <source><![CDATA[Group news pages by]]></source> + </trans-unit> + <trans-unit id="plugin.overview.flexForm.groupBy.description"> + <source><![CDATA[News pages will be grouped in tabs.]]></source> </trans-unit> <trans-unit id="plugin.overview.flexForm.groupBy.I.0"> <source><![CDATA[No grouping]]></source> diff --git a/Resources/Private/Templates/Overview/Overview.html b/Resources/Private/Templates/Overview/Overview.html index 6cc96d8d84c29ee7978647ea1e0ab66355eb1bf2..1538104f9f84b4923c4178dc4b71ea434922ad66 100644 --- a/Resources/Private/Templates/Overview/Overview.html +++ b/Resources/Private/Templates/Overview/Overview.html @@ -58,7 +58,7 @@ <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"> + <li class="{gridColumnClasses}"> <f:render partial="Teaser" arguments="{ newsMetaData: newsMetaDataEntry, headerTag: '<h2>', @@ -92,7 +92,7 @@ <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"> + <li class="{gridColumnClasses}"> <f:render partial="Teaser" arguments="{ newsMetaData: newsMetaDataEntry, headerTag: '<h2>', diff --git a/Resources/Private/Templates/Overview/OverviewWithoutCategories.html b/Resources/Private/Templates/Overview/OverviewWithoutCategories.html index e41b2fc4b9b96bd21054ebb41c371f2b1bd5e5b7..f1839f91f8ac6ff3ec81ff96df463c8bd3b3d5c1 100644 --- a/Resources/Private/Templates/Overview/OverviewWithoutCategories.html +++ b/Resources/Private/Templates/Overview/OverviewWithoutCategories.html @@ -18,7 +18,7 @@ <f:then> <ul class="tx-sgnews-list tx-sgnews-list-0 row" data-record="0"> <f:for each="{newsMetaData}" as="newsMetaDataEntry"> - <li class="col-md-4 col-sm-6 col-xs-12"> + <li class="{gridColumnClasses}"> <f:render partial="Teaser" arguments="{ newsMetaData: newsMetaDataEntry, headerTag: '<h2>',