diff --git a/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php b/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php index f79f885..f6aa497 100644 --- a/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php +++ b/Classes/Domain/Repository/AbstractDatabaseResourceRepository.php @@ -20,6 +20,8 @@ abstract class AbstractDatabaseResourceRepository implements ApiResourceReposito public const ALLOWED_FILTER_OPERATORS = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in']; + private const DUPLICATE_IDENTIFIER_SEPARATOR = '#'; + /** @var string */ protected $identifier = self::DEFAULT_IDENTIFIER; @@ -87,7 +89,8 @@ public function findByFiltersWithCursor(array $filters, int $limit, ?string $cur $result = $query->execute()->fetchAllAssociative(); - $result = $this->resolveOverlay($context, $result); + $result = \array_map($this->createDeduplicator(), $result); + $result = \array_map($this->createOverlayMapper($context), $result); $nextCursor = !empty($result) ? \end($result)[$this->identifier] : null; @@ -103,7 +106,7 @@ public function findOneByIdentifier($identifier, $context = null): ?array $result = $query->execute()->fetchAssociative() ?: []; - $result = $this->resolveOverlay($context, $result); + $result = $this->createOverlayMapper($context)($result); if ($result) { return $this->createMetaMapper()($result); @@ -119,7 +122,9 @@ public function findByIdentifiers(array $identifiers, $context = null, array $fi $result = $query->execute()->fetchAllAssociative(); - $result = $this->resolveOverlay($context, $result); + $result = \array_map($this->createDeduplicator(), $result); + + $result = \array_map($this->createOverlayMapper($context), $result); return \array_map($this->createMetaMapper(), $result); } @@ -133,9 +138,26 @@ public function findByPageIdentifier($pageIdentifier): array // TODO: add overlay? + $result = \array_map($this->createDeduplicator(), $result); + return \array_map($this->createMetaMapper(), $result); } + protected function createDeduplicator(): \Closure + { + $countPerId = []; + return function (array $resource) use (&$countPerId): array { + $identifier = $resource[$this->identifier]; + $countPerId[$identifier] = isset($countPerId[$identifier]) ? $countPerId[$identifier] + 1 : 0; + + if ($countPerId[$identifier] > 0) { + $resource[$this->identifier] = $identifier . self::DUPLICATE_IDENTIFIER_SEPARATOR . $countPerId[$identifier]; + } + + return $resource; + }; + } + protected function createMetaMapper(): \Closure { $tableName = $this->tableName; @@ -155,15 +177,17 @@ protected function createMetaMapper(): \Closure }; } - protected function resolveOverlay(?Context $context, array $result): array + protected function createOverlayMapper(?Context $context): \Closure { - if (null !== $context && $result) { - $pageRepository = GeneralUtility::makeInstance( - \TYPO3\CMS\Core\Domain\Repository\PageRepository::class, - $context - ); - $overlayResult = $pageRepository->getLanguageOverlay($this->tableName, $result); - } - return $overlayResult ?? $result; + return function (array $resource) use ($context): array { + if (null !== $context && $resource) { + $pageRepository = GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Domain\Repository\PageRepository::class, + $context + ); + $overlayResult = $pageRepository->getLanguageOverlay($this->tableName, $resource); + } + return $overlayResult ?? $resource; + }; } } diff --git a/Classes/Domain/Transformer/FileReferenceTransformer.php b/Classes/Domain/Transformer/FileReferenceTransformer.php index 926820e..cd694ef 100644 --- a/Classes/Domain/Transformer/FileReferenceTransformer.php +++ b/Classes/Domain/Transformer/FileReferenceTransformer.php @@ -13,8 +13,6 @@ class FileReferenceTransformer extends TransformerAbstract { - protected $defaultIncludes = []; - /** @var string */ protected $identifier; diff --git a/Classes/IncludeHandler/PageRelationIncludeHandler.php b/Classes/IncludeHandler/PageRelationIncludeHandler.php index 98ca641..0c81a7c 100644 --- a/Classes/IncludeHandler/PageRelationIncludeHandler.php +++ b/Classes/IncludeHandler/PageRelationIncludeHandler.php @@ -8,6 +8,7 @@ use DFAU\ToujouApi\Configuration\ConfigurationManager; use DFAU\ToujouApi\Domain\Repository\PageRelationRepository; use DFAU\ToujouApi\Domain\Repository\PageRepository; +use DFAU\ToujouApi\Transformer\ResourceTransformerInterface; use League\Fractal\Resource\Collection; use League\Fractal\Resource\ResourceInterface; use League\Fractal\Scope; @@ -53,7 +54,7 @@ public function handleInclude(Scope $scope, string $includeName, $data, callable throw new \InvalidArgumentException('The given repository "' . \get_class($repository) . '" has to implement the "' . \DFAU\ToujouApi\Domain\Repository\PageRelationRepository::class . '".', 1563210118); } - /** @var ResourceInterface $transformer */ + /** @var ResourceTransformerInterface $transformer */ $transformer = $cascader->create($resourceDefinition['transformer'][\Cascader\Cascader::ARGUMENT_CLASS], $resourceDefinition['transformer']); return new Collection( diff --git a/Classes/IncludeHandler/TcaResourceIncludeHandler.php b/Classes/IncludeHandler/TcaResourceIncludeHandler.php index 57ca26c..561c347 100644 --- a/Classes/IncludeHandler/TcaResourceIncludeHandler.php +++ b/Classes/IncludeHandler/TcaResourceIncludeHandler.php @@ -6,6 +6,7 @@ use Cascader\Cascader; use DFAU\ToujouApi\Configuration\ConfigurationManager; +use DFAU\ToujouApi\Transformer\ResourceTransformerInterface; use League\Fractal\Resource\Collection; use League\Fractal\Resource\Item; use League\Fractal\Resource\ResourceInterface; @@ -82,7 +83,7 @@ public function handleInclude(Scope $scope, string $includeName, $data, callable $repository = $cascader->create($resourceDefinition['repository'][\Cascader\Cascader::ARGUMENT_CLASS], $resourceDefinition['repository']); - /** @var ResourceInterface $transformer */ + /** @var ResourceTransformerInterface $transformer */ $transformer = $cascader->create($resourceDefinition['transformer'][\Cascader\Cascader::ARGUMENT_CLASS], $resourceDefinition['transformer']); if (Item::class === $resourceType) { diff --git a/ext_emconf.php b/ext_emconf.php index 42cc36e..79ae5c7 100755 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -15,5 +15,5 @@ 'depends' => [], 'conflicts' => [], 'suggests' => [], - ] + ], ]; diff --git a/ext_tables.php b/ext_tables.php index f68dc3a..0db803d 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -1,22 +1,15 @@ - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordTypeValue::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordTypeValue::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexProcess::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexProcess::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessShowitem::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessShowitem::class], - \TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem::class => - $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordTypeValue::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordTypeValue::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexProcess::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexProcess::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessShowitem::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessShowitem::class], + \TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem::class => $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['tcaDatabaseRecord'][\TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem::class], \DFAU\ToujouApi\Form\DatabaseRowDateTimeFields::class => [ 'depends' => [\TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca::class], ],