/**
  * Returns a composite expression to restrict access to records for the backend context.
  *
  * @return CompositeExpression
  * @todo: Lots of code duplication, check how/if this can be merged with the "getEnableFieldConstraints"
  * @todo: after the test cases are done for backend and frontend.
  */
 protected function getBackendVisibilityConstraints() : CompositeExpression
 {
     $queryContext = $this->queryContext;
     $ignoreEnableFields = $queryContext->getIgnoreEnableFields();
     $includeDeleted = $queryContext->getIncludeDeleted();
     $constraints = [];
     $expressionBuilder = $this->expressionBuilder;
     foreach ($this->queriedTables as $tableName => $tableAlias) {
         $tableConfig = $queryContext->getTableConfig($tableName);
         $tablePrefix = empty($tableAlias) ? $tableName : $tableAlias;
         if (empty($tableConfig)) {
             // No restrictions for this table, not configured by TCA
             continue;
         }
         if (!$ignoreEnableFields && is_array($tableConfig['enablecolumns'])) {
             $enableColumns = $tableConfig['enablecolumns'];
             if (isset($enableColumns['disabled'])) {
                 $constraints[] = $expressionBuilder->eq($tablePrefix . '.' . $enableColumns['disabled'], 0);
             }
             if ($enableColumns['starttime']) {
                 $constraints[] = $expressionBuilder->lte($tablePrefix . '.' . $enableColumns['starttime'], $queryContext->getAccessTime());
             }
             if ($enableColumns['endtime']) {
                 $fieldName = $tablePrefix . '.' . $enableColumns['endtime'];
                 $constraints[] = $expressionBuilder->orX($expressionBuilder->eq($fieldName, 0), $expressionBuilder->gt($fieldName, $queryContext->getAccessTime()));
             }
         }
         if (!$includeDeleted && !empty($tableConfig['delete'])) {
             $tablePrefix = empty($tableAlias) ? $tableName : $tableAlias;
             $constraints[] = $this->expressionBuilder->eq($tablePrefix . '.' . $tableConfig['delete'], 0);
         }
     }
     return $expressionBuilder->andX(...$constraints);
 }
Пример #2
0
 /**
  * Main method to build expressions for given tables
  * Evaluates the ctrl/enablecolumns/fe_group flag of the table and adds the according restriction if set
  *
  * @param array $queriedTables Array of tables, where array key is table name and value potentially an alias
  * @param ExpressionBuilder $expressionBuilder Expression builder instance to add restrictions with
  * @return CompositeExpression The result of query builder expression(s)
  */
 public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder) : CompositeExpression
 {
     $constraints = [];
     foreach ($queriedTables as $tableName => $tableAlias) {
         $groupFieldName = $GLOBALS['TCA'][$tableName]['ctrl']['enablecolumns']['fe_group'] ?? null;
         if (!empty($groupFieldName)) {
             $fieldName = ($tableAlias ?: $tableName) . '.' . $groupFieldName;
             // Allow records where no group access has been configured (field values NULL, 0 or empty string)
             $constraints = [$expressionBuilder->isNull($fieldName), $expressionBuilder->eq($fieldName, $expressionBuilder->literal('')), $expressionBuilder->eq($fieldName, $expressionBuilder->literal('0'))];
             foreach ($this->frontendGroupIds as $frontendGroupId) {
                 $constraints[] = $expressionBuilder->inSet($fieldName, $expressionBuilder->literal((string) $frontendGroupId));
             }
         }
     }
     return $expressionBuilder->orX(...$constraints);
 }
Пример #3
0
 /**
  * Main method to build expressions for given tables
  * Evaluates the ctrl/delete flag of the table and adds the according restriction if set
  *
  * @param array $queriedTables Array of tables, where array key is table name and value potentially an alias
  * @param ExpressionBuilder $expressionBuilder Expression builder instance to add restrictions with
  * @return CompositeExpression The result of query builder expression(s)
  */
 public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder) : CompositeExpression
 {
     $constraints = [];
     foreach ($queriedTables as $tableName => $tableAlias) {
         $deletedFieldName = $GLOBALS['TCA'][$tableName]['ctrl']['delete'] ?? null;
         if (!empty($deletedFieldName)) {
             $tablePrefix = $tableAlias ?: $tableName;
             $constraints[] = $expressionBuilder->eq($tablePrefix . '.' . $deletedFieldName, 0);
         }
     }
     return $expressionBuilder->andX(...$constraints);
 }
Пример #4
0
 /**
  * Main method to build expressions for given tables
  * Evaluates the ctrl/versioningWS flag of the table and adds various workspace related restrictions if set
  *
  * @param array $queriedTables Array of tables, where array key is table name and value potentially an alias
  * @param ExpressionBuilder $expressionBuilder Expression builder instance to add restrictions with
  * @return CompositeExpression The result of query builder expression(s)
  */
 public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder) : CompositeExpression
 {
     $constraints = [];
     foreach ($queriedTables as $tableName => $tableAlias) {
         $workspaceEnabled = $GLOBALS['TCA'][$tableName]['ctrl']['versioningWS'] ?? null;
         if (!empty($workspaceEnabled)) {
             $tablePrefix = $tableAlias ?: $tableName;
             if (!$this->includeRowsForWorkspacePreview) {
                 // Filter out placeholder records (new/moved/deleted items)
                 // in case we are NOT in a versioning preview (That means we are online!)
                 $constraints[] = $expressionBuilder->lte($tablePrefix . '.t3ver_state', (int) (string) new VersionState(VersionState::DEFAULT_STATE));
             } elseif ($tableName !== 'pages') {
                 // Show only records of the live and current workspace in case we are in a versioning preview
                 $constraints[] = $expressionBuilder->orX($expressionBuilder->eq($tablePrefix . '.t3ver_wsid', 0), $expressionBuilder->eq($tablePrefix . '.t3ver_wsid', (int) $this->workspaceId));
             }
             // Filter out versioned records
             if ($this->enforceLiveRowsOnly) {
                 $constraints[] = $expressionBuilder->neq($tablePrefix . '.pid', -1);
             }
         }
     }
     return $expressionBuilder->andX(...$constraints);
 }
