‪TYPO3CMS  9.5
DatabaseTreeDataProvider.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
25 
30 {
31  const ‪SIGNAL_PostProcessTreeData = 'PostProcessTreeData';
32  const ‪MODE_CHILDREN = 1;
33  const ‪MODE_PARENT = 2;
34 
38  protected ‪$tableName = '';
39 
43  protected ‪$treeId = '';
44 
48  protected ‪$labelField = '';
49 
53  protected ‪$tableWhere = '';
54 
59 
63  protected ‪$lookupField = '';
64 
68  protected ‪$rootUid = 0;
69 
73  protected ‪$idCache = [];
74 
80  protected ‪$columnConfiguration;
81 
87  protected ‪$nodeSortValues = [];
88 
92  protected ‪$generatedTSConfig = [];
93 
97  protected ‪$signalSlotDispatcher;
98 
104  public function ‪setLabelField(‪$labelField)
105  {
106  $this->labelField = ‪$labelField;
107  }
108 
114  public function ‪getLabelField()
115  {
116  return ‪$this->labelField;
117  }
118 
124  public function ‪setTableName(‪$tableName)
125  {
126  $this->tableName = ‪$tableName;
127  }
128 
134  public function ‪getTableName()
135  {
136  return ‪$this->tableName;
137  }
138 
144  public function ‪setLookupField(‪$lookupField)
145  {
146  $this->lookupField = ‪$lookupField;
147  }
148 
154  public function ‪getLookupField()
155  {
156  return ‪$this->lookupField;
157  }
158 
164  public function ‪setLookupMode(‪$lookupMode)
165  {
166  $this->lookupMode = ‪$lookupMode;
167  }
168 
174  public function ‪getLookupMode()
175  {
176  return ‪$this->lookupMode;
177  }
178 
184  public function ‪getNodes(\‪TYPO3\CMS\Backend\Tree\TreeNode $node)
185  {
186  }
187 
193  public function ‪getRoot()
194  {
195  return $this->‪buildRepresentationForNode($this->treeData);
196  }
197 
203  public function ‪setRootUid(‪$rootUid)
204  {
205  $this->rootUid = ‪$rootUid;
206  }
207 
213  public function ‪getRootUid()
214  {
215  return ‪$this->rootUid;
216  }
217 
223  public function ‪setTableWhere(‪$tableWhere)
224  {
225  $this->tableWhere = ‪$tableWhere;
226  }
227 
233  public function ‪getTableWhere()
234  {
235  return ‪$this->tableWhere;
236  }
237 
246  protected function ‪buildRepresentationForNode(\‪TYPO3\CMS\Backend\Tree\TreeNode $basicNode, ‪DatabaseTreeNode $parent = null, $level = 0)
247  {
249  $node = GeneralUtility::makeInstance(\‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeNode::class);
250  $row = [];
251  if ($basicNode->getId() == 0) {
252  $node->setSelected(false);
253  $node->setExpanded(true);
254  $node->setLabel(‪$GLOBALS['LANG']->sL(‪$GLOBALS['TCA'][$this->tableName]['ctrl']['title']));
255  } else {
256  $row = ‪BackendUtility::getRecordWSOL($this->tableName, $basicNode->getId(), '*', '', false);
257  $node->setLabel(‪BackendUtility::getRecordTitle($this->tableName, $row) ?: $basicNode->getId());
258  $node->setSelected(GeneralUtility::inList($this->‪getSelectedList(), $basicNode->getId()));
259  $node->setExpanded($this->‪isExpanded($basicNode));
260  }
261  $node->setId($basicNode->getId());
262  $node->setSelectable(!GeneralUtility::inList($this->‪getNonSelectableLevelList(), $level) && !in_array($basicNode->getId(), $this->getItemUnselectableList()));
263  $node->setSortValue($this->nodeSortValues[$basicNode->getId()]);
264  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
265  $node->setIcon($iconFactory->getIconForRecord($this->tableName, $row, ‪Icon::SIZE_SMALL));
266  $node->setParentNode($parent);
267  if ($basicNode->hasChildNodes()) {
268  $node->setHasChildren(true);
270  $childNodes = GeneralUtility::makeInstance(\‪TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection::class);
271  $tempNodes = [];
272  foreach ($basicNode->getChildNodes() as $child) {
273  $tempNodes[] = $this->‪buildRepresentationForNode($child, $node, $level + 1);
274  }
275  $childNodes->exchangeArray($tempNodes);
276  $childNodes->asort();
277  $node->setChildNodes($childNodes);
278  }
279  return $node;
280  }
281 
285  public function ‪initializeTreeData()
286  {
287  parent::initializeTreeData();
288  $this->nodeSortValues = array_flip($this->itemWhiteList);
289  $this->columnConfiguration = ‪$GLOBALS['TCA'][$this->‪getTableName()]['columns'][$this->‪getLookupField()]['config'];
290  if (isset($this->columnConfiguration['foreign_table']) && $this->columnConfiguration['foreign_table'] != $this->‪getTableName()) {
291  throw new \InvalidArgumentException('TCA Tree configuration is invalid: tree for different node-Tables is not implemented yet', 1290944650);
292  }
293  $this->treeData = GeneralUtility::makeInstance(\‪TYPO3\CMS\Backend\Tree\TreeNode::class);
294  $this->‪loadTreeData();
296  }
297 
301  protected function ‪loadTreeData()
302  {
303  $this->treeData->setId($this->‪getRootUid());
304  $this->treeData->setParentNode(null);
305  if ($this->levelMaximum >= 1) {
306  $childNodes = $this->‪getChildrenOf($this->treeData, 1);
307  if ($childNodes !== null) {
308  $this->treeData->setChildNodes($childNodes);
309  }
310  }
311  }
312 
320  protected function ‪getChildrenOf(\‪TYPO3\CMS\Backend\Tree\TreeNode $node, $level)
321  {
322  $nodeData = null;
323  if ($node->getId() !== 0) {
324  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
325  ->getQueryBuilderForTable($this->‪getTableName());
326  $queryBuilder->getRestrictions()->removeAll();
327  $nodeData = $queryBuilder->select('*')
328  ->from($this->‪getTableName())
329  ->where(
330  $queryBuilder->expr()->eq(
331  'uid',
332  $queryBuilder->createNamedParameter($node->getId(), \PDO::PARAM_INT)
333  )
334  )
335  ->setMaxResults(1)
336  ->execute()
337  ->fetch();
338  }
339  if (empty($nodeData)) {
340  $nodeData = [
341  'uid' => 0,
342  $this->‪getLookupField() => ''
343  ];
344  }
345  $storage = null;
346  $children = $this->‪getRelatedRecords($nodeData);
347  if (!empty($children)) {
349  $storage = GeneralUtility::makeInstance(\‪TYPO3\CMS\Backend\Tree\TreeNodeCollection::class);
350  foreach ($children as $child) {
351  $node = GeneralUtility::makeInstance(\‪TYPO3\CMS\Backend\Tree\TreeNode::class);
352  $node->setId($child);
353  if ($level < $this->levelMaximum) {
354  $children = $this->‪getChildrenOf($node, $level + 1);
355  if ($children !== null) {
356  $node->setChildNodes($children);
357  }
358  }
359  $storage->append($node);
360  }
361  }
362  return $storage;
363  }
364 
371  protected function ‪getRelatedRecords(array $row)
372  {
373  if ($this->‪getLookupMode() == self::MODE_PARENT) {
374  $children = $this->‪getChildrenUidsFromParentRelation($row);
375  } else {
376  $children = $this->‪getChildrenUidsFromChildrenRelation($row);
377  }
378  $allowedArray = [];
379  foreach ($children as $child) {
380  if (!in_array($child, $this->idCache) && in_array($child, $this->itemWhiteList)) {
381  $allowedArray[] = $child;
382  }
383  }
384  $this->idCache = array_merge($this->idCache, $allowedArray);
385  return $allowedArray;
386  }
387 
394  protected function ‪getChildrenUidsFromParentRelation(array $row)
395  {
396  $uid = $row['uid'];
397  switch ((string)$this->columnConfiguration['type']) {
398  case 'inline':
399 
400  case 'select':
401  if ($this->columnConfiguration['MM']) {
403  $dbGroup = GeneralUtility::makeInstance(\‪TYPO3\CMS\Core\Database\RelationHandler::class);
404  // Dummy field for setting "look from other site"
405  $this->columnConfiguration['MM_oppositeField'] = 'children';
406  $dbGroup->start($row[$this->‪getLookupField()], $this->‪getTableName(), $this->columnConfiguration['MM'], $uid, $this->‪getTableName(), $this->columnConfiguration);
407  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
408  } elseif ($this->columnConfiguration['foreign_field']) {
409  $relatedUids = $this->‪listFieldQuery($this->columnConfiguration['foreign_field'], $uid);
410  } else {
411  $relatedUids = $this->‪listFieldQuery($this->‪getLookupField(), $uid);
412  }
413  break;
414  default:
415  $relatedUids = $this->‪listFieldQuery($this->‪getLookupField(), $uid);
416  }
417  return $relatedUids;
418  }
419 
426  protected function ‪getChildrenUidsFromChildrenRelation(array $row)
427  {
428  $relatedUids = [];
429  $uid = $row['uid'];
430  $value = $row[$this->‪getLookupField()];
431  switch ((string)$this->columnConfiguration['type']) {
432  case 'inline':
433  // Intentional fall-through
434  case 'select':
435  if ($this->columnConfiguration['MM']) {
436  $dbGroup = GeneralUtility::makeInstance(\‪TYPO3\CMS\Core\Database\RelationHandler::class);
437  $dbGroup->start(
438  $value,
439  $this->‪getTableName(),
440  $this->columnConfiguration['MM'],
441  $uid,
442  $this->‪getTableName(),
443  $this->columnConfiguration
444  );
445  $relatedUids = $dbGroup->tableArray[$this->‪getTableName()];
446  } elseif ($this->columnConfiguration['foreign_field']) {
447  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
448  ->getQueryBuilderForTable($this->‪getTableName());
449  $queryBuilder->getRestrictions()->removeAll();
450  $records = $queryBuilder->select('uid')
451  ->from($this->‪getTableName())
452  ->where(
453  $queryBuilder->expr()->eq(
454  $this->columnConfiguration['foreign_field'],
455  $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)
456  )
457  )
458  ->execute()
459  ->fetchAll();
460 
461  if (!empty($records)) {
462  $relatedUids = array_column($records, 'uid');
463  }
464  } else {
465  $relatedUids = GeneralUtility::intExplode(',', $value, true);
466  }
467  break;
468  default:
469  $relatedUids = GeneralUtility::intExplode(',', $value, true);
470  }
471  return $relatedUids;
472  }
473 
481  protected function ‪listFieldQuery($fieldName, $queryId)
482  {
483  $queryId = (int)$queryId;
484  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
485  ->getQueryBuilderForTable($this->‪getTableName());
486  $queryBuilder->getRestrictions()->removeAll();
487 
488  $queryBuilder->select('uid')
489  ->from($this->‪getTableName())
490  ->where($queryBuilder->expr()->inSet($fieldName, $queryBuilder->quote($queryId)));
491 
492  if ($queryId === 0) {
493  $queryBuilder->orWhere(
494  $queryBuilder->expr()->comparison(
495  'CAST(' . $queryBuilder->quoteIdentifier($fieldName) . ' AS CHAR)',
497  $queryBuilder->quote('')
498  )
499  );
500  }
501 
502  $records = $queryBuilder->execute()->fetchAll();
503  $uidArray = is_array($records) ? array_column($records, 'uid') : [];
504 
505  return $uidArray;
506  }
507 
511  protected function ‪emitPostProcessTreeDataSignal()
512  {
514  self::class,
515  self::SIGNAL_PostProcessTreeData,
516  [$this, $this->treeData]
517  );
518  }
519 
525  protected function ‪getSignalSlotDispatcher()
526  {
527  if (!isset($this->signalSlotDispatcher)) {
528  $this->signalSlotDispatcher = $this->‪getObjectManager()->‪get(Dispatcher::class);
529  }
531  }
532 
538  protected function ‪getObjectManager()
539  {
540  return GeneralUtility::makeInstance(ObjectManager::class);
541  }
542 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:29
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$idCache
‪array $idCache
Definition: DatabaseTreeDataProvider.php:65
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenOf
‪TYPO3 CMS Backend Tree TreeNodeCollection null getChildrenOf(\TYPO3\CMS\Backend\Tree\TreeNode $node, $level)
Definition: DatabaseTreeDataProvider.php:308
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getObjectManager
‪ObjectManager getObjectManager()
Definition: DatabaseTreeDataProvider.php:526
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLabelField
‪setLabelField($labelField)
Definition: DatabaseTreeDataProvider.php:92
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder
Definition: ExpressionBuilder.php:33
‪TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder\EQ
‪const EQ
Definition: ExpressionBuilder.php:34
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getNodes
‪getNodes(\TYPO3\CMS\Backend\Tree\TreeNode $node)
Definition: DatabaseTreeDataProvider.php:172
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:25
‪TYPO3
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider
Definition: DatabaseTreeDataProvider.php:30
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_PARENT
‪const MODE_PARENT
Definition: DatabaseTreeDataProvider.php:33
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\listFieldQuery
‪int[] listFieldQuery($fieldName, $queryId)
Definition: DatabaseTreeDataProvider.php:469
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableWhere
‪string getTableWhere()
Definition: DatabaseTreeDataProvider.php:221
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeNode
Definition: DatabaseTreeNode.php:21
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$columnConfiguration
‪array $columnConfiguration
Definition: DatabaseTreeDataProvider.php:71
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider
Definition: AbstractTableConfigurationTreeDataProvider.php:21
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getSelectedList
‪string getSelectedList()
Definition: AbstractTableConfigurationTreeDataProvider.php:176
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$nodeSortValues
‪array $nodeSortValues
Definition: DatabaseTreeDataProvider.php:77
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:31
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupMode
‪setLookupMode($lookupMode)
Definition: DatabaseTreeDataProvider.php:152
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\buildRepresentationForNode
‪TYPO3 CMS Core Tree TableConfiguration DatabaseTreeNode buildRepresentationForNode(\TYPO3\CMS\Backend\Tree\TreeNode $basicNode, DatabaseTreeNode $parent=null, $level=0)
Definition: DatabaseTreeDataProvider.php:234
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableWhere
‪setTableWhere($tableWhere)
Definition: DatabaseTreeDataProvider.php:211
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRootUid
‪int getRootUid()
Definition: DatabaseTreeDataProvider.php:201
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLabelField
‪string getLabelField()
Definition: DatabaseTreeDataProvider.php:102
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRelatedRecords
‪array getRelatedRecords(array $row)
Definition: DatabaseTreeDataProvider.php:359
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\loadTreeData
‪loadTreeData()
Definition: DatabaseTreeDataProvider.php:289
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\MODE_CHILDREN
‪const MODE_CHILDREN
Definition: DatabaseTreeDataProvider.php:32
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableName
‪string $tableName
Definition: DatabaseTreeDataProvider.php:37
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$tableWhere
‪string $tableWhere
Definition: DatabaseTreeDataProvider.php:49
‪TYPO3\CMS\Core\Tree\TableConfiguration
Definition: AbstractTableConfigurationTreeDataProvider.php:2
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$signalSlotDispatcher
‪Dispatcher $signalSlotDispatcher
Definition: DatabaseTreeDataProvider.php:85
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1811
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupField
‪string getLookupField()
Definition: DatabaseTreeDataProvider.php:142
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\isExpanded
‪bool isExpanded(\TYPO3\CMS\Backend\Tree\TreeNode $node)
Definition: AbstractTableConfigurationTreeDataProvider.php:128
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getSignalSlotDispatcher
‪Dispatcher getSignalSlotDispatcher()
Definition: DatabaseTreeDataProvider.php:513
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\SIGNAL_PostProcessTreeData
‪const SIGNAL_PostProcessTreeData
Definition: DatabaseTreeDataProvider.php:31
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$treeId
‪string $treeId
Definition: DatabaseTreeDataProvider.php:41
‪TYPO3\CMS\Core\Tree\TableConfiguration\AbstractTableConfigurationTreeDataProvider\getNonSelectableLevelList
‪string getNonSelectableLevelList()
Definition: AbstractTableConfigurationTreeDataProvider.php:196
‪TYPO3\CMS\Extbase\SignalSlot\Dispatcher\dispatch
‪mixed dispatch($signalClassName, $signalName, array $signalArguments=[])
Definition: Dispatcher.php:115
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:72
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordWSOL
‪static array getRecordWSOL( $table, $uid, $fields=' *', $where='', $useDeleteClause=true, $unsetMovePointers=false)
Definition: BackendUtility.php:174
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setRootUid
‪setRootUid($rootUid)
Definition: DatabaseTreeDataProvider.php:191
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$lookupMode
‪int $lookupMode
Definition: DatabaseTreeDataProvider.php:53
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\initializeTreeData
‪initializeTreeData()
Definition: DatabaseTreeDataProvider.php:273
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setLookupField
‪setLookupField($lookupField)
Definition: DatabaseTreeDataProvider.php:132
‪$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:57
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\setTableName
‪setTableName($tableName)
Definition: DatabaseTreeDataProvider.php:112
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\emitPostProcessTreeDataSignal
‪emitPostProcessTreeDataSignal()
Definition: DatabaseTreeDataProvider.php:499
‪TYPO3\CMS\Extbase\Object\ObjectManager\get
‪object &T get($objectName,... $constructorArguments)
Definition: ObjectManager.php:94
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getTableName
‪string getTableName()
Definition: DatabaseTreeDataProvider.php:122
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$labelField
‪string $labelField
Definition: DatabaseTreeDataProvider.php:45
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:44
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$generatedTSConfig
‪array $generatedTSConfig
Definition: DatabaseTreeDataProvider.php:81
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getRoot
‪TYPO3 CMS Core Tree TableConfiguration DatabaseTreeNode getRoot()
Definition: DatabaseTreeDataProvider.php:181
‪TYPO3\CMS\Extbase\Object\ObjectManager
Definition: ObjectManager.php:25
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getLookupMode
‪int getLookupMode()
Definition: DatabaseTreeDataProvider.php:162
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromChildrenRelation
‪array getChildrenUidsFromChildrenRelation(array $row)
Definition: DatabaseTreeDataProvider.php:414
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\$rootUid
‪int $rootUid
Definition: DatabaseTreeDataProvider.php:61
‪TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider\getChildrenUidsFromParentRelation
‪array getChildrenUidsFromParentRelation(array $row)
Definition: DatabaseTreeDataProvider.php:382
‪TYPO3\CMS\Extbase\SignalSlot\Dispatcher
Definition: Dispatcher.php:28