diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php index 95936c076cc9742fc8f253f8a147f74c07b6fae0..0e4564bdcca9d8d6514adec5f8f26ad50f68aea1 100644 --- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php +++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php @@ -674,23 +674,24 @@ class Typo3DbQueryParser */ protected function getVisibilityConstraintStatement(QuerySettingsInterface $querySettings, $tableName, $tableAlias) { - $statement = ''; - if (is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) { - $ignoreEnableFields = $querySettings->getIgnoreEnableFields(); - $enableFieldsToBeIgnored = $querySettings->getEnableFieldsToBeIgnored(); - $includeDeleted = $querySettings->getIncludeDeleted(); - if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface - && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend() - ) { - $statement .= $this->getFrontendConstraintStatement($tableName, $ignoreEnableFields, $enableFieldsToBeIgnored, $includeDeleted); - } else { - // applicationType backend - $statement .= $this->getBackendConstraintStatement($tableName, $ignoreEnableFields, $includeDeleted); - } - if (!empty($statement)) { - $statement = $this->replaceTableNameWithAlias($statement, $tableName, $tableAlias); - $statement = strtolower(substr($statement, 1, 3)) === 'and' ? substr($statement, 5) : $statement; - } + if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) { + return ''; + } + + $ignoreEnableFields = $querySettings->getIgnoreEnableFields(); + $enableFieldsToBeIgnored = $querySettings->getEnableFieldsToBeIgnored(); + $includeDeleted = $querySettings->getIncludeDeleted(); + if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface + && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend() + ) { + $statement = $this->getFrontendConstraintStatement($tableName, $ignoreEnableFields, $enableFieldsToBeIgnored, $includeDeleted); + } else { + // applicationType backend + $statement = $this->getBackendConstraintStatement($tableName, $ignoreEnableFields, $includeDeleted); + } + if (!empty($statement)) { + $statement = $this->replaceTableNameWithAlias($statement, $tableName, $tableAlias); + $statement = strtolower(substr($statement, 1, 3)) === 'and' ? substr($statement, 5) : $statement; } return $statement; } @@ -853,7 +854,7 @@ class Typo3DbQueryParser */ protected function getPageIdStatement($tableName, $tableAlias, array $storagePageIds) { - if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'])) { + if (!is_array($GLOBALS['TCA'][$tableName]['ctrl'] ?? null)) { return ''; } diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php new file mode 100644 index 0000000000000000000000000000000000000000..7f21607f4b41dba3d3a0f2ae8f502e2acf3785cc --- /dev/null +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Model/RegistryEntry.php @@ -0,0 +1,38 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +namespace TYPO3Tests\BlogExample\Domain\Model; + +use TYPO3\CMS\Extbase\DomainObject\AbstractValueObject; + +/** + * A registry entry + */ +class RegistryEntry extends AbstractValueObject +{ + protected string $name = ''; + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } +} diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..7442fed9e20d0d2189196baa878185affc17204d --- /dev/null +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/RegistryEntryRepository.php @@ -0,0 +1,27 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +namespace TYPO3Tests\BlogExample\Domain\Repository; + +use TYPO3\CMS\Extbase\Persistence\Repository; +use TYPO3Tests\BlogExample\Domain\Model\RegistryEntry; + +/** + * A repository for registry entries + * @extends Repository<RegistryEntry> + */ +class RegistryEntryRepository extends Repository {} diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php new file mode 100644 index 0000000000000000000000000000000000000000..2d57b61e7b366a66846c4656e465a358001462d6 --- /dev/null +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Configuration/TCA/tx_blogexample_domain_model_registryentry.php @@ -0,0 +1,14 @@ +<?php + +declare(strict_types=1); + +return [ + 'columns' => [ + 'name' => [ + 'label' => 'LLL:EXT:blog_example/Resources/Private/Language/locallang_db.xlf:tx_blogexample_domain_model_registryentry.name', + 'config' => [ + 'type' => 'input', + ], + ], + ], +]; diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf index 39e9964776ad9556e2670356fb1a4ee75a9c8935..ee401cfdab1ba0e55cfe195b1db19750be0aa991 100644 --- a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Resources/Private/Language/locallang_db.xlf @@ -111,6 +111,9 @@ <trans-unit id="tx_blogexample_domain_model_comment.content" resname="tx_blogexample_domain_model_comment.content"> <source>Content</source> </trans-unit> + <trans-unit id="tx_blogexample_domain_model_registryentry.name" resname="tx_blogexample_domain_model_registryentry.name"> + <source>Registry Entry Key</source> + </trans-unit> <trans-unit id="tx_blogexample_domain_model_tag" resname="tx_blogexample_domain_model_tag"> <source>Tag</source> </trans-unit> diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql index f105a7eb0c58fb29f99e3c19b96330cb6d9833da..6af59f31c715a9dbc98f68e94a9c42eb54408354 100644 --- a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/ext_tables.sql @@ -53,6 +53,13 @@ CREATE TABLE tx_blogexample_domain_model_person ( tags_special int(11) unsigned DEFAULT '0' NOT NULL ); +# +# Table structure for table 'tx_blogexample_domain_model_registryentry' +# +CREATE TABLE tx_blogexample_domain_model_registryentry ( + name varchar(255) DEFAULT '' NOT NULL +); + # # Table structure for table 'tx_blogexample_domain_model_tag' # diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php b/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php index cf5d6a1f05c95d92236f8f078ebaf7df8c1cb4a6..8cc41b33274846b1efcd6199ba6ba2685d2f9f18 100644 --- a/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php +++ b/typo3/sysext/extbase/Tests/Functional/Persistence/Generic/Storage/Typo3DbQueryParserTest.php @@ -36,6 +36,7 @@ use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings; use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase; use TYPO3Tests\BlogExample\Domain\Repository\BlogRepository; +use TYPO3Tests\BlogExample\Domain\Repository\RegistryEntryRepository; final class Typo3DbQueryParserTest extends FunctionalTestCase { @@ -799,4 +800,25 @@ final class Typo3DbQueryParserTest extends FunctionalTestCase $compositeExpression = $queryBuilder->getQueryPart('where'); self::assertMatchesRegularExpression($expectedSql, (string)$compositeExpression); } + + /** + * @test + */ + public function tcaWithoutCtrlCreatesAValidSQLStatement(): void + { + $GLOBALS['TYPO3_REQUEST'] = (new ServerRequest()) + ->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE); + $registryEntryRepository = $this->get(RegistryEntryRepository::class); + $querySettings = new Typo3QuerySettings(new Context(), $this->get(ConfigurationManagerInterface::class)); + + $query = $registryEntryRepository->createQuery(); + $query->setQuerySettings($querySettings); + + $typo3DbQueryParser = $this->get(Typo3DbQueryParser::class); + $queryBuilder = $typo3DbQueryParser->convertQueryToDoctrineQueryBuilder($query); + + $compositeExpression = $queryBuilder->getQueryPart('where'); + self::assertStringNotContainsString('hidden', (string)$compositeExpression); + self::assertStringNotContainsString('deleted', (string)$compositeExpression); + } }