From c444c278698780709488eaed1cdeff5e77576cb2 Mon Sep 17 00:00:00 2001 From: Lukas Neugebauer <25110308+lneugebauer@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:05:24 +0100 Subject: [PATCH] fix: asset usage count --- Classes/Aspects/AssetUsageAspect.php | 50 +++++++++++ .../Service/RepeatableAssetUsageHelper.php | 82 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 Classes/Aspects/AssetUsageAspect.php create mode 100644 Classes/Service/RepeatableAssetUsageHelper.php diff --git a/Classes/Aspects/AssetUsageAspect.php b/Classes/Aspects/AssetUsageAspect.php new file mode 100644 index 0000000..d9f994c --- /dev/null +++ b/Classes/Aspects/AssetUsageAspect.php @@ -0,0 +1,50 @@ +getRelatedNodes())") + * @param JoinPointInterface $joinPoint + * @return array + */ + public function extendGetRelatedNodes(JoinPointInterface $joinPoint): array + { + $originalNodes = $joinPoint->getAdviceChain()->proceed($joinPoint); + /** @var AssetInterface $asset */ + $asset = $joinPoint->getMethodArgument('asset'); + $repeatableFieldNodes = $this->repeatableAssetUsageHelper->findNodesWithAssetInRepeatableFields($asset); + + $allNodes = $originalNodes; + $existingIdentifiers = array_map(fn($node) => $node->getIdentifier(), $originalNodes); + + foreach ($repeatableFieldNodes as $node) { + if (!in_array($node->getIdentifier(), $existingIdentifiers, true)) { + $allNodes[] = $node; + } + } + + return $allNodes; + } +} diff --git a/Classes/Service/RepeatableAssetUsageHelper.php b/Classes/Service/RepeatableAssetUsageHelper.php new file mode 100644 index 0000000..7b5aaa1 --- /dev/null +++ b/Classes/Service/RepeatableAssetUsageHelper.php @@ -0,0 +1,82 @@ + + */ + public function findNodesWithAssetInRepeatableFields(AssetInterface $asset): array + { + $assetIdentifier = $this->persistenceManager->getIdentifierByObject($asset); + $identifiers = [$assetIdentifier]; + + if ($asset instanceof Image) { + foreach ($asset->getVariants() as $variant) { + $identifiers[] = $this->persistenceManager->getIdentifierByObject($variant); + } + } + + $queryBuilder = $this->entityManager->createQueryBuilder(); + $queryBuilder->select('n') + ->from(NodeData::class, 'n') + ->where('n.path LIKE :pathPrefix'); + + $queryBuilder->setParameter('pathPrefix', SiteService::SITES_ROOT_PATH . '%'); + + $constraints = []; + $parameters = ['pathPrefix' => SiteService::SITES_ROOT_PATH . '%']; + $identifierIndex = 0; + + foreach ($identifiers as $identifier) { + $lowerIdentifier = strtolower($identifier); + + $constraints[] = '(LOWER(NEOSCR_TOSTRING(n.properties)) LIKE :identity' . $identifierIndex . ')'; + $parameters['identity' . $identifierIndex] = '%"__identity": "' . $lowerIdentifier . '"%'; + $identifierIndex++; + + $constraints[] = '(LOWER(NEOSCR_TOSTRING(n.properties)) LIKE :plain' . $identifierIndex . ')'; + $parameters['plain' . $identifierIndex] = '%": "' . $lowerIdentifier . '"%'; + $identifierIndex++; + } + + if (!empty($constraints)) { + $queryBuilder->andWhere(implode(' OR ', $constraints)); + $queryBuilder->setParameters($parameters); + } + + return $queryBuilder->getQuery()->getResult(); + } +}