diff --git a/typo3/sysext/backend/Classes/Tree/Pagetree/DataProvider.php b/typo3/sysext/backend/Classes/Tree/Pagetree/DataProvider.php index 75de65c312066dd502935ca9d90ecda5af5a74b6..0477745902c054a760f6d94b47f3506d667b27af 100644 --- a/typo3/sysext/backend/Classes/Tree/Pagetree/DataProvider.php +++ b/typo3/sysext/backend/Classes/Tree/Pagetree/DataProvider.php @@ -15,6 +15,11 @@ namespace TYPO3\CMS\Backend\Tree\Pagetree; */ use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\QueryBuilder; +use TYPO3\CMS\Core\Database\Query\QueryHelper; +use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction; +use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @@ -410,48 +415,74 @@ class DataProvider extends \TYPO3\CMS\Backend\Tree\AbstractTreeDataProvider } /** - * Returns the where clause for fetching pages + * Sets the Doctrine where clause for fetching pages * + * @param QueryBuilder $queryBuilder * @param int $id * @param string $searchFilter - * @return string + * @return QueryBuilder */ - protected function getWhereClause($id, $searchFilter = '') + protected function setWhereClause(QueryBuilder $queryBuilder, $id, $searchFilter = ''): QueryBuilder { - $where = $GLOBALS['BE_USER']->getPagePermsClause(1) . BackendUtility::deleteClause('pages') . BackendUtility::versioningPlaceholderClause('pages'); + $expressionBuilder = $queryBuilder->expr(); + $queryBuilder->where( + QueryHelper::stripLogicalOperatorPrefix($GLOBALS['BE_USER']->getPagePermsClause(1)) + ); + if (is_numeric($id) && $id >= 0) { - $where .= ' AND pid= ' . $GLOBALS['TYPO3_DB']->fullQuoteStr((int)$id, 'pages'); + $queryBuilder->andWhere( + $expressionBuilder->eq('pid', (int)$id) + ); } $excludedDoktypes = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.excludeDoktypes'); if (!empty($excludedDoktypes)) { - $excludedDoktypes = $GLOBALS['TYPO3_DB']->fullQuoteArray(GeneralUtility::intExplode(',', $excludedDoktypes), 'pages'); - $where .= ' AND doktype NOT IN (' . implode(',', $excludedDoktypes) . ')'; + $queryBuilder->andWhere( + $expressionBuilder->notIn('doktype', GeneralUtility::intExplode(',', $excludedDoktypes)) + ); } if ($searchFilter !== '') { + $searchParts = $expressionBuilder->orX(); if (is_numeric($searchFilter) && $searchFilter > 0) { - $searchWhere .= 'uid = ' . (int)$searchFilter . ' OR '; + $searchParts->add( + $expressionBuilder->eq('uid', (int)$searchFilter) + ); } - $searchFilter = $GLOBALS['TYPO3_DB']->fullQuoteStr('%' . $searchFilter . '%', 'pages'); + $searchFilter = '%' . $queryBuilder->escapeLikeWildcards($searchFilter) . '%'; $useNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle'); $useAlias = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.searchInAlias'); - $searchWhereAlias = ''; + $aliasExpression = ''; if ($useAlias) { - $searchWhereAlias = ' OR alias LIKE ' . $searchFilter; + $aliasExpression = $expressionBuilder->like('alias', $queryBuilder->createNamedParameter($searchFilter)); } if ($useNavTitle) { - $searchWhere .= '(nav_title LIKE ' . $searchFilter . - ' OR (nav_title = "" AND title LIKE ' . $searchFilter . ')' . $searchWhereAlias . ')'; + $searchWhereAlias = $expressionBuilder->orX( + $expressionBuilder->like('nav_title', $queryBuilder->createNamedParameter($searchFilter)), + $expressionBuilder->andX( + $expressionBuilder->eq('nav_title', $queryBuilder->createNamedParameter('')), + $expressionBuilder->like('title', $queryBuilder->createNamedParameter($searchFilter)) + ) + ); + if (strlen($aliasExpression)) { + $searchWhereAlias->add($aliasExpression); + } + $searchParts->add($searchWhereAlias); } else { - $searchWhere .= 'title LIKE ' . $searchFilter . $searchWhereAlias; + $searchParts->add( + $expressionBuilder->like('title', $queryBuilder->createNamedParameter($searchFilter)) + ); + + if (strlen($aliasExpression)) { + $searchParts->add($aliasExpression); + } } - $where .= ' AND (' . $searchWhere . ')'; + $queryBuilder->andWhere($searchParts); } - return $where; + return $queryBuilder; } /** @@ -463,8 +494,21 @@ class DataProvider extends \TYPO3\CMS\Backend\Tree\AbstractTreeDataProvider */ protected function getSubpages($id, $searchFilter = '') { - $where = $this->getWhereClause($id, $searchFilter); - return $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,t3ver_wsid', 'pages', $where, '', 'sorting', '', 'uid'); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $queryBuilder->getRestrictions() + ->removeAll() + ->add(GeneralUtility::makeInstance(DeletedRestriction::class)) + ->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class)); + $result = []; + $queryBuilder = $this->setWhereClause($queryBuilder, $id, $searchFilter); + $queryResult = $queryBuilder->select('uid', 't3ver_wsid') + ->from('pages') + ->orderBy('sorting') + ->execute(); + while ($row = $queryResult->fetch()) { + $result[$row['uid']] = $row; + } + return $result; } /** @@ -475,12 +519,16 @@ class DataProvider extends \TYPO3\CMS\Backend\Tree\AbstractTreeDataProvider */ protected function hasNodeSubPages($id) { - $where = $this->getWhereClause($id); - $subpage = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('uid', 'pages', $where, '', 'sorting', '', 'uid'); - $returnValue = true; - if (!$subpage['uid']) { - $returnValue = false; - } - return $returnValue; + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $queryBuilder->getRestrictions() + ->removeAll() + ->add(GeneralUtility::makeInstance(DeletedRestriction::class)) + ->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class)); + $queryBuilder = $this->setWhereClause($queryBuilder, $id); + $count = $queryBuilder->count('uid') + ->from('pages') + ->execute() + ->fetchColumn(0); + return (bool)$count; } }