108 if ($this->limit !==
'') {
109 $parts = GeneralUtility::intExplode(
',', $this->limit,
true);
111 if ($parts[0] === 0 && $parts[1] === 0) {
115 $this->table[] = $tableKey;
116 $this->
setData($id, $tableKey, $depth, $filter);
135 foreach ($this->table as $tableName) {
136 $countTotal += count($deletedRecords[$tableName] ?? []);
152 if (!$deletedField) {
162 if (!empty($this->limit)) {
165 $queryBuilder->getRestrictions()->removeAll();
167 $deletedCount = (int)$queryBuilder
171 $queryBuilder->expr()->neq(
173 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
180 list($offset, $rowCount) = GeneralUtility::intExplode(
',', $this->limit,
true);
182 $result = $offset - $deletedCount;
187 $this->limit = implode(
',', [$offset, $rowCount]);
195 $tempOffset = $offset;
200 $absResult = abs($result);
202 if ($absResult > $rowCount) {
204 $firstResult = $tempOffset;
205 $maxResults = $rowCount;
207 $this->limit = implode(
',', [$newOffset, 0]);
211 $firstResult = $tempOffset;
212 $maxResults = $absResult;
214 $newCount = $rowCount - $absResult;
216 $this->limit = implode(
',', [$newOffset, $newCount]);
228 $queryBuilder->setFirstResult($firstResult);
231 $queryBuilder->setMaxResults($maxResults);
233 $recordsToCheck = $queryBuilder->select(
'*')
236 $queryBuilder->expr()->eq(
238 $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
245 if ($recordsToCheck !==
false) {
249 $this->label[
$table] = $tcaCtrl[
'label'];
250 $this->title[
$table] = $tcaCtrl[
'title'];
265 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
$table);
266 $queryBuilder->getRestrictions()
268 ->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class));
271 $filterConstraint =
null;
272 if (trim($filter) !==
'') {
273 $filterConstraint = $queryBuilder->expr()->comparison(
274 $queryBuilder->castFieldToTextType(
$GLOBALS[
'TCA'][
$table][
'ctrl'][
'label']),
276 $queryBuilder->createNamedParameter(
277 '%' . $queryBuilder->escapeLikeWildcards($filter) .
'%',
282 $filterConstraint = $queryBuilder->expr()->orX(
283 $queryBuilder->expr()->eq(
285 $queryBuilder->createNamedParameter($filter, \PDO::PARAM_INT)
287 $queryBuilder->expr()->eq(
289 $queryBuilder->createNamedParameter($filter, \PDO::PARAM_INT)
297 $pidConstraints = [];
298 foreach (array_chunk($pidList, $maxBindParameters - 10) as $chunk) {
299 $pidConstraints[] = $queryBuilder->expr()->in(
301 $queryBuilder->createNamedParameter($chunk, Connection::PARAM_INT_ARRAY)
304 $queryBuilder->where(
305 $queryBuilder->expr()->andX(
307 $queryBuilder->expr()->orX(...$pidConstraints)
311 return $queryBuilder;
333 foreach ($rows as $row) {
353 public function deleteData($recordsArray)
355 if (is_array($recordsArray)) {
357 $tce = GeneralUtility::makeInstance(DataHandler::class);
359 $tce->disableDeleteClause();
360 foreach ($recordsArray as $record) {
361 list(
$table, $uid) = explode(
':', $record);
362 $tce->deleteEl(
$table, (
int)$uid,
true,
true);
380 public function undeleteData($recordsArray, $recursive =
false)
383 $affectedRecords = 0;
385 if (is_array($recordsArray)) {
386 $this->deletedRows = [];
388 foreach ($recordsArray as $record) {
389 list(
$table, $uid) = explode(
':', $record);
394 $count = count($parentUidsToRecover);
395 for ($i = 0; $i < $count; ++$i) {
396 $parentUid = $parentUidsToRecover[$i];
397 $cmd[
'pages'][$parentUid][
'undelete'] = 1;
400 if (isset($cmd[
'pages'])) {
402 $cmd[
'pages'] = array_reverse($cmd[
'pages'],
true);
405 $cmd[
$table][$uid][
'undelete'] = 1;
407 if (
$table ===
'pages' && $recursive) {
410 if (!empty($childRecords)) {
411 foreach ($childRecords as $childTable => $childRows) {
412 foreach ($childRows as $childRow) {
413 $cmd[$childTable][$childRow[
'uid']][
'undelete'] = 1;
420 $tce = GeneralUtility::makeInstance(DataHandler::class);
421 $tce->start([], $cmd);
422 $tce->process_cmdmap();
423 $result = $affectedRecords;
438 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
439 $queryBuilder->getRestrictions()->removeAll();
440 $record = $queryBuilder
441 ->select(
'uid',
'pid')
444 $queryBuilder->expr()->eq(
'uid', $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)),
445 $queryBuilder->expr()->eq(
$GLOBALS[
'TCA'][
'pages'][
'ctrl'][
'delete'], 1)
450 $pages[] = $record[
'uid'];
451 if ((
int)$record[
'pid'] !== 0) {
470 $this->deletedRows[
$table][] = $row;
504 protected function getTreeList(
int $id,
int $depth,
int $begin = 0): array
507 $identifier = md5($id .
'_' . $depth .
'_' . $begin);
508 $pageTree = $cache->get($identifier);
509 if ($pageTree ===
false) {
511 $cache->set($identifier, $pageTree);
524 protected function resolveTree(
int $id,
int $depth,
int $begin = 0,
string $permsClause =
''): array
526 $depth = (int)$depth;
527 $begin = (int)$begin;
534 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
535 $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class));
536 $statement = $queryBuilder->select(
'uid')
539 $queryBuilder->expr()->eq(
'pid', $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT)),
543 while ($row = $statement->fetch()) {
545 $theList[] = $row[
'uid'];
548 $theList = array_merge($theList, $this->
resolveTree($row[
'uid'], $depth - 1, $begin - 1, $permsClause));
562 return GeneralUtility::makeInstance(CacheManager::class)->getCache(
'cache_runtime');