moduleTemplateFactory->create($request); $backendUser = $this->getBackendUser(); $parentPageUid = (int)($request->getQueryParams()['id'] ?? 0); // Show only if there is a valid page and if this page may be viewed by the user $pageInformation = BackendUtility::readPageAccess($parentPageUid, $backendUser->getPagePermsClause(Permission::PAGE_SHOW)); if (!is_array($pageInformation)) { // User has no permission on parent page, should not happen, just render an empty page return $view->renderResponse('Dummy/Index'); } // Doc header handling $view->getDocHeaderComponent()->setPageBreadcrumb($pageInformation); $view->addButtonToButtonBar( $this->componentFactory->createViewButton( PreviewUriBuilder::create($pageInformation) ->withRootLine(BackendUtility::BEgetRootLine($parentPageUid)) ->buildDispatcherDataAttributes() ?? [] ) ); $isInWorkspace = $backendUser->workspace !== 0; $view->assignMultiple([ 'isInWorkspace' => $isInWorkspace, 'maxTitleLength' => $backendUser->uc['titleLen'] ?? 20, 'parentPageUid' => $parentPageUid, 'dateFormat' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'], 'timeFormat' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], ]); if (!$isInWorkspace) { // Apply new sorting if given $newSortBy = $request->getQueryParams()['newSortBy'] ?? null; if ($newSortBy && in_array($newSortBy, ['title', 'subtitle', 'nav_title', 'crdate', 'tstamp'], true)) { $this->sortSubPagesByField($parentPageUid, (string)$newSortBy); } elseif ($newSortBy && $newSortBy === 'reverseCurrentSorting') { $this->reverseSortingOfPages($parentPageUid); } // Get sub pages, loop through them and add page/user specific permission details $pageRecords = $this->getSubPagesOfPage($parentPageUid); $hasInvisiblePage = false; $subPages = []; foreach ($pageRecords as $page) { $pageWithPermissions = []; $pageWithPermissions['record'] = $page; $calculatedPermissions = new Permission($backendUser->calcPerms($page)); $pageWithPermissions['canEdit'] = $backendUser->isAdmin() || $calculatedPermissions->editPagePermissionIsGranted(); $canSeePage = $backendUser->isAdmin() || $calculatedPermissions->showPagePermissionIsGranted(); if ($canSeePage) { $subPages[] = $pageWithPermissions; } else { $hasInvisiblePage = true; } } $view->assign('subPages', $subPages); $view->assign('hasInvisiblePage', $hasInvisiblePage); } return $view->renderResponse('Page/SortSubPages'); } /** * Sort sub pages of given uid by field name alphabetically * * @param int $parentPageUid Parent page uid * @param string $newSortBy Field name to sort by * @throws \RuntimeException If $newSortBy does not validate */ protected function sortSubPagesByField(int $parentPageUid, string $newSortBy) { if (!in_array($newSortBy, ['title', 'subtitle', 'nav_title', 'crdate', 'tstamp'], true)) { throw new \RuntimeException( 'New sort by must be one of "title", "subtitle", "nav_title", "crdate" or tstamp', 1498924810 ); } $subPages = $this->getSubPagesOfPage($parentPageUid, $newSortBy); if (!empty($subPages)) { $subPages = array_reverse($subPages); $this->persistNewSubPageOrder($parentPageUid, $subPages); } } /** * Reverse current sorting of sub pages * * @param int $parentPageUid Parent page uid */ protected function reverseSortingOfPages(int $parentPageUid) { $subPages = $this->getSubPagesOfPage($parentPageUid); if (!empty($subPages)) { $this->persistNewSubPageOrder($parentPageUid, $subPages); } } /** * Store new sub page order * * @param int $parentPageUid Parent page uid * @param array $subPages List of sub pages in new order */ protected function persistNewSubPageOrder(int $parentPageUid, array $subPages) { $commandArray = []; foreach ($subPages as $subPage) { $commandArray['pages'][$subPage['uid']]['move'] = $parentPageUid; } $dataHandler = GeneralUtility::makeInstance(DataHandler::class); $dataHandler->start([], $commandArray); $dataHandler->process_cmdmap(); BackendUtility::setUpdateSignal('updatePageTree'); } /** * Get a list of sub pages with some all fields from given page. * Fetch all data fields for full page icon display * * @param int $parentPageUid Get sub pages from this pages * @param string $orderBy Order pages by this field */ protected function getSubPagesOfPage(int $parentPageUid, string $orderBy = 'sorting'): array { $queryBuilder = $this->connectionPool->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); return $queryBuilder->select('*') ->from('pages') ->where( $queryBuilder->expr()->or( $queryBuilder->expr()->eq('language_tag', $queryBuilder->createNamedParameter(\Local\Multilanguage\Service\DefaultLanguageTagService::getTag())), $queryBuilder->expr()->eq('language_tag', $queryBuilder->createNamedParameter('')), ), $queryBuilder->expr()->eq( 'pid', $queryBuilder->createNamedParameter($parentPageUid, Connection::PARAM_INT) ) ) ->orderBy($orderBy) ->executeQuery() ->fetchAllAssociative(); } protected function getLanguageService(): LanguageService { return $GLOBALS['LANG']; } protected function getBackendUser(): BackendUserAuthentication { return $GLOBALS['BE_USER']; } }