[FEATURE] Add Contexts for storing data access modes
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Classes / Database / Query / Restriction / FrontendRestrictionContainer.php
1 <?php
2 declare(strict_types = 1);
3 namespace TYPO3\CMS\Core\Database\Query\Restriction;
4
5 /*
6 * This file is part of the TYPO3 CMS project.
7 *
8 * It is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, either version 2
10 * of the License, or any later version.
11 *
12 * For the full copyright and license information, please read the
13 * LICENSE.txt file that was distributed with this source code.
14 *
15 * The TYPO3 project - inspiring people to share!
16 */
17
18 use TYPO3\CMS\Core\Context\Context;
19 use TYPO3\CMS\Core\Context\VisibilityAspect;
20 use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
21 use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder;
22 use TYPO3\CMS\Core\Utility\GeneralUtility;
23
24 /**
25 * A collection of restrictions to be used in frontend context.
26 * This is a replacement for PageRepository::enableFields()
27 */
28 class FrontendRestrictionContainer extends AbstractRestrictionContainer
29 {
30 /**
31 * @var QueryRestrictionInterface[]
32 */
33 protected $defaultRestrictionTypes = [
34 DeletedRestriction::class,
35 FrontendWorkspaceRestriction::class,
36 HiddenRestriction::class,
37 StartTimeRestriction::class,
38 EndTimeRestriction::class,
39 FrontendGroupRestriction::class,
40 ];
41
42 /**
43 * @var Context
44 */
45 protected $context;
46
47 /**
48 * FrontendRestrictionContainer constructor.
49 * Initializes the default restrictions for frontend requests
50 *
51 * @param Context $context
52 */
53 public function __construct(Context $context = null)
54 {
55 $this->context = $context ?? GeneralUtility::makeInstance(Context::class);
56 foreach ($this->defaultRestrictionTypes as $restrictionType) {
57 $this->add($this->createRestriction($restrictionType));
58 }
59 }
60
61 /**
62 * Main method to build expressions for given tables
63 * Iterates over all registered restrictions and removes the hidden restriction if preview is requested
64 *
65 * @param array $queriedTables Array of tables, where array key is table alias and value is a table name
66 * @param ExpressionBuilder $expressionBuilder Expression builder instance to add restrictions with
67 * @return CompositeExpression The result of query builder expression(s)
68 */
69 public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder): CompositeExpression
70 {
71 $constraints = [];
72 foreach ($this->restrictions as $restriction) {
73 foreach ($queriedTables as $tableAlias => $tableName) {
74 $disableRestriction = false;
75 if ($restriction instanceof HiddenRestriction) {
76 /** @var VisibilityAspect $visibilityAspect */
77 $visibilityAspect = $this->context->getAspect('visibility');
78 // If display of hidden records is requested, we must disable the hidden restriction.
79 if ($tableName === 'pages') {
80 $disableRestriction = $visibilityAspect->includeHiddenPages();
81 } else {
82 $disableRestriction = $visibilityAspect->includeHiddenContent();
83 }
84 }
85 if (!$disableRestriction) {
86 $constraints[] = $restriction->buildExpression([$tableAlias => $tableName], $expressionBuilder);
87 }
88 }
89 }
90 return $expressionBuilder->andX(...$constraints);
91 }
92 }