Bug #71461 ยป 71461-wip-01.diff
typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSelectTreeItems.php | ||
---|---|---|
$treeDataProvider->setItemWhiteList($allowedUids);
|
||
$treeDataProvider->initializeTreeData();
|
||
/** @var ExtJsArrayTreeRenderer $treeRenderer */
|
||
$treeRenderer = GeneralUtility::makeInstance(ExtJsArrayTreeRenderer::class);
|
||
/** @var TableConfigurationTree $tree */
|
||
$tree = GeneralUtility::makeInstance(TableConfigurationTree::class);
|
||
$tree->setDataProvider($treeDataProvider);
|
||
$tree->setNodeRenderer($treeRenderer);
|
||
$treeItems = $this->prepareAdditionalItems($staticItems, $result['databaseRow'][$fieldName]);
|
||
$treeItems[] = $tree->render();
|
||
$rootNode = $treeDataProvider->getRoot();
|
||
if (!$rootNode->isInvalidRootNode()) {
|
||
/** @var ExtJsArrayTreeRenderer $treeRenderer */
|
||
$treeRenderer = GeneralUtility::makeInstance(ExtJsArrayTreeRenderer::class);
|
||
/** @var TableConfigurationTree $tree */
|
||
$tree = GeneralUtility::makeInstance(TableConfigurationTree::class);
|
||
$tree->setDataProvider($treeDataProvider);
|
||
$tree->setNodeRenderer($treeRenderer);
|
||
$treeItems[] = $tree->render();
|
||
}
|
||
$treeConfig = [
|
||
'items' => $treeItems,
|
typo3/sysext/backend/Classes/Security/CategoryPermissionsAspect.php | ||
---|---|---|
use TYPO3\CMS\Backend\Tree\TreeNodeCollection;
|
||
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
|
||
use TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider;
|
||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||
/**
|
||
* We do not have AOP in TYPO3 for now, thus the aspect which
|
||
... | ... | |
public function addUserPermissionsToCategoryTreeData(DatabaseTreeDataProvider $dataProvider, $treeData)
|
||
{
|
||
if (!$this->backendUserAuthentication->isAdmin() && $dataProvider->getTableName() === $this->categoryTableName) {
|
||
// Get User permissions related to category
|
||
$categoryMountPoints = $this->backendUserAuthentication->getCategoryMountPoints();
|
||
if (!empty($categoryMountPoints)) {
|
||
$rootNodeId = (int)$treeData->getId();
|
||
$rootLineOfRootNode = [];
|
||
if ($rootNodeId !== 0) {
|
||
$rootLineOfRootNode = $this->getParentIdsOfNode($rootNodeId);
|
||
$rootLineOfRootNode[] = $rootNodeId;
|
||
}
|
||
if (empty(array_intersect($rootLineOfRootNode, $categoryMountPoints))) {
|
||
$treeData->setInvalidRootNode(true);
|
||
}
|
||
}
|
||
// Backup child nodes to be processed.
|
||
$treeNodeCollection = $treeData->getChildNodes();
|
||
... | ... | |
}
|
||
}
|
||
protected function getParentIdsOfNode($id)
|
||
{
|
||
$parentIds = [];
|
||
$database = $this->getDatabase();
|
||
$parent = $database->exec_SELECTgetSingleRow('parent', 'sys_category', 'uid=' . (int)$id . \TYPO3\CMS\Backend\Utility\BackendUtility::deleteClause($this->categoryTableName));
|
||
if (isset($parent['parent'])) {
|
||
$parentId = (int)$parent['parent'];
|
||
if ($parent > 0) {
|
||
$parentIds = $this->getParentIdsOfNode($parent['parent']);
|
||
}
|
||
$parentIds[] = $parentId;
|
||
}
|
||
return $parentIds;
|
||
}
|
||
/**
|
||
* Recursively look up for a category mount point within a tree.
|
||
*
|
||
... | ... | |
}
|
||
return $result;
|
||
}
|
||
/**
|
||
* Return database connection
|
||
*
|
||
* @return \TYPO3\CMS\Core\Database\DatabaseConnection
|
||
*/
|
||
protected function getDatabase()
|
||
{
|
||
return $GLOBALS['TYPO3_DB'];
|
||
}
|
||
}
|
typo3/sysext/backend/Classes/Tree/TreeNode.php | ||
---|---|---|
protected $childNodes = null;
|
||
/**
|
||
* Set to TRUE if a root node is handled a user has no access to.
|
||
*
|
||
* @var bool
|
||
*/
|
||
protected $invalidRootNode = false;
|
||
/**
|
||
* Constructor
|
||
*
|
||
* You can move an initial data array to initialize the instance and further objects.
|
||
... | ... | |
}
|
||
/**
|
||
* Set invalid root node
|
||
*
|
||
* @param bool $invalid
|
||
*/
|
||
public function setInvalidRootNode($invalid)
|
||
{
|
||
$this->invalidRootNode = (bool)$invalid;
|
||
}
|
||
/**
|
||
* Return true if root node is invalid
|
||
*
|
||
* @return bool
|
||
*/
|
||
public function isInvalidRootNode()
|
||
{
|
||
return $this->invalidRootNode;
|
||
}
|
||
/**
|
||
* Compares a node if it's identical to another node by the id property.
|
||
*
|
||
* @param \TYPO3\CMS\Backend\Tree\TreeNode $other
|
typo3/sysext/core/Classes/Tree/TableConfiguration/DatabaseTreeDataProvider.php | ||
---|---|---|
$iconFactory = GeneralUtility::makeInstance(IconFactory::class);
|
||
$node->setIcon($iconFactory->getIconForRecord($this->tableName, $row, Icon::SIZE_SMALL));
|
||
$node->setParentNode($parent);
|
||
$node->setInvalidRootNode($basicNode->isInvalidRootNode());
|
||
if ($basicNode->hasChildNodes()) {
|
||
$node->setHasChildren(true);
|
||
/** @var $childNodes \TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection */
|