‪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->setLabel($this->‪getLanguageService()?->sL(‪$GLOBALS['TCA'][$this->tableName]['ctrl']['title']));
211  } else {
212  if ($basicNode->getAdditionalData() === []) {
213  $row = BackendUtility::getRecordWSOL($this->tableName, (int)$basicNode->getId(), '*', '', false) ?? [];
214  } else {
215  // @todo: This is part of the category tree performance hack
216  $row = $basicNode->getAdditionalData();
217  }
218  $node->setLabel(BackendUtility::getRecordTitle($this->tableName, $row) ?: $basicNode->getId());
219  $node->setSelected(‪GeneralUtility::inList($this->‪getSelectedList(), $basicNode->getId()));
220  }
221  $node->setId($basicNode->getId());
222  $node->setSelectable(!‪GeneralUtility::inList($this->‪getNonSelectableLevelList(), (string)$level) && !in_array($basicNode->getId(), $this->getItemUnselectableList()));
223  $node->setSortValue($this->nodeSortValues[$basicNode->getId()] ?? '');
224  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
225  $node->setIcon($iconFactory->getIconForRecord($this->tableName, $row, IconSize::SMALL));
226  $node->setParentNode($parent);
227  if ($basicNode->hasChildNodes()) {
228  $node->setHasChildren(true);
229  $childNodes = GeneralUtility::makeInstance(SortedTreeNodeCollection::class);
230  $tempNodes = [];
231  foreach ($basicNode->getChildNodes() as $child) {
232  $tempNodes[] = $this->‪buildRepresentationForNode($child, $node, $level + 1);
233  }
234  $childNodes->exchangeArray($tempNodes);
235  $childNodes->asort();
236  $node->setChildNodes($childNodes);
237  }
238  return $node;
239  }
240 
244  public function ‪initializeTreeData(): void
245  {
246  $this->nodeSortValues = array_flip($this->itemWhiteList);
247  $this->columnConfiguration = ‪$GLOBALS['TCA'][$this->‪getTableName()]['columns'][‪$this->lookupField]['config'] ?? [];
248  if (isset($this->columnConfiguration['foreign_table']) && $this->columnConfiguration['foreign_table'] !== $this->‪getTableName()) {
249  throw new \InvalidArgumentException('TCA Tree configuration is invalid: tree for different node-Tables is not implemented yet', 1290944650);
250  }
251  $this->treeData = GeneralUtility::makeInstance(TreeNode::class);
252  $this->‪loadTreeData();
253  $event = $this->eventDispatcher->dispatch(new ModifyTreeDataEvent($this->treeData, $this));
254  $this->treeData = $event->getTreeData();
255  }
256 
260  protected function ‪loadTreeData(): void
261  {
262  if ($this->‪getStartingPoints()) {
263  $startingPoints = $this->‪getStartingPoints();
264  } else {
265  $startingPoints = [0];
266  }
267 
268  if (count(‪$startingPoints) === 1) {
269  // Only one starting point is available, grab it and set it as root node
270  $startingPoint = current(‪$startingPoints);
271  $this->treeData->setId((string)$startingPoint);
272  $this->treeData->setParentNode(null);
273 
274  if ($this->levelMaximum >= 1) {
275  $childNodes = $this->‪getChildrenOf($this->treeData, 1);
276  if ($childNodes !== null) {
277  $this->treeData->setChildNodes($childNodes);
278  }
279  }
280  } else {
281  // The current tree implementation disallows multiple elements on root level, thus we have to work around
282  // this with a separate TreeNodeCollection that gets attached to the root node with uid 0. This has the
283  // nasty side effect we cannot avoid the root node being rendered.
284 
285  $treeNodeCollection = GeneralUtility::makeInstance(TreeNodeCollection::class);
286  foreach (‪$startingPoints as $startingPoint) {
287  ‪$treeData = GeneralUtility::makeInstance(TreeNode::class);
288  ‪$treeData->‪setId((string)$startingPoint);
289 
290  if ($this->levelMaximum >= 1) {
291  $childNodes = $this->‪getChildrenOf(‪$treeData, 1);
292  if ($childNodes !== null) {
293  ‪$treeData->‪setChildNodes($childNodes);
294  }
295  }
296  $treeNodeCollection->append(‪$treeData);
297  }
298  $this->treeData->setId('0');
299  $this->treeData->setChildNodes($treeNodeCollection);
300  }
301  }
302 
306  protected function ‪getChildrenOf(TreeNode $node, int $level): ?TreeNodeCollection
307  {
308  $nodeData = null;
309  if ($node->getId() !== 0 && $node->getId() !== '0') {
310  if (is_array($this->availableItems[(int)$node->getId()] ?? false)) {
311  // @todo: This is part of the category tree performance hack
312  $nodeData = $this->availableItems[(int)$node->getId()];
313  } else {
314  $nodeData = BackendUtility::getRecord($this->tableName, $node->getId(), '*', '', false);
315  }
316  }
317  if (empty($nodeData)) {
318  $nodeData = [
319  'uid' => 0,
320  $this->lookupField => '',
321  ];
322  }
323  $storage = null;
324  $children = $this->‪getRelatedRecords($nodeData);
325  if (!empty($children)) {
326  $storage = GeneralUtility::makeInstance(TreeNodeCollection::class);
327  foreach ($children as $child) {
328  $node = GeneralUtility::makeInstance(TreeNode::class, $this->availableItems[(int)$child] ?? []);
329  $node->setId($child);
330  if ($level < $this->levelMaximum) {
331  $children = $this->‪getChildrenOf($node, $level + 1);
332  if ($children !== null) {
333  $node->setChildNodes($children);
334  }
335  }
336  $storage->append($node);
337  }
338  }
339  return $storage;
340  }
341 
345  protected function ‪getRelatedRecords(array $row): array
346  {
347  if ($this->‪getLookupMode() === self::MODE_PARENT) {
348  $children = $this->‪getChildrenUidsFromParentRelation($row);
349  } else {
350  $children = $this->‪getChildrenUidsFromChildrenRelation($row);
351  }
352  $allowedArray = [];
353  foreach ($children as $child) {
354  if (!in_array($child, $this->idCache, true) && in_array($child, $this->itemWhiteList, true)) {
355  $allowedArray[] = $child;
356  }
357  }
358  $this->idCache = array_merge($this->idCache, $allowedArray);
359  return $allowedArray;
360  }
361 
365  protected function ‪getChildrenUidsFromParentRelation(array $row): array
366  {
367  ‪$uid = (int)$row['uid'];
368  if (in_array($this->columnConfiguration['type'] ?? '', ['select', 'category', 'inline', 'file'], true)) {
369  if ($this->columnConfiguration['MM'] ?? null) {
370  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
371  // Dummy field for setting "look from other site"
372  $this->columnConfiguration['MM_oppositeField'] = 'children';
373  $dbGroup->start($row[$this->lookupField], $this->‪getTableName(), $this->columnConfiguration['MM'], ‪$uid, $this->‪getTableName(), $this->columnConfiguration);
374  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
375  } elseif ($this->columnConfiguration['foreign_field'] ?? null) {
376  $relatedUids = $this->‪listFieldQuery($this->columnConfiguration['foreign_field'], ‪$uid);
377  } else {
378  // Check available items
379  if ($this->availableItems !== [] && $this->columnConfiguration['type'] === 'category') {
380  // @todo: This is part of the category tree performance hack
381  $relatedUids = [];
382  foreach ($this->availableItems as $item) {
383  if ($item[$this->lookupField] === ‪$uid) {
384  $relatedUids[$item['uid']] = $item['sorting'];
385  }
386  }
387  if ($relatedUids !== []) {
388  // Ensure sorting is kept
389  asort($relatedUids);
390  $relatedUids = array_keys($relatedUids);
391  }
392  } else {
393  $relatedUids = $this->‪listFieldQuery($this->lookupField, ‪$uid);
394  }
395  }
396  } else {
397  $relatedUids = $this->‪listFieldQuery($this->lookupField, ‪$uid);
398  }
399 
400  return $relatedUids;
401  }
402 
406  protected function ‪getChildrenUidsFromChildrenRelation(array $row): array
407  {
408  $relatedUids = [];
409  ‪$uid = (int)$row['uid'];
410  $value = (string)$row[$this->lookupField];
411  switch ((string)$this->columnConfiguration['type']) {
412  case 'inline':
413  case 'file':
414  // Intentional fall-through
415  case 'select':
416  case 'category':
417  if ($this->columnConfiguration['MM'] ?? false) {
418  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
419  $dbGroup->start(
420  $value,
421  $this->‪getTableName(),
422  $this->columnConfiguration['MM'],
423  ‪$uid,
424  $this->‪getTableName(),
425  $this->columnConfiguration
426  );
427  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
428  } elseif ($this->columnConfiguration['foreign_field'] ?? false) {
429  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
430  ->getQueryBuilderForTable($this->‪getTableName());
431  $queryBuilder->getRestrictions()->removeAll();
432  $records = $queryBuilder->select('uid')
433  ->from($this->‪getTableName())
434  ->where(
435  $queryBuilder->expr()->eq(
436  $this->columnConfiguration['foreign_field'],
437  $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)
438  )
439  )
440  ->executeQuery()
441  ->fetchAllAssociative();
442 
443  if (!empty($records)) {
444  $relatedUids = array_column($records, 'uid');
445  }
446  } else {
447  $relatedUids = ‪GeneralUtility::intExplode(',', $value, true);
448  }
449  break;
450  default:
451  $relatedUids = ‪GeneralUtility::intExplode(',', $value, true);
452  }
453  return $relatedUids;
454  }
455 
463  protected function ‪listFieldQuery(string $fieldName, int $queryId): array
464  {
465  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
466  ->getQueryBuilderForTable($this->‪getTableName());
467  $queryBuilder->getRestrictions()->removeAll();
468 
469  $queryBuilder->select('uid')
470  ->from($this->‪getTableName())
471  ->where($queryBuilder->expr()->inSet($fieldName, $queryBuilder->quote((string)$queryId)));
472 
473  if ($queryId === 0) {
474  $queryBuilder->orWhere(
475  $queryBuilder->expr()->comparison(
476  'CAST(' . $queryBuilder->quoteIdentifier($fieldName) . ' AS CHAR)',
477  ExpressionBuilder::EQ,
478  $queryBuilder->quote('')
479  )
480  );
481  }
482 
483  $records = $queryBuilder->executeQuery()->fetchAllAssociative();
484  return array_column($records, 'uid');
485  }
486 
487  protected function ‪getLanguageService(): ?‪LanguageService
488  {
489  return ‪$GLOBALS['LANG'] ?? null;
490  }
491 }
‪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:52
‪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\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromChildrenRelation
‪getChildrenUidsFromChildrenRelation(array $row)
Definition: DatabaseTreeDataProvider.php:405
‪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:164
‪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\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:259
‪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:462
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$treeId
‪string $treeId
Definition: DatabaseTreeDataProvider.php:47
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLanguageService
‪getLanguageService()
Definition: DatabaseTreeDataProvider.php:486
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getNonSelectableLevelList
‪string getNonSelectableLevelList()
Definition: AbstractTableConfigurationTreeDataProvider.php:184
‪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:243
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪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:422
‪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:46
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenOf
‪getChildrenOf(TreeNode $node, int $level)
Definition: DatabaseTreeDataProvider.php:305
‪TYPO3\CMS\Backend\Tree\TreeNode\setId
‪setId($id)
Definition: TreeNode.php:111
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableWhere
‪setTableWhere(string $tableWhere)
Definition: DatabaseTreeDataProvider.php:187
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static list< int > intExplode(string $delimiter, string $string, bool $removeEmptyValues=false)
Definition: GeneralUtility.php:756
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromParentRelation
‪getChildrenUidsFromParentRelation(array $row)
Definition: DatabaseTreeDataProvider.php:364
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRelatedRecords
‪getRelatedRecords(array $row)
Definition: DatabaseTreeDataProvider.php:344
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getNodes
‪getNodes(TreeNode $node)
Definition: DatabaseTreeDataProvider.php:154