/** * 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); }
/** * Main method to build expressions for given tables * Evaluates the ctrl/enablecolumns/starttime 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) * @throws \RuntimeException */ public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder) : CompositeExpression { $constraints = []; foreach ($queriedTables as $tableName => $tableAlias) { $startTimeFieldName = $GLOBALS['TCA'][$tableName]['ctrl']['enablecolumns']['starttime'] ?? null; if (!empty($startTimeFieldName)) { if (empty($this->accessTimeStamp)) { throw new \RuntimeException('accessTimeStamp needs to be set to an integer value, but is empty! Maybe $GLOBALS[\'SIM_ACCESS_TIME\'] has been overridden somewhere?', 1462820645); } $tablePrefix = $tableAlias ?: $tableName; $constraints[] = $expressionBuilder->lte($tablePrefix . '.' . $startTimeFieldName, (int) $this->accessTimeStamp); } } return $expressionBuilder->andX(...$constraints); }
/** * 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); }
/** * 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); }
/** * 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); }
/** * @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; }
/** * @param string $tableName The table name to query * @param string|null $tableAlias The table alias to use for constraints. $tableName used when empty. * @param bool $showHidden Select hidden records * @param string[] $ignoreFields Names of enable columns to be ignored * @param bool $noVersionPreview If set, enableFields will be applied regardless of any versioning preview * settings which might otherwise disable enableFields * @return \TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression */ protected function getEnableFieldConstraints(string $tableName, string $tableAlias = null, bool $showHidden = false, array $ignoreFields = [], bool $noVersionPreview = false) : CompositeExpression { $queryContext = $this->queryContext; $tableConfig = $queryContext->getTableConfig($tableName); if (empty($tableConfig)) { // No restrictions for this table, not configured by TCA return $this->expressionBuilder->andX(); } $tablePrefix = empty($tableAlias) ? $tableName : $tableAlias; $constraints = []; $expressionBuilder = $this->expressionBuilder; // Restrict based on deleted flag of records if (!empty($tableConfig['delete'])) { $constraints[] = $expressionBuilder->eq($tablePrefix . '.deleted', 0); } // Restrict based on Workspaces / Versioning if (!empty($tableConfig['versioningWS'])) { if (!$queryContext->getIncludePlaceholders()) { // Filter out placeholder records (new/moved/deleted items) in case we are NOT in a versioning preview // (This means that means we are online!) $constraints[] = $expressionBuilder->lte($tablePrefix . '.t3ver_state', 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', $queryContext->getCurrentWorkspace())); } // Filter out versioned records if (!$noVersionPreview && !in_array('pid', $ignoreFields)) { $constraints[] = $expressionBuilder->neq($tablePrefix . '.pid', -1); } } // Restrict based on enable fields. In case of versioning-preview, enableFields are ignored // and later checked in versionOL(). if (is_array($tableConfig['enablecolumns']) && (!$queryContext->getIncludePlaceholders() || empty($tableConfig['versioningWS']) || $noVersionPreview)) { $enableColumns = $tableConfig['enablecolumns']; // Filter out disabled records if (isset($enableColumns['disabled']) && !$showHidden && !in_array('disabled', $ignoreFields)) { $constraints[] = $expressionBuilder->eq($tablePrefix . '.' . $enableColumns['disabled'], 0); } // Filter out records where the starttime has not yet been reached. if (isset($enableColumns['starttime']) && !in_array('starttime', $ignoreFields)) { $constraints[] = $expressionBuilder->lte($tablePrefix . '.' . $enableColumns['starttime'], $queryContext->getAccessTime()); } // Filter out records with a set endtime where the time is in the past. if (isset($enableColumns['endtime']) && !in_array('endtime', $ignoreFields)) { $constraints[] = $expressionBuilder->orX($expressionBuilder->eq($tablePrefix . '.' . $enableColumns['endtime'], 0), $expressionBuilder->gt($tablePrefix . '.' . $enableColumns['endtime'], $queryContext->getAccessTime())); } // Filter out records based on the frondend user groups if ($enableColumns['fe_group'] && !in_array('fe_group', $ignoreFields)) { $constraints[] = $this->getFrontendUserGroupConstraints($tablePrefix, $enableColumns['fe_group']); } // Call hook functions for additional enableColumns if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_page.php']['addEnableColumns'])) { $_params = ['table' => $tableName, 'tableAlias' => $tableAlias, 'tablePrefix' => $tablePrefix, 'show_hidden' => $showHidden, 'ignore_array' => $ignoreFields, 'ctrl' => $tableConfig]; foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_page.php']['addEnableColumns'] as $_funcRef) { $constraint = GeneralUtility::callUserFunction($_funcRef, $_params, $this); $constraints[] = preg_replace('/^(?:AND[[:space:]]*)+/i', '', trim($constraint)); } } } return $expressionBuilder->andX(...$constraints); }
/** * @test */ public function literalQuotesValue() { $this->connectionProphet->quote('aField', 'Doctrine\\DBAL\\Types\\StringType')->shouldBeCalled()->willReturn('"aField"'); $result = $this->subject->literal('aField', 'Doctrine\\DBAL\\Types\\StringType'); $this->assertSame('"aField"', $result); }
/** * 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 ''; } }