249 $node = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeNode::class);
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']));
258 $node->setSelected(GeneralUtility::inList($this->
getSelectedList(), $basicNode->getId()));
259 $node->setExpanded($this->
isExpanded($basicNode));
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);
272 foreach ($basicNode->getChildNodes() as $child) {
275 $childNodes->exchangeArray($tempNodes);
276 $childNodes->asort();
277 $node->setChildNodes($childNodes);
287 parent::initializeTreeData();
288 $this->nodeSortValues = array_flip($this->itemWhiteList);
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);
293 $this->treeData = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Tree\TreeNode::class);
304 $this->treeData->setParentNode(
null);
305 if ($this->levelMaximum >= 1) {
307 if ($childNodes !==
null) {
308 $this->treeData->setChildNodes($childNodes);
323 if ($node->getId() !== 0) {
324 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
326 $queryBuilder->getRestrictions()->removeAll();
327 $nodeData = $queryBuilder->select(
'*')
330 $queryBuilder->expr()->eq(
332 $queryBuilder->createNamedParameter($node->getId(), \PDO::PARAM_INT)
339 if (empty($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) {
355 if ($children !==
null) {
356 $node->setChildNodes($children);
359 $storage->append($node);
379 foreach ($children as $child) {
380 if (!in_array($child, $this->idCache) && in_array($child, $this->itemWhiteList)) {
381 $allowedArray[] = $child;
384 $this->idCache = array_merge($this->idCache, $allowedArray);
385 return $allowedArray;
397 switch ((
string)$this->columnConfiguration[
'type']) {
401 if ($this->columnConfiguration[
'MM']) {
403 $dbGroup = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Database\RelationHandler::class);
405 $this->columnConfiguration[
'MM_oppositeField'] =
'children';
408 } elseif ($this->columnConfiguration[
'foreign_field']) {
409 $relatedUids = $this->
listFieldQuery($this->columnConfiguration[
'foreign_field'], $uid);
431 switch ((
string)$this->columnConfiguration[
'type']) {
435 if ($this->columnConfiguration[
'MM']) {
436 $dbGroup = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Database\RelationHandler::class);
440 $this->columnConfiguration[
'MM'],
443 $this->columnConfiguration
446 } elseif ($this->columnConfiguration[
'foreign_field']) {
447 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
449 $queryBuilder->getRestrictions()->removeAll();
450 $records = $queryBuilder->select(
'uid')
453 $queryBuilder->expr()->eq(
454 $this->columnConfiguration[
'foreign_field'],
455 $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)
461 if (!empty($records)) {
462 $relatedUids = array_column($records,
'uid');
465 $relatedUids = GeneralUtility::intExplode(
',', $value,
true);
469 $relatedUids = GeneralUtility::intExplode(
',', $value,
true);
483 $queryId = (int)$queryId;
484 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
486 $queryBuilder->getRestrictions()->removeAll();
488 $queryBuilder->select(
'uid')
490 ->where($queryBuilder->expr()->inSet($fieldName, $queryBuilder->quote($queryId)));
492 if ($queryId === 0) {
493 $queryBuilder->orWhere(
494 $queryBuilder->expr()->comparison(
495 'CAST(' . $queryBuilder->quoteIdentifier($fieldName) .
' AS CHAR)',
497 $queryBuilder->quote(
'')
502 $records = $queryBuilder->execute()->fetchAll();
503 $uidArray = is_array($records) ? array_column($records,
'uid') : [];
515 self::SIGNAL_PostProcessTreeData,
516 [$this, $this->treeData]
527 if (!isset($this->signalSlotDispatcher)) {
540 return GeneralUtility::makeInstance(ObjectManager::class);