Пример #5
0
 /**
  * Main method to build expressions for given tables
  *
  * @param array $queriedTables Array of tables, where array key is table name and value potentially an alias
  * @param ExpressionBuilder $expressionBuilder Expression builder instance to add restrictions with
  * @return CompositeExpression The result of query builder expression(s)
  */
 public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder) : CompositeExpression
 {
     $constraints = [];
     foreach ($queriedTables as $tableName => $tableAlias) {
         $workspaceEnabled = $GLOBALS['TCA'][$tableName]['ctrl']['versioningWS'] ?? null;
         if (!empty($workspaceEnabled)) {
             $tablePrefix = $tableAlias ?: $tableName;
             $workspaceIdExpression = $expressionBuilder->eq($tablePrefix . '.t3ver_wsid', (int) $this->workspaceId);
             if ($this->includeRowsForWorkspaceOverlay) {
                 $constraints[] = $expressionBuilder->orX($workspaceIdExpression, $expressionBuilder->lte($tablePrefix . '.t3ver_state', (int) (string) new VersionState(VersionState::DEFAULT_STATE)));
             } else {
                 $comparisonExpression = $this->workspaceId === 0 ? 'neq' : 'eq';
                 $constraints[] = $workspaceIdExpression;
                 $constraints[] = $expressionBuilder->{$comparisonExpression}($tablePrefix . '.pid', -1);
             }
         }
     }
     return $expressionBuilder->andX(...$constraints);
 }
 /**
  * @param ExpressionBuilder $expressionBuilder
  * @param string $tableAlias
  * @return \Doctrine\DBAL\Query\Expression\CompositeExpression
  * @internal
  */
 protected function userConstraints(ExpressionBuilder $expressionBuilder, string $tableAlias = '') : \Doctrine\DBAL\Query\Expression\CompositeExpression
 {
     if ($tableAlias === '') {
         $tableAlias = $this->user_table;
     }
     $constraints = $expressionBuilder->andX();
     if ($this->enablecolumns['rootLevel']) {
         $constraints->add($expressionBuilder->eq($tableAlias . '.pid', 0));
     }
     if ($this->enablecolumns['disabled']) {
         $constraints->add($expressionBuilder->eq($tableAlias . '.' . $this->enablecolumns['disabled'], 0));
     }
     if ($this->enablecolumns['deleted']) {
         $constraints->add($expressionBuilder->eq($tableAlias . '.' . $this->enablecolumns['deleted'], 0));
     }
     if ($this->enablecolumns['starttime']) {
         $constraints->add($expressionBuilder->lte($tableAlias . '.' . $this->enablecolumns['starttime'], $GLOBALS['EXEC_TIME']));
     }
     if ($this->enablecolumns['endtime']) {
         $constraints->add($expressionBuilder->orX($expressionBuilder->eq($tableAlias . '.' . $this->enablecolumns['endtime'], 0), $expressionBuilder->gt($tableAlias . '.' . $this->enablecolumns['endtime'], $GLOBALS['EXEC_TIME'])));
     }
     return $constraints;
 }
 /**
  * @test
  */
 public function eqQuotesIdentifier()
 {
     $result = $this->subject->eq('aField', 1);
     $this->connectionProphet->quoteIdentifier('aField')->shouldHaveBeenCalled();
     $this->assertSame('aField = 1', $result);
 }
Пример #8
0
 /**
  * Builds a condition for filtering records by the configured match field,
  * e.g. MM_match_fields, foreign_match_fields or foreign_table_field.
  *
  * @param ExpressionBuilder $exprBuilder
  * @param ColumnMap $columnMap The column man for which the condition should be build.
  * @param string $childTableAlias The alias of the child record table used in the query.
  * @param string $parentTable The real name of the parent table (used for building the foreign_table_field condition).
  * @return string The match field conditions or an empty string.
  */
 protected function getAdditionalMatchFieldsStatement($exprBuilder, $columnMap, $childTableAlias, $parentTable = null)
 {
     $additionalWhereForMatchFields = [];
     $relationTableMatchFields = $columnMap->getRelationTableMatchFields();
     if (is_array($relationTableMatchFields) && !empty($relationTableMatchFields)) {
         foreach ($relationTableMatchFields as $fieldName => $value) {
             $additionalWhereForMatchFields[] = $exprBuilder->eq($childTableAlias . '.' . $fieldName, $this->queryBuilder->createNamedParameter($value));
         }
     }
     if (isset($parentTable)) {
         $parentTableFieldName = $columnMap->getParentTableFieldName();
         if (!empty($parentTableFieldName)) {
             $additionalWhereForMatchFields[] = $exprBuilder->eq($childTableAlias . '.' . $parentTableFieldName, $this->queryBuilder->createNamedParameter($parentTable));
         }
     }
     if (!empty($additionalWhereForMatchFields)) {
         return $exprBuilder->andX(...$additionalWhereForMatchFields);
     } else {
         return '';
     }
 }