‪TYPO3CMS  ‪main
DatabaseTreeDataProvider.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
24 use TYPO3\CMS\Backend\Utility\BackendUtility;
30 use TYPO3\CMS\Core\Imaging\IconSize;
34 
39 {
40  public const ‪MODE_CHILDREN = 1;
41  public const ‪MODE_PARENT = 2;
42 
43  protected string ‪$tableName = '';
44 
48  protected ‪$treeId = '';
49 
50  protected string ‪$labelField = '';
51 
52  protected string ‪$tableWhere = '';
53 
57  protected int ‪$lookupMode = ‪self::MODE_CHILDREN;
58 
59  protected string ‪$lookupField = '';
60 
64  protected array ‪$startingPoints = [0];
65 
66  protected array ‪$idCache = [];
67 
73  protected array ‪$columnConfiguration;
74 
80  protected array ‪$nodeSortValues = [];
81 
82  public function ‪__construct(protected EventDispatcherInterface $eventDispatcher) {}
83 
87  public function ‪setLabelField(string ‪$labelField): void
88  {
89  $this->labelField = ‪$labelField;
90  }
91 
95  public function ‪getLabelField(): string
96  {
97  return ‪$this->labelField;
98  }
99 
103  public function ‪setTableName(string ‪$tableName): void
104  {
105  $this->tableName = ‪$tableName;
106  }
107 
111  public function ‪getTableName(): string
112  {
113  return ‪$this->tableName;
114  }
115 
119  public function ‪setLookupField(string ‪$lookupField): void
120  {
121  $this->lookupField = ‪$lookupField;
122  }
123 
127  public function ‪getLookupField(): string
128  {
129  return ‪$this->lookupField;
130  }
131 
137  public function ‪setLookupMode(int ‪$lookupMode): void
138  {
139  $this->lookupMode = ‪$lookupMode;
140  }
141 
147  public function ‪getLookupMode(): int
148  {
149  return ‪$this->lookupMode;
150  }
151 
155  public function ‪getNodes(TreeNode $node): void {}
156 
160  public function ‪getRoot(): DatabaseTreeNode
161  {
162  return $this->‪buildRepresentationForNode($this->treeData);
163  }
164 
170  public function ‪setStartingPoints(array ‪$startingPoints): void
171  {
172  $this->startingPoints = ‪$startingPoints;
173  }
174 
180  public function ‪getStartingPoints(): array
181  {
183  }
184 
188  public function ‪setTableWhere(string ‪$tableWhere): void
189  {
190  $this->tableWhere = ‪$tableWhere;
191  }
192 
196  public function ‪getTableWhere(): string
197  {
198  return ‪$this->tableWhere;
199  }
200 
204  protected function ‪buildRepresentationForNode(TreeNode $basicNode, ?DatabaseTreeNode $parent = null, $level = 0): DatabaseTreeNode
205  {
206  $node = GeneralUtility::makeInstance(DatabaseTreeNode::class);
207  $row = [];
208  if ($basicNode->getId() == 0) {
209  $node->setSelected(false);
210  $node->setExpanded(true);
211  $node->setLabel($this->‪getLanguageService()?->sL(‪$GLOBALS['TCA'][$this->tableName]['ctrl']['title']));
212  } else {
213  if ($basicNode->getAdditionalData() === []) {
214  $row = BackendUtility::getRecordWSOL($this->tableName, (int)$basicNode->getId(), '*', '', false) ?? [];
215  } else {
216  // @todo: This is part of the category tree performance hack
217  $row = $basicNode->getAdditionalData();
218  }
219  $node->setLabel(BackendUtility::getRecordTitle($this->tableName, $row) ?: $basicNode->getId());
220  $node->setSelected(‪GeneralUtility::inList($this->‪getSelectedList(), $basicNode->getId()));
221  $node->setExpanded($this->‪isExpanded($basicNode));
222  }
223  $node->setId($basicNode->getId());
224  $node->setSelectable(!‪GeneralUtility::inList($this->‪getNonSelectableLevelList(), (string)$level) && !in_array($basicNode->getId(), $this->getItemUnselectableList()));
225  $node->setSortValue($this->nodeSortValues[$basicNode->getId()] ?? '');
226  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
227  $node->setIcon($iconFactory->getIconForRecord($this->tableName, $row, IconSize::SMALL));
228  $node->setParentNode($parent);
229  if ($basicNode->hasChildNodes()) {
230  $node->setHasChildren(true);
231  $childNodes = GeneralUtility::makeInstance(SortedTreeNodeCollection::class);
232  $tempNodes = [];
233  foreach ($basicNode->getChildNodes() as $child) {
234  $tempNodes[] = $this->‪buildRepresentationForNode($child, $node, $level + 1);
235  }
236  $childNodes->exchangeArray($tempNodes);
237  $childNodes->asort();
238  $node->setChildNodes($childNodes);
239  }
240  return $node;
241  }
242 
246  public function ‪initializeTreeData(): void
247  {
248  parent::initializeTreeData();
249  $this->nodeSortValues = array_flip($this->itemWhiteList);
250  $this->columnConfiguration = ‪$GLOBALS['TCA'][$this->‪getTableName()]['columns'][‪$this->lookupField]['config'] ?? [];
251  if (isset($this->columnConfiguration['foreign_table']) && $this->columnConfiguration['foreign_table'] !== $this->‪getTableName()) {
252  throw new \InvalidArgumentException('TCA Tree configuration is invalid: tree for different node-Tables is not implemented yet', 1290944650);
253  }
254  $this->treeData = GeneralUtility::makeInstance(TreeNode::class);
255  $this->‪loadTreeData();
256  $event = $this->eventDispatcher->dispatch(new ModifyTreeDataEvent($this->treeData, $this));
257  $this->treeData = $event->getTreeData();
258  }
259 
263  protected function ‪loadTreeData(): void
264  {
265  if ($this->‪getStartingPoints()) {
266  $startingPoints = $this->‪getStartingPoints();
267  } else {
268  $startingPoints = [0];
269  }
270 
271  if (count(‪$startingPoints) === 1) {
272  // Only one starting point is available, grab it and set it as root node
273  $startingPoint = current(‪$startingPoints);
274  $this->treeData->setId((string)$startingPoint);
275  $this->treeData->setParentNode(null);
276 
277  if ($this->levelMaximum >= 1) {
278  $childNodes = $this->‪getChildrenOf($this->treeData, 1);
279  if ($childNodes !== null) {
280  $this->treeData->setChildNodes($childNodes);
281  }
282  }
283  } else {
284  // The current tree implementation disallows multiple elements on root level, thus we have to work around
285  // this with a separate TreeNodeCollection that gets attached to the root node with uid 0. This has the
286  // nasty side effect we cannot avoid the root node being rendered.
287 
288  $treeNodeCollection = GeneralUtility::makeInstance(TreeNodeCollection::class);
289  foreach (‪$startingPoints as $startingPoint) {
290  ‪$treeData = GeneralUtility::makeInstance(TreeNode::class);
291  ‪$treeData->‪setId((string)$startingPoint);
292 
293  if ($this->levelMaximum >= 1) {
294  $childNodes = $this->‪getChildrenOf(‪$treeData, 1);
295  if ($childNodes !== null) {
296  ‪$treeData->‪setChildNodes($childNodes);
297  }
298  }
299  $treeNodeCollection->append(‪$treeData);
300  }
301  $this->treeData->setId('0');
302  $this->treeData->setChildNodes($treeNodeCollection);
303  }
304  }
305 
309  protected function ‪getChildrenOf(TreeNode $node, int $level): ?TreeNodeCollection
310  {
311  $nodeData = null;
312  if ($node->getId() !== 0 && $node->getId() !== '0') {
313  if (is_array($this->availableItems[(int)$node->getId()] ?? false)) {
314  // @todo: This is part of the category tree performance hack
315  $nodeData = $this->availableItems[(int)$node->getId()];
316  } else {
317  $nodeData = BackendUtility::getRecord($this->tableName, $node->getId(), '*', '', false);
318  }
319  }
320  if (empty($nodeData)) {
321  $nodeData = [
322  'uid' => 0,
323  $this->lookupField => '',
324  ];
325  }
326  $storage = null;
327  $children = $this->‪getRelatedRecords($nodeData);
328  if (!empty($children)) {
329  $storage = GeneralUtility::makeInstance(TreeNodeCollection::class);
330  foreach ($children as $child) {
331  $node = GeneralUtility::makeInstance(TreeNode::class, $this->availableItems[(int)$child] ?? []);
332  $node->setId($child);
333  if ($level < $this->levelMaximum) {
334  $children = $this->‪getChildrenOf($node, $level + 1);
335  if ($children !== null) {
336  $node->setChildNodes($children);
337  }
338  }
339  $storage->append($node);
340  }
341  }
342  return $storage;
343  }
344 
348  protected function ‪getRelatedRecords(array $row): array
349  {
350  if ($this->‪getLookupMode() === self::MODE_PARENT) {
351  $children = $this->‪getChildrenUidsFromParentRelation($row);
352  } else {
353  $children = $this->‪getChildrenUidsFromChildrenRelation($row);
354  }
355  $allowedArray = [];
356  foreach ($children as $child) {
357  if (!in_array($child, $this->idCache, true) && in_array($child, $this->itemWhiteList, true)) {
358  $allowedArray[] = $child;
359  }
360  }
361  $this->idCache = array_merge($this->idCache, $allowedArray);
362  return $allowedArray;
363  }
364 
368  protected function ‪getChildrenUidsFromParentRelation(array $row): array
369  {
370  ‪$uid = (int)$row['uid'];
371  if (in_array($this->columnConfiguration['type'] ?? '', ['select', 'category', 'inline', 'file'], true)) {
372  if ($this->columnConfiguration['MM'] ?? null) {
373  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
374  // Dummy field for setting "look from other site"
375  $this->columnConfiguration['MM_oppositeField'] = 'children';
376  $dbGroup->start($row[$this->lookupField], $this->‪getTableName(), $this->columnConfiguration['MM'], ‪$uid, $this->‪getTableName(), $this->columnConfiguration);
377  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
378  } elseif ($this->columnConfiguration['foreign_field'] ?? null) {
379  $relatedUids = $this->‪listFieldQuery($this->columnConfiguration['foreign_field'], ‪$uid);
380  } else {
381  // Check available items
382  if ($this->availableItems !== [] && $this->columnConfiguration['type'] === 'category') {
383  // @todo: This is part of the category tree performance hack
384  $relatedUids = [];
385  foreach ($this->availableItems as $item) {
386  if ($item[$this->lookupField] === ‪$uid) {
387  $relatedUids[$item['uid']] = $item['sorting'];
388  }
389  }
390  if ($relatedUids !== []) {
391  // Ensure sorting is kept
392  asort($relatedUids);
393  $relatedUids = array_keys($relatedUids);
394  }
395  } else {
396  $relatedUids = $this->‪listFieldQuery($this->lookupField, ‪$uid);
397  }
398  }
399  } else {
400  $relatedUids = $this->‪listFieldQuery($this->lookupField, ‪$uid);
401  }
402 
403  return $relatedUids;
404  }
405 
409  protected function ‪getChildrenUidsFromChildrenRelation(array $row): array
410  {
411  $relatedUids = [];
412  ‪$uid = (int)$row['uid'];
413  $value = (string)$row[$this->lookupField];
414  switch ((string)$this->columnConfiguration['type']) {
415  case 'inline':
416  case 'file':
417  // Intentional fall-through
418  case 'select':
419  case 'category':
420  if ($this->columnConfiguration['MM'] ?? false) {
421  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
422  $dbGroup->start(
423  $value,
424  $this->‪getTableName(),
425  $this->columnConfiguration['MM'],
426  ‪$uid,
427  $this->‪getTableName(),
428  $this->columnConfiguration
429  );
430  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
431  } elseif ($this->columnConfiguration['foreign_field'] ?? false) {
432  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
433  ->getQueryBuilderForTable($this->‪getTableName());
434  $queryBuilder->getRestrictions()->removeAll();
435  $records = $queryBuilder->select('uid')
436  ->from($this->‪getTableName())
437  ->where(
438  $queryBuilder->expr()->eq(
439  $this->columnConfiguration['foreign_field'],
440  $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)
441  )
442  )
443  ->executeQuery()
444  ->fetchAllAssociative();
445 
446  if (!empty($records)) {
447  $relatedUids = array_column($records, 'uid');
448  }
449  } else {
450  $relatedUids = GeneralUtility::intExplode(',', $value, true);
451  }
452  break;
453  default:
454  $relatedUids = GeneralUtility::intExplode(',', $value, true);
455  }
456  return $relatedUids;
457  }
458 
466  protected function ‪listFieldQuery(string $fieldName, int $queryId): array
467  {
468  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
469  ->getQueryBuilderForTable($this->‪getTableName());
470  $queryBuilder->getRestrictions()->removeAll();
471 
472  $queryBuilder->select('uid')
473  ->from($this->‪getTableName())
474  ->where($queryBuilder->expr()->inSet($fieldName, $queryBuilder->quote($queryId)));
475 
476  if ($queryId === 0) {
477  $queryBuilder->orWhere(
478  $queryBuilder->expr()->comparison(
479  'CAST(' . $queryBuilder->quoteIdentifier($fieldName) . ' AS CHAR)',
481  $queryBuilder->quote('')
482  )
483  );
484  }
485 
486  $records = $queryBuilder->executeQuery()->fetchAllAssociative();
487  return array_column($records, 'uid');
488  }
489 
490  protected function ‪getLanguageService(): ?‪LanguageService
491  {
492  return ‪$GLOBALS['LANG'] ?? null;
493  }
494 }
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$idCache
‪array $idCache
Definition: DatabaseTreeDataProvider.php:65
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$startingPoints
‪array $startingPoints
Definition: DatabaseTreeDataProvider.php:63
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:50
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder
Definition: ExpressionBuilder.php:40
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\$treeData
‪TreeNode $treeData
Definition: AbstractTableConfigurationTreeDataProvider.php:37
‪TYPO3\CMS\Backend\Tree\TreeNode\setChildNodes
‪setChildNodes(TreeNodeCollection $childNodes)
Definition: TreeNode.php:67
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder\EQ
‪const EQ
Definition: ExpressionBuilder.php:41
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromChildrenRelation
‪getChildrenUidsFromChildrenRelation(array $row)
Definition: DatabaseTreeDataProvider.php:408
‪TYPO3\CMS\Core\Database\RelationHandler
Definition: RelationHandler.php:36
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLabelField
‪setLabelField(string $labelField)
Definition: DatabaseTreeDataProvider.php:86
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider
Definition: DatabaseTreeDataProvider.php:39
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_PARENT
‪const MODE_PARENT
Definition: DatabaseTreeDataProvider.php:41
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeNode
Definition: DatabaseTreeNode.php:24
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupField
‪setLookupField(string $lookupField)
Definition: DatabaseTreeDataProvider.php:118
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$columnConfiguration
‪array $columnConfiguration
Definition: DatabaseTreeDataProvider.php:72
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider
Definition: AbstractTableConfigurationTreeDataProvider.php:26
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getSelectedList
‪string getSelectedList()
Definition: AbstractTableConfigurationTreeDataProvider.php:187
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$nodeSortValues
‪array $nodeSortValues
Definition: DatabaseTreeDataProvider.php:79
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Backend\Tree\TreeNode\hasChildNodes
‪bool hasChildNodes()
Definition: TreeNode.php:98
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableWhere
‪getTableWhere()
Definition: DatabaseTreeDataProvider.php:195
‪TYPO3\CMS\Core\Tree\Event\ModifyTreeDataEvent
Definition: ModifyTreeDataEvent.php:27
‪TYPO3\CMS\Backend\Tree\TreeNode\getAdditionalData
‪getAdditionalData()
Definition: TreeNode.php:178
‪TYPO3\CMS\Backend\Tree\TreeNodeCollection
Definition: TreeNodeCollection.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getStartingPoints
‪int[] getStartingPoints()
Definition: DatabaseTreeDataProvider.php:179
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\isExpanded
‪bool isExpanded(TreeNode $node)
Definition: AbstractTableConfigurationTreeDataProvider.php:139
‪TYPO3\CMS\Backend\Tree\TreeNode
Definition: TreeNode.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setStartingPoints
‪setStartingPoints(array $startingPoints)
Definition: DatabaseTreeDataProvider.php:169
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\loadTreeData
‪loadTreeData()
Definition: DatabaseTreeDataProvider.php:262
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupField
‪getLookupField()
Definition: DatabaseTreeDataProvider.php:126
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_CHILDREN
‪const MODE_CHILDREN
Definition: DatabaseTreeDataProvider.php:40
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableName
‪string $tableName
Definition: DatabaseTreeDataProvider.php:43
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableWhere
‪string $tableWhere
Definition: DatabaseTreeDataProvider.php:51
‪TYPO3\CMS\Core\Tree\TableConfiguration
Definition: AbstractTableConfigurationTreeDataProvider.php:16
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRoot
‪getRoot()
Definition: DatabaseTreeDataProvider.php:159
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableName
‪setTableName(string $tableName)
Definition: DatabaseTreeDataProvider.php:102
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\listFieldQuery
‪int[] listFieldQuery(string $fieldName, int $queryId)
Definition: DatabaseTreeDataProvider.php:465
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$treeId
‪string $treeId
Definition: DatabaseTreeDataProvider.php:47
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLanguageService
‪getLanguageService()
Definition: DatabaseTreeDataProvider.php:489
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getNonSelectableLevelList
‪string getNonSelectableLevelList()
Definition: AbstractTableConfigurationTreeDataProvider.php:207
‪TYPO3\CMS\Backend\Tree\TreeNode\getId
‪string int getId()
Definition: TreeNode.php:121
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupMode
‪setLookupMode(int $lookupMode)
Definition: DatabaseTreeDataProvider.php:136
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLabelField
‪getLabelField()
Definition: DatabaseTreeDataProvider.php:94
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupMode
‪self::MODE_ * getLookupMode()
Definition: DatabaseTreeDataProvider.php:146
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$lookupMode
‪int $lookupMode
Definition: DatabaseTreeDataProvider.php:56
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\initializeTreeData
‪initializeTreeData()
Definition: DatabaseTreeDataProvider.php:245
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:39
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\buildRepresentationForNode
‪buildRepresentationForNode(TreeNode $basicNode, ?DatabaseTreeNode $parent=null, $level=0)
Definition: DatabaseTreeDataProvider.php:203
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableName
‪getTableName()
Definition: DatabaseTreeDataProvider.php:110
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$lookupField
‪string $lookupField
Definition: DatabaseTreeDataProvider.php:58
‪TYPO3\CMS\Core\Utility\GeneralUtility\inList
‪static bool inList($list, $item)
Definition: GeneralUtility.php:421
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$labelField
‪string $labelField
Definition: DatabaseTreeDataProvider.php:49
‪TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection
Definition: SortedTreeNodeCollection.php:25
‪TYPO3\CMS\Backend\Tree\TreeNode\getChildNodes
‪TreeNodeCollection getChildNodes()
Definition: TreeNode.php:88
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\__construct
‪__construct(protected EventDispatcherInterface $eventDispatcher)
Definition: DatabaseTreeDataProvider.php:81
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:48
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenOf
‪getChildrenOf(TreeNode $node, int $level)
Definition: DatabaseTreeDataProvider.php:308
‪TYPO3\CMS\Backend\Tree\TreeNode\setId
‪setId($id)
Definition: TreeNode.php:111
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableWhere
‪setTableWhere(string $tableWhere)
Definition: DatabaseTreeDataProvider.php:187
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromParentRelation
‪getChildrenUidsFromParentRelation(array $row)
Definition: DatabaseTreeDataProvider.php:367
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRelatedRecords
‪getRelatedRecords(array $row)
Definition: DatabaseTreeDataProvider.php:347
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getNodes
‪getNodes(TreeNode $node)
Definition: DatabaseTreeDataProvider.php:154