‪TYPO3CMS  10.4
DatabaseTreeDataProvider.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 
18 use Psr\EventDispatcher\EventDispatcherInterface;
31 
36 {
40  const ‪SIGNAL_PostProcessTreeData = 'PostProcessTreeData';
41  const ‪MODE_CHILDREN = 1;
42  const ‪MODE_PARENT = 2;
43 
47  protected ‪$tableName = '';
48 
52  protected ‪$treeId = '';
53 
57  protected ‪$labelField = '';
58 
62  protected ‪$tableWhere = '';
63 
68 
72  protected ‪$lookupField = '';
73 
77  protected ‪$rootUid = 0;
78 
82  protected ‪$idCache = [];
83 
89  protected ‪$columnConfiguration;
90 
96  protected ‪$nodeSortValues = [];
97 
101  protected ‪$generatedTSConfig = [];
102 
107 
108  public function ‪__construct(EventDispatcherInterface ‪$eventDispatcher)
109  {
110  $this->eventDispatcher = ‪$eventDispatcher;
111  }
112 
118  public function ‪setLabelField(‪$labelField)
119  {
120  $this->labelField = ‪$labelField;
121  }
122 
128  public function ‪getLabelField()
129  {
130  return ‪$this->labelField;
131  }
132 
138  public function ‪setTableName(‪$tableName)
139  {
140  $this->tableName = ‪$tableName;
141  }
142 
148  public function ‪getTableName()
149  {
150  return ‪$this->tableName;
151  }
152 
158  public function ‪setLookupField(‪$lookupField)
159  {
160  $this->lookupField = ‪$lookupField;
161  }
162 
168  public function ‪getLookupField()
169  {
170  return ‪$this->lookupField;
171  }
172 
178  public function ‪setLookupMode(‪$lookupMode)
179  {
180  $this->lookupMode = ‪$lookupMode;
181  }
182 
188  public function ‪getLookupMode()
189  {
190  return ‪$this->lookupMode;
191  }
192 
198  public function ‪getNodes(TreeNode $node)
199  {
200  }
201 
207  public function ‪getRoot()
208  {
209  return $this->‪buildRepresentationForNode($this->treeData);
210  }
211 
217  public function ‪setRootUid(‪$rootUid)
218  {
219  $this->rootUid = ‪$rootUid;
220  }
221 
227  public function ‪getRootUid()
228  {
229  return ‪$this->rootUid;
230  }
231 
237  public function ‪setTableWhere(‪$tableWhere)
238  {
239  $this->tableWhere = ‪$tableWhere;
240  }
241 
247  public function ‪getTableWhere()
248  {
249  return ‪$this->tableWhere;
250  }
251 
260  protected function ‪buildRepresentationForNode(‪TreeNode $basicNode, ‪DatabaseTreeNode $parent = null, $level = 0)
261  {
263  $node = GeneralUtility::makeInstance(DatabaseTreeNode::class);
264  $row = [];
265  if ($basicNode->‪getId() == 0) {
266  $node->setSelected(false);
267  $node->setExpanded(true);
268  $node->setLabel($this->‪getLanguageService()->sL(‪$GLOBALS['TCA'][$this->tableName]['ctrl']['title']));
269  } else {
270  $row = ‪BackendUtility::getRecordWSOL($this->tableName, (int)$basicNode->‪getId(), '*', '', false);
271  $node->setLabel(‪BackendUtility::getRecordTitle($this->tableName, $row) ?: $basicNode->‪getId());
272  $node->setSelected(GeneralUtility::inList($this->‪getSelectedList(), $basicNode->‪getId()));
273  $node->setExpanded($this->‪isExpanded($basicNode));
274  }
275  $node->setId($basicNode->‪getId());
276  $node->setSelectable(!GeneralUtility::inList($this->‪getNonSelectableLevelList(), (string)$level) && !in_array($basicNode->‪getId(), $this->getItemUnselectableList()));
277  $node->setSortValue($this->nodeSortValues[$basicNode->‪getId()]);
278  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
279  $node->setIcon($iconFactory->getIconForRecord($this->tableName, $row, ‪Icon::SIZE_SMALL));
280  $node->setParentNode($parent);
281  if ($basicNode->‪hasChildNodes()) {
282  $node->setHasChildren(true);
284  $childNodes = GeneralUtility::makeInstance(SortedTreeNodeCollection::class);
285  $tempNodes = [];
286  foreach ($basicNode->‪getChildNodes() as $child) {
287  $tempNodes[] = $this->‪buildRepresentationForNode($child, $node, $level + 1);
288  }
289  $childNodes->exchangeArray($tempNodes);
290  $childNodes->asort();
291  $node->setChildNodes($childNodes);
292  }
293  return $node;
294  }
295 
299  public function ‪initializeTreeData()
300  {
301  parent::initializeTreeData();
302  $this->nodeSortValues = array_flip($this->itemWhiteList);
303  $this->columnConfiguration = ‪$GLOBALS['TCA'][$this->‪getTableName()]['columns'][$this->‪getLookupField()]['config'];
304  if (isset($this->columnConfiguration['foreign_table']) && $this->columnConfiguration['foreign_table'] != $this->‪getTableName()) {
305  throw new \InvalidArgumentException('TCA Tree configuration is invalid: tree for different node-Tables is not implemented yet', 1290944650);
306  }
307  $this->treeData = GeneralUtility::makeInstance(TreeNode::class);
308  $this->‪loadTreeData();
310  $event = $this->eventDispatcher->dispatch(new ‪ModifyTreeDataEvent($this->treeData, $this));
311  $this->treeData = $event->getTreeData();
312  }
313 
317  protected function ‪loadTreeData()
318  {
319  $this->treeData->setId($this->‪getRootUid());
320  $this->treeData->setParentNode(null);
321  if ($this->levelMaximum >= 1) {
322  $childNodes = $this->‪getChildrenOf($this->treeData, 1);
323  if ($childNodes !== null) {
324  $this->treeData->setChildNodes($childNodes);
325  }
326  }
327  }
328 
336  protected function ‪getChildrenOf(TreeNode $node, $level)
337  {
338  $nodeData = null;
339  if ($node->getId() !== 0) {
340  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
341  ->getQueryBuilderForTable($this->‪getTableName());
342  $queryBuilder->getRestrictions()->removeAll();
343  $nodeData = $queryBuilder->select('*')
344  ->from($this->‪getTableName())
345  ->where(
346  $queryBuilder->expr()->eq(
347  'uid',
348  $queryBuilder->createNamedParameter($node->getId(), \PDO::PARAM_INT)
349  )
350  )
351  ->setMaxResults(1)
352  ->execute()
353  ->fetch();
354  }
355  if (empty($nodeData)) {
356  $nodeData = [
357  'uid' => 0,
358  $this->‪getLookupField() => ''
359  ];
360  }
361  $storage = null;
362  $children = $this->‪getRelatedRecords($nodeData);
363  if (!empty($children)) {
365  $storage = GeneralUtility::makeInstance(TreeNodeCollection::class);
366  foreach ($children as $child) {
367  $node = GeneralUtility::makeInstance(TreeNode::class);
368  $node->setId($child);
369  if ($level < $this->levelMaximum) {
370  $children = $this->‪getChildrenOf($node, $level + 1);
371  if ($children !== null) {
372  $node->setChildNodes($children);
373  }
374  }
375  $storage->append($node);
376  }
377  }
378  return $storage;
379  }
380 
387  protected function ‪getRelatedRecords(array $row)
388  {
389  if ($this->‪getLookupMode() == self::MODE_PARENT) {
390  $children = $this->‪getChildrenUidsFromParentRelation($row);
391  } else {
392  $children = $this->‪getChildrenUidsFromChildrenRelation($row);
393  }
394  $allowedArray = [];
395  foreach ($children as $child) {
396  if (!in_array($child, $this->idCache) && in_array($child, $this->itemWhiteList)) {
397  $allowedArray[] = $child;
398  }
399  }
400  $this->idCache = array_merge($this->idCache, $allowedArray);
401  return $allowedArray;
402  }
403 
410  protected function ‪getChildrenUidsFromParentRelation(array $row)
411  {
412  $uid = $row['uid'];
413  switch ((string)$this->columnConfiguration['type']) {
414  case 'inline':
415 
416  case 'select':
417  if ($this->columnConfiguration['MM']) {
419  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
420  // Dummy field for setting "look from other site"
421  $this->columnConfiguration['MM_oppositeField'] = 'children';
422  $dbGroup->start($row[$this->‪getLookupField()], $this->‪getTableName(), $this->columnConfiguration['MM'], $uid, $this->‪getTableName(), $this->columnConfiguration);
423  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
424  } elseif ($this->columnConfiguration['foreign_field']) {
425  $relatedUids = $this->‪listFieldQuery($this->columnConfiguration['foreign_field'], $uid);
426  } else {
427  $relatedUids = $this->‪listFieldQuery($this->‪getLookupField(), $uid);
428  }
429  break;
430  default:
431  $relatedUids = $this->‪listFieldQuery($this->‪getLookupField(), $uid);
432  }
433  return $relatedUids;
434  }
435 
442  protected function ‪getChildrenUidsFromChildrenRelation(array $row)
443  {
444  $relatedUids = [];
445  $uid = $row['uid'];
446  $value = $row[$this->‪getLookupField()];
447  switch ((string)$this->columnConfiguration['type']) {
448  case 'inline':
449  // Intentional fall-through
450  case 'select':
451  if ($this->columnConfiguration['MM']) {
452  $dbGroup = GeneralUtility::makeInstance(RelationHandler::class);
453  $dbGroup->start(
454  $value,
455  $this->‪getTableName(),
456  $this->columnConfiguration['MM'],
457  $uid,
458  $this->‪getTableName(),
459  $this->columnConfiguration
460  );
461  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
462  } elseif ($this->columnConfiguration['foreign_field']) {
463  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
464  ->getQueryBuilderForTable($this->‪getTableName());
465  $queryBuilder->getRestrictions()->removeAll();
466  $records = $queryBuilder->select('uid')
467  ->from($this->‪getTableName())
468  ->where(
469  $queryBuilder->expr()->eq(
470  $this->columnConfiguration['foreign_field'],
471  $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)
472  )
473  )
474  ->execute()
475  ->fetchAll();
476 
477  if (!empty($records)) {
478  $relatedUids = array_column($records, 'uid');
479  }
480  } else {
481  $relatedUids = ‪GeneralUtility::intExplode(',', $value, true);
482  }
483  break;
484  default:
485  $relatedUids = ‪GeneralUtility::intExplode(',', $value, true);
486  }
487  return $relatedUids;
488  }
489 
497  protected function ‪listFieldQuery($fieldName, $queryId)
498  {
499  $queryId = (int)$queryId;
500  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
501  ->getQueryBuilderForTable($this->‪getTableName());
502  $queryBuilder->getRestrictions()->removeAll();
503 
504  $queryBuilder->select('uid')
505  ->from($this->‪getTableName())
506  ->where($queryBuilder->expr()->inSet($fieldName, $queryBuilder->quote($queryId)));
507 
508  if ($queryId === 0) {
509  $queryBuilder->orWhere(
510  $queryBuilder->expr()->comparison(
511  'CAST(' . $queryBuilder->quoteIdentifier($fieldName) . ' AS CHAR)',
513  $queryBuilder->quote('')
514  )
515  );
516  }
517 
518  $records = $queryBuilder->execute()->fetchAll();
519  $uidArray = is_array($records) ? array_column($records, 'uid') : [];
520 
521  return $uidArray;
522  }
523 
527  protected function ‪getLanguageService(): ?LanguageService
528  {
529  return ‪$GLOBALS['LANG'] ?? null;
530  }
531 }
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\__construct
‪__construct(EventDispatcherInterface $eventDispatcher)
Definition: DatabaseTreeDataProvider.php:96
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$idCache
‪array $idCache
Definition: DatabaseTreeDataProvider.php:74
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLabelField
‪setLabelField($labelField)
Definition: DatabaseTreeDataProvider.php:106
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder
Definition: ExpressionBuilder.php:35
‪TYPO3\CMS\Backend\Tree\TreeNode\setChildNodes
‪setChildNodes(TreeNodeCollection $childNodes)
Definition: TreeNode.php:64
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder\EQ
‪const EQ
Definition: ExpressionBuilder.php:36
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Core\Database\RelationHandler
Definition: RelationHandler.php:35
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider
Definition: DatabaseTreeDataProvider.php:36
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_PARENT
‪const MODE_PARENT
Definition: DatabaseTreeDataProvider.php:42
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\listFieldQuery
‪int[] listFieldQuery($fieldName, $queryId)
Definition: DatabaseTreeDataProvider.php:485
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableWhere
‪string getTableWhere()
Definition: DatabaseTreeDataProvider.php:235
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeNode
Definition: DatabaseTreeNode.php:24
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$columnConfiguration
‪array $columnConfiguration
Definition: DatabaseTreeDataProvider.php:80
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider
Definition: AbstractTableConfigurationTreeDataProvider.php:26
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getSelectedList
‪string getSelectedList()
Definition: AbstractTableConfigurationTreeDataProvider.php:181
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$eventDispatcher
‪EventDispatcherInterface $eventDispatcher
Definition: DatabaseTreeDataProvider.php:94
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$nodeSortValues
‪array $nodeSortValues
Definition: DatabaseTreeDataProvider.php:86
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:33
‪TYPO3\CMS\Backend\Tree\TreeNode\hasChildNodes
‪bool hasChildNodes()
Definition: TreeNode.php:95
‪TYPO3\CMS\Core\Tree\Event\ModifyTreeDataEvent
Definition: ModifyTreeDataEvent.php:27
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupMode
‪setLookupMode($lookupMode)
Definition: DatabaseTreeDataProvider.php:166
‪TYPO3\CMS\Backend\Tree\TreeNodeCollection
Definition: TreeNodeCollection.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableWhere
‪setTableWhere($tableWhere)
Definition: DatabaseTreeDataProvider.php:225
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRootUid
‪int getRootUid()
Definition: DatabaseTreeDataProvider.php:215
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\isExpanded
‪bool isExpanded(TreeNode $node)
Definition: AbstractTableConfigurationTreeDataProvider.php:133
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLabelField
‪string getLabelField()
Definition: DatabaseTreeDataProvider.php:116
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRelatedRecords
‪array getRelatedRecords(array $row)
Definition: DatabaseTreeDataProvider.php:375
‪TYPO3\CMS\Backend\Tree\TreeNode
Definition: TreeNode.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\buildRepresentationForNode
‪TYPO3 CMS Core Tree TableConfiguration DatabaseTreeNode buildRepresentationForNode(TreeNode $basicNode, DatabaseTreeNode $parent=null, $level=0)
Definition: DatabaseTreeDataProvider.php:248
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\loadTreeData
‪loadTreeData()
Definition: DatabaseTreeDataProvider.php:305
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_CHILDREN
‪const MODE_CHILDREN
Definition: DatabaseTreeDataProvider.php:41
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableName
‪string $tableName
Definition: DatabaseTreeDataProvider.php:46
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLanguageService
‪LanguageService null getLanguageService()
Definition: DatabaseTreeDataProvider.php:515
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableWhere
‪string $tableWhere
Definition: DatabaseTreeDataProvider.php:58
‪TYPO3\CMS\Core\Tree\TableConfiguration
Definition: AbstractTableConfigurationTreeDataProvider.php:16
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1541
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupField
‪string getLookupField()
Definition: DatabaseTreeDataProvider.php:156
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\SIGNAL_PostProcessTreeData
‪const SIGNAL_PostProcessTreeData
Definition: DatabaseTreeDataProvider.php:40
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$treeId
‪string $treeId
Definition: DatabaseTreeDataProvider.php:50
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getNonSelectableLevelList
‪string getNonSelectableLevelList()
Definition: AbstractTableConfigurationTreeDataProvider.php:201
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:75
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordWSOL
‪static array getRecordWSOL( $table, $uid, $fields=' *', $where='', $useDeleteClause=true, $unsetMovePointers=false)
Definition: BackendUtility.php:139
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setRootUid
‪setRootUid($rootUid)
Definition: DatabaseTreeDataProvider.php:205
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$lookupMode
‪int $lookupMode
Definition: DatabaseTreeDataProvider.php:62
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\initializeTreeData
‪initializeTreeData()
Definition: DatabaseTreeDataProvider.php:287
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupField
‪setLookupField($lookupField)
Definition: DatabaseTreeDataProvider.php:146
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$lookupField
‪string $lookupField
Definition: DatabaseTreeDataProvider.php:66
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableName
‪setTableName($tableName)
Definition: DatabaseTreeDataProvider.php:126
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static int[] intExplode($delimiter, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:988
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableName
‪string getTableName()
Definition: DatabaseTreeDataProvider.php:136
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$labelField
‪string $labelField
Definition: DatabaseTreeDataProvider.php:54
‪TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection
Definition: SortedTreeNodeCollection.php:25
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$generatedTSConfig
‪array $generatedTSConfig
Definition: DatabaseTreeDataProvider.php:90
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenOf
‪TYPO3 CMS Backend Tree TreeNodeCollection null getChildrenOf(TreeNode $node, $level)
Definition: DatabaseTreeDataProvider.php:324
‪TYPO3\CMS\Backend\Tree\TreeNode\setId
‪setId($id)
Definition: TreeNode.php:108
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Backend\Tree\TreeNode\getId
‪string getId()
Definition: TreeNode.php:118
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRoot
‪TYPO3 CMS Core Tree TableConfiguration DatabaseTreeNode getRoot()
Definition: DatabaseTreeDataProvider.php:195
‪TYPO3\CMS\Backend\Tree\TreeNode\getChildNodes
‪TYPO3 CMS Backend Tree TreeNodeCollection getChildNodes()
Definition: TreeNode.php:85
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupMode
‪int getLookupMode()
Definition: DatabaseTreeDataProvider.php:176
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromChildrenRelation
‪array getChildrenUidsFromChildrenRelation(array $row)
Definition: DatabaseTreeDataProvider.php:430
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$rootUid
‪int $rootUid
Definition: DatabaseTreeDataProvider.php:70
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromParentRelation
‪array getChildrenUidsFromParentRelation(array $row)
Definition: DatabaseTreeDataProvider.php:398
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getNodes
‪getNodes(TreeNode $node)
Definition: DatabaseTreeDataProvider.php:186