/** * Builds a complete node including children * * @param \t3lib_tree_Node|\TYPO3\CMS\Backend\Tree\TreeNode $basicNode * @param NULL|t3lib_tree_tca_DatabaseNode $parent * @param integer $level * @param bool $restriction * @return t3lib_tree_tca_DatabaseNode node */ protected function buildRepresentationForNode(t3lib_tree_Node $basicNode, t3lib_tree_tca_DatabaseNode $parent = NULL, $level = 0, $restriction = FALSE) { /**@param $node t3lib_tree_tca_DatabaseNode */ $node = t3lib_div::makeInstance('t3lib_tree_tca_DatabaseNode'); $row = array(); if ($basicNode->getId() == 0) { $node->setSelected(FALSE); $node->setExpanded(TRUE); $node->setLabel($GLOBALS['LANG']->sL($GLOBALS['TCA'][$this->tableName]['ctrl']['title'])); } else { $row = t3lib_BEfunc::getRecordWSOL($this->tableName, $basicNode->getId(), '*', '', FALSE); if ($this->getLabelField() !== '') { $label = Tx_News_Service_CategoryService::translateCategoryRecord($row[$this->getLabelField()], $row); $node->setLabel($label); } else { $node->setLabel($basicNode->getId()); } $node->setSelected(t3lib_div::inList($this->getSelectedList(), $basicNode->getId())); $node->setExpanded($this->isExpanded($basicNode)); $node->setLabel($node->getLabel()); } $node->setId($basicNode->getId()); // Break to force single category activation if ($parent != NULL && $level != 0 && $this->isSingleCategoryAclActivated() && !$this->isCategoryAllowed($node)) { return NULL; } $node->setSelectable(!t3lib_div::inList($this->getNonSelectableLevelList(), $level) && !in_array($basicNode->getId(), $this->getItemUnselectableList())); $node->setSortValue($this->nodeSortValues[$basicNode->getId()]); $node->setIcon(t3lib_iconWorks::mapRecordTypeToSpriteIconClass($this->tableName, $row)); $node->setParentNode($parent); if ($basicNode->hasChildNodes()) { $node->setHasChildren(TRUE); $childNodes = t3lib_div::makeInstance('t3lib_tree_SortedNodeCollection'); $foundSomeChild = FALSE; foreach ($basicNode->getChildNodes() as $child) { // Change in custom TreeDataProvider by adding the if clause if ($restriction || $this->isCategoryAllowed($child)) { $returnedChild = $this->buildRepresentationForNode($child, $node, $level + 1, TRUE); if (!is_null($returnedChild)) { $foundSomeChild = TRUE; $childNodes->append($returnedChild); } else { $node->setParentNode(NULL); $node->setHasChildren(FALSE); } } // Change in custom TreeDataProvider end } if ($foundSomeChild) { $node->setChildNodes($childNodes); } } return $node; }
/** * Gets the expanded state of a given node * * @param t3lib_tree_AbstractNode $node * @return bool */ protected function isExpanded(t3lib_tree_Node $node) { return $this->getExpandAll() || t3lib_div::inList($this->expandedList, $node->getId()); }
/** * Gets node children * * @param t3lib_tree_Node $node * @param $level * @return A|null|object */ protected function getChildrenOf(t3lib_tree_Node $node, $level) { $nodeData = NULL; if ($node->getId() !== 0) { $nodeData = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('*', $this->tableName, 'uid=' . $node->getId()); } if ($nodeData == NULL) { $nodeData = array('uid' => 0, $this->getLookupField() => ''); } $storage = NULL; $children = $this->getRelatedRecords($nodeData); if (count($children)) { $storage = t3lib_div::makeInstance('t3lib_tree_NodeCollection'); foreach ($children as $child) { $node = t3lib_div::makeInstance('t3lib_tree_Node'); $node->setId($child); if ($level <= $this->levelMaximum) { $children = $this->getChildrenOf($node, $level + 1); if ($children !== NULL) { $node->setChildNodes($children); } } $storage->append($node); } } return $storage; }
/** * Returns a node collection of filtered nodes * * @param t3lib_tree_Node $node * @param string $searchFilter * @param int $mountPoint * @return void */ public function getFilteredNodes(t3lib_tree_Node $node, $searchFilter, $mountPoint = 0) { /** @var $nodeCollection t3lib_tree_pagetree_NodeCollection */ $nodeCollection = t3lib_div::makeInstance('t3lib_tree_pagetree_NodeCollection'); $records = $this->getSubpages(-1, $searchFilter); if (!is_array($records) || !count($records)) { return $nodeCollection; } $isNumericSearchFilter = is_numeric($searchFilter) && $searchFilter > 0; $nodeId = intval($node->getId()); foreach ($records as $record) { $record = t3lib_tree_pagetree_Commands::getNodeRecord($record['uid']); if (intval($record['pid']) === -1 || in_array($record['uid'], $this->hiddenRecords)) { continue; } $rootline = t3lib_BEfunc::BEgetRootLine($record['uid'], ' AND uid != ' . $nodeId); $rootline = array_reverse($rootline); if ($nodeId === 0) { array_shift($rootline); } $reference = $nodeCollection; $inFilteredRootline = FALSE; $amountOfRootlineElements = count($rootline); for ($i = 0; $i < $amountOfRootlineElements; ++$i) { $rootlineElement = $rootline[$i]; if (intval($rootlineElement['pid']) === $nodeId) { $inFilteredRootline = TRUE; } if (!$inFilteredRootline) { continue; } $rootlineElement = t3lib_tree_pagetree_Commands::getNodeRecord($rootlineElement['uid']); $ident = intval($rootlineElement['sorting']) . intval($rootlineElement['uid']); if ($reference->offsetExists($ident)) { /** @var $refNode t3lib_tree_pagetree_Node */ $refNode = $reference->offsetGet($ident); $refNode->setExpanded(TRUE); $refNode->setLeaf(FALSE); $reference = $refNode->getChildNodes(); continue; } $refNode = t3lib_tree_pagetree_Commands::getNewNode($rootlineElement, $mountPoint); $replacement = '<span class="typo3-pagetree-filteringTree-highlight">$1</span>'; if ($isNumericSearchFilter && intval($rootlineElement['uid']) === intval($searchFilter)) { $text = str_replace('$1', $refNode->getText(), $replacement); } else { $text = preg_replace('/(' . $searchFilter . ')/i', $replacement, $refNode->getText()); } $refNode->setText($text, $refNode->getTextSourceField(), $refNode->getPrefix(), $refNode->getSuffix()); /** @var $childCollection t3lib_tree_pagetree_NodeCollection */ $childCollection = t3lib_div::makeInstance('t3lib_tree_pagetree_NodeCollection'); if ($i + 1 >= $amountOfRootlineElements) { $childNodes = $this->getNodes($refNode, $mountPoint); foreach ($childNodes as $childNode) { /** @var $childNode t3lib_tree_pagetree_Node */ $childRecord = $childNode->getRecord(); $childIdent = intval($childRecord['sorting']) . intval($childRecord['uid']); $childCollection->offsetSet($childIdent, $childNode); } $refNode->setChildNodes($childNodes); } $refNode->setChildNodes($childCollection); $reference->offsetSet($ident, $refNode); $reference->ksort(); $reference = $childCollection; } } return $nodeCollection; }
/** * Compares a node if it's identical to another node by the id property. * * @param t3lib_tree_Node $other * @return boolean */ public function equals(t3lib_tree_Node $other) { return $this->id == $other->getId(); }