pageRenderer->loadJavaScriptModule('@typo3/backend/browse-database.js'); $this->pageRenderer->loadJavaScriptModule('@typo3/backend/tree/page-browser.js'); $this->pageRenderer->loadJavaScriptModule('@typo3/backend/column-selector-button.js'); $this->pageRenderer->loadJavaScriptModule('@typo3/backend/recordlist.js'); $this->pageRenderer->loadJavaScriptModule('@typo3/backend/record-search.js'); } protected function initVariables(ServerRequestInterface $request) { parent::initVariables($request); $this->expandPage = $request->getParsedBody()['expandPage'] ?? $request->getQueryParams()['expandPage'] ?? null; } /** * Session data for this class can be set from outside with this method. * * @param mixed[] $data Session data array * @return array Session data and boolean which indicates that data needs to be stored in session because it's changed */ public function processSessionData($data) { if ($this->expandPage !== null) { $data['expandPage'] = $this->expandPage; $store = true; } else { $this->expandPage = (int)($data['expandPage'] ?? 0); $store = false; } return [$data, $store]; } /** * @return string HTML content */ public function render() { $this->getBackendUser()->initializeWebmountsForElementBrowser(); $this->modTSconfig = BackendUtility::getPagesTSconfig((int)$this->expandPage)['mod.']['web_list.'] ?? []; $allowedTables = $this->browserParameters->allowedTypes; $withTree = true; if ($allowedTables !== '' && $allowedTables !== '*') { $tablesArr = GeneralUtility::trimExplode(',', $allowedTables, true); $onlyRootLevel = true; foreach ($tablesArr as $currentTable) { if ($this->tcaSchemaFactory->has($currentTable)) { $schema = $this->tcaSchemaFactory->get($currentTable); if ($schema->getCapability(TcaSchemaCapability::RestrictionRootLevel)->canExistOnPages()) { $onlyRootLevel = false; break; } } } if ($onlyRootLevel) { $withTree = false; // page to work on is root $this->expandPage = 0; } } $contentOnly = (bool)($this->getRequest()->getQueryParams()['contentOnly'] ?? false); $renderedRecordList = $this->renderTableRecords($allowedTables); $this->pageRenderer->setTitle($this->getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:recordSelector')); $view = $this->view; $view->assignMultiple([ 'treeEnabled' => $withTree, 'treeActions' => $allowedTables === 'pages' ? ['select'] : [], 'activePage' => $this->expandPage, 'initialNavigationWidth' => $this->getBackendUser()->uc['selector']['navigation']['width'] ?? 250, 'content' => $renderedRecordList, 'contentOnly' => $contentOnly, ]); $content = $this->view->render('ElementBrowser/Page'); if ($contentOnly) { return $content; } $this->pageRenderer->setBodyContent('getBodyTagParameters() . '>' . $content); return $this->pageRenderer->render($this->getRequest()); } /** * This lists all content elements for the given list of tables * * @param string $tables Comma separated list of tables. Set to "*" if you want all tables. * @return string HTML code */ protected function renderTableRecords($tables) { $request = $this->getRequest(); $backendUser = $this->getBackendUser(); if ($this->expandPage === null || $this->expandPage < 0 || !$backendUser->isInWebMount($this->expandPage)) { return ''; } // Set array with table names to list: if (trim($tables) === '*') { $tablesArr = $this->tcaSchemaFactory->all()->getNames(); } else { $tablesArr = GeneralUtility::trimExplode(',', $tables, true); } $out = ''; // Create the header, showing the current page for which the listing is. // Includes link to the page itself, if pages are amount allowed tables. $mainPageRecord = BackendUtility::getRecordWSOL('pages', $this->expandPage); if (is_array($mainPageRecord)) { $pText = htmlspecialchars(BackendUtility::cropToTitleLength($mainPageRecord['title'])); $out .= '

' . $this->iconFactory->getIconForRecord('pages', $mainPageRecord, IconSize::SMALL)->render() . ' '; if (in_array('pages', $tablesArr, true)) { $out .= ''; $out .= '' . $this->iconFactory->getIcon('actions-plus', IconSize::SMALL)->render() . '' . '' . $pText . ''; $out .= ''; } else { $out .= $pText; } $out .= '

'; } $permsClause = $backendUser->getPagePermsClause(Permission::PAGE_SHOW); $pageInfo = BackendUtility::readPageAccess($this->expandPage, $permsClause); $existingModuleData = $backendUser->getModuleData('records'); $moduleData = new ModuleData('records', is_array($existingModuleData) ? $existingModuleData : []); $dbList = GeneralUtility::makeInstance(ElementBrowserRecordList::class); $dbList->setRequest($request); $dbList->setModuleData($moduleData); $dbList->setOverrideUrlParameters($this->getUrlParameters([]), $request); $dbList->setIsEditable(false); $dbList->calcPerms = new Permission($backendUser->calcPerms($pageInfo)); $dbList->noControlPanels = true; $dbList->clickMenuEnabled = false; $dbList->displayRecordDownload = false; $dbList->tableList = implode(',', $tablesArr); // Extract relating table and field from field reference (e.g., "data[pages][79][storage_pid]") $fieldReferenceParts = $this->browserParameters->getFieldReferenceParts(); if ($fieldReferenceParts['tableName'] !== '' && $fieldReferenceParts['fieldName'] !== '') { $dbList->setRelatingTableAndField($fieldReferenceParts['tableName'], $fieldReferenceParts['fieldName']); } $selectedTable = (string)($request->getParsedBody()['table'] ?? $request->getQueryParams()['table'] ?? ''); $searchWord = (string)($request->getParsedBody()['searchTerm'] ?? $request->getQueryParams()['searchTerm'] ?? ''); $searchLevels = (int)($request->getParsedBody()['search_levels'] ?? $request->getQueryParams()['search_levels'] ?? $this->modTSconfig['searchLevel.']['default'] ?? 0); $pointer = (int)($request->getParsedBody()['pointer'] ?? $request->getQueryParams()['pointer'] ?? 0); $dbList->start( (int)$this->expandPage, $selectedTable, MathUtility::forceIntegerInRange($pointer, 0, 100000), $searchWord, $searchLevels ); $tableList = $dbList->generateList(); $out .= $this->renderSearchBox($request, $dbList, $searchWord, $searchLevels); // Add the HTML for the record list to output variable: $out .= $tableList; return $out; } protected function renderSearchBox(ServerRequestInterface $request, ElementBrowserRecordList $dblist, string $searchWord, int $searchLevels): string { return GeneralUtility::makeInstance(RecordSearchBoxComponent::class) ->setAllowedSearchLevels((array)($this->modTSconfig['searchLevel.']['items.'] ?? [])) ->setSearchWord($searchWord) ->setSearchLevel($searchLevels) ->render($request, $dblist->listURL('', null, 'pointer,searchTerm')); } /** * @param array $values Array of values to include into the parameters * @return array Array of parameters which have to be added to URLs */ public function getUrlParameters(array $values): array { $pid = $values['pid'] ?? $this->expandPage; return array_merge( [ 'mode' => 'db', 'expandPage' => $pid, ], $this->browserParameters->toQueryParameters() ); } }