‪TYPO3CMS  11.5
DatabaseBrowser.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
19 use TYPO3\CMS\Backend\Utility\BackendUtility;
26 
32 {
40  protected ‪$expandPage;
41  protected array ‪$modTSconfig = [];
42 
43  protected function ‪initialize()
44  {
45  parent::initialize();
46  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Recordlist/BrowseDatabase');
47  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Tree/PageBrowser');
48  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/ColumnSelectorButton');
49  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Recordlist/RecordSearch');
50  }
51 
52  protected function ‪initVariables()
53  {
54  parent::initVariables();
55  $this->‪expandPage = $this->‪getRequest()->getParsedBody()['expandPage'] ?? $this->‪getRequest()->getQueryParams()['expandPage'] ?? null;
56  }
57 
64  public function ‪processSessionData($data)
65  {
66  if ($this->‪expandPage !== null) {
67  $data['expandPage'] = ‪$this->expandPage;
68  ‪$store = true;
69  } else {
70  $this->‪expandPage = (int)($data['expandPage'] ?? 0);
71  ‪$store = false;
72  }
73  return [$data, ‪$store];
74  }
75 
79  public function ‪render()
80  {
81  $this->modTSconfig = BackendUtility::getPagesTSconfig((int)$this->‪expandPage)['mod.']['web_list.'] ?? [];
82  [, , , $allowedTables] = explode('|', $this->bparams);
83 
84  $withTree = true;
85  if ($allowedTables !== '' && $allowedTables !== '*') {
86  $tablesArr = ‪GeneralUtility::trimExplode(',', $allowedTables, true);
87  $onlyRootLevel = true;
88  foreach ($tablesArr as $currentTable) {
89  if (isset(‪$GLOBALS['TCA'][$currentTable])) {
90  if (!isset(‪$GLOBALS['TCA'][$currentTable]['ctrl']['rootLevel']) || (int)‪$GLOBALS['TCA'][$currentTable]['ctrl']['rootLevel'] !== 1) {
91  $onlyRootLevel = false;
92  }
93  }
94  }
95  if ($onlyRootLevel) {
96  $withTree = false;
97  // page to work on is root
98  $this->expandPage = 0;
99  }
100  }
101 
102  $contentOnly = (bool)($this->‪getRequest()->getQueryParams()['contentOnly'] ?? false);
103  $renderedRecordList = $this->‪renderTableRecords($allowedTables);
104 
105  $this->‪setBodyTagParameters();
106  $this->moduleTemplate->setTitle($this->‪getLanguageService()->getLL('recordSelector'));
107  $view = $this->moduleTemplate->getView();
108  $view->assignMultiple([
109  'treeEnabled' => $withTree,
110  'treeType' => 'page',
111  'treeActions' => $allowedTables === 'pages' ? ['select'] : [],
112  'activePage' => $this->expandPage,
113  'initialNavigationWidth' => $this->‪getBackendUser()->uc['selector']['navigation']['width'] ?? 250,
114  'content' => $renderedRecordList,
115  'contentOnly' => $contentOnly,
116  ]);
117  if ($contentOnly) {
118  return $view->render();
119  }
120  return $this->moduleTemplate->renderContent();
121  }
122 
129  protected function ‪renderTableRecords($tables)
130  {
131  $backendUser = $this->‪getBackendUser();
132  if ($this->expandPage === null || $this->expandPage < 0 || !$backendUser->isInWebMount($this->expandPage)) {
133  return '';
134  }
135  // Set array with table names to list:
136  if (trim($tables) === '*') {
137  $tablesArr = array_keys(‪$GLOBALS['TCA']);
138  } else {
139  $tablesArr = ‪GeneralUtility::trimExplode(',', $tables, true);
140  }
141 
142  $out = '';
143  // Create the header, showing the current page for which the listing is.
144  // Includes link to the page itself, if pages are amount allowed tables.
145  $titleLen = (int)$backendUser->uc['titleLen'];
146  $mainPageRecord = BackendUtility::getRecordWSOL('pages', $this->expandPage);
147  if (is_array($mainPageRecord)) {
148  $pText = htmlspecialchars(GeneralUtility::fixed_lgd_cs($mainPageRecord['title'], $titleLen));
149 
150  $out .= '<p>' . $this->iconFactory->getIconForRecord('pages', $mainPageRecord, ‪Icon::SIZE_SMALL)->render() . '&nbsp;';
151  if (in_array('pages', $tablesArr, true)) {
152  $out .= '<span data-uid="' . htmlspecialchars((string)$mainPageRecord['uid']) . '" data-table="pages" data-title="' . htmlspecialchars($mainPageRecord['title']) . '">';
153  $out .= '<a href="#" data-close="0">'
154  . $this->iconFactory->getIcon('actions-add', ‪Icon::SIZE_SMALL)->render()
155  . '</a>'
156  . '<a href="#" data-close="1">'
157  . $pText
158  . '</a>';
159  $out .= '</span>';
160  } else {
161  $out .= $pText;
162  }
163  $out .= '</p>';
164  }
165 
166  $permsClause = $backendUser->getPagePermsClause(‪Permission::PAGE_SHOW);
167  $pageInfo = BackendUtility::readPageAccess($this->expandPage, $permsClause);
168 
169  $dbList = GeneralUtility::makeInstance(ElementBrowserRecordList::class);
170  $dbList->setOverrideUrlParameters($this->‪getUrlParameters([]));
171  $dbList->setIsEditable(false);
172  $dbList->calcPerms = new Permission($backendUser->calcPerms($pageInfo));
173  $dbList->noControlPanels = true;
174  $dbList->clickMenuEnabled = false;
175  $dbList->displayRecordDownload = false;
176  $dbList->tableList = implode(',', $tablesArr);
177 
178  // a string like "data[pages][79][storage_pid]"
179  [$fieldPointerString] = explode('|', $this->bparams);
180  // parts like: data, pages], 79], storage_pid]
181  $fieldPointerParts = explode('[', $fieldPointerString);
182 
183  $relatingTableName = substr(($fieldPointerParts[1] ?? ''), 0, -1);
184  $relatingFieldName = substr(($fieldPointerParts[3] ?? ''), 0, -1);
185 
186  if ($relatingTableName && $relatingFieldName) {
187  $dbList->setRelatingTableAndField($relatingTableName, $relatingFieldName);
188  }
189 
190  $selectedTable = GeneralUtility::_GP('table');
191  $searchWord = (string)GeneralUtility::_GP('search_field');
192  $searchLevels = (int)GeneralUtility::_GP('search_levels');
193  $dbList->start(
194  $this->expandPage,
195  $selectedTable,
196  ‪MathUtility::forceIntegerInRange(GeneralUtility::_GP('pointer'), 0, 100000),
197  $searchWord,
198  $searchLevels
199  );
200 
201  $dbList->setDispFields();
202  $tableList = $dbList->generateList();
203 
204  $out .= $this->‪renderSearchBox($dbList, $searchWord, $searchLevels);
205 
206  // Add the HTML for the record list to output variable:
207  $out .= $tableList;
208 
209  return $out;
210  }
211 
212  protected function ‪renderSearchBox(‪ElementBrowserRecordList $dblist, string $searchWord, int $searchLevels): string
213  {
214  $searchBox = GeneralUtility::makeInstance(RecordSearchBoxComponent::class)
215  ->setAllowedSearchLevels((array)($this->modTSconfig['searchLevel.']['items.'] ?? []))
216  ->setSearchWord($searchWord)
217  ->setSearchLevel($searchLevels)
218  ->render($dblist->‪listURL('', '-1', 'pointer,search_field'));
219  return '<div class="pt-2">' . $searchBox . '</div>';
220  }
221 
226  public function ‪getUrlParameters(array $values)
227  {
228  $pid = $values['pid'] ?? ‪$this->expandPage;
229  return [
230  'mode' => 'db',
231  'expandPage' => $pid,
232  'bparams' => ‪$this->bparams,
233  ];
234  }
235 
240  public function ‪isCurrentlySelectedItem(array $values)
241  {
242  return false;
243  }
244 
250  public function ‪getScriptUrl()
251  {
252  return ‪$this->thisScript;
253  }
254 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\getUrlParameters
‪string[] getUrlParameters(array $values)
Definition: DatabaseBrowser.php:225
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\getRequest
‪getRequest()
Definition: AbstractElementBrowser.php:167
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\initVariables
‪initVariables()
Definition: DatabaseBrowser.php:51
‪TYPO3\CMS\Backend\RecordList\ElementBrowserRecordList
Definition: ElementBrowserRecordList.php:27
‪TYPO3\CMS\Recordlist\Browser\ElementBrowserInterface\processSessionData
‪array[] processSessionData($data)
‪TYPO3\CMS\Recordlist\Browser\ElementBrowserInterface
Definition: ElementBrowserInterface.php:19
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\render
‪string render()
Definition: DatabaseBrowser.php:78
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\$thisScript
‪string $thisScript
Definition: AbstractElementBrowser.php:44
‪TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList\listURL
‪string listURL($altId='', $table='-1', $exclList='')
Definition: DatabaseRecordList.php:2847
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\getScriptUrl
‪string getScriptUrl()
Definition: DatabaseBrowser.php:249
‪TYPO3\CMS\Core\Utility\MathUtility\forceIntegerInRange
‪static int forceIntegerInRange($theInt, $min, $max=2000000000, $defaultValue=0)
Definition: MathUtility.php:32
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\getBackendUser
‪BackendUserAuthentication getBackendUser()
Definition: AbstractElementBrowser.php:183
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\$store
‪$store
Definition: DatabaseBrowser.php:67
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\initialize
‪initialize()
Definition: DatabaseBrowser.php:42
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\renderTableRecords
‪string renderTableRecords($tables)
Definition: DatabaseBrowser.php:128
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\$expandPage
‪int null $expandPage
Definition: DatabaseBrowser.php:39
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\isCurrentlySelectedItem
‪bool isCurrentlySelectedItem(array $values)
Definition: DatabaseBrowser.php:239
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\$modTSconfig
‪array $modTSconfig
Definition: DatabaseBrowser.php:40
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser
Definition: AbstractElementBrowser.php:35
‪TYPO3\CMS\Recordlist\View\RecordSearchBoxComponent
Definition: RecordSearchBoxComponent.php:30
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\renderSearchBox
‪renderSearchBox(ElementBrowserRecordList $dblist, string $searchWord, int $searchLevels)
Definition: DatabaseBrowser.php:211
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\getLanguageService
‪LanguageService getLanguageService()
Definition: AbstractElementBrowser.php:175
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser\expandPage
‪array< int, function processSessionData( $data) { if( $this->expandPage !==null) { $data[ 'expandPage']=$this-> expandPage
Definition: DatabaseBrowser.php:66
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Recordlist\Browser\DatabaseBrowser
Definition: DatabaseBrowser.php:32
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:22
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\$bparams
‪string $bparams
Definition: AbstractElementBrowser.php:63
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Recordlist\Browser\AbstractElementBrowser\setBodyTagParameters
‪setBodyTagParameters()
Definition: AbstractElementBrowser.php:118
‪TYPO3\CMS\Recordlist\Browser
Definition: AbstractElementBrowser.php:16