<?php declare(strict_types=1);namespace Shopware\Core\System\Snippet\Subscriber;use Doctrine\DBAL\Connection;use Shopware\Core\Defaults;use Shopware\Core\Framework\DataAbstractionLayer\EntityWriteResult;use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent;use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;use Shopware\Core\Framework\Log\Package;use Shopware\Core\Framework\Uuid\Uuid;use Symfony\Component\EventDispatcher\EventSubscriberInterface;/** * @deprecated tag:v6.5.0 - reason:becomes-internal - EventSubscribers will become internal in v6.5.0 */#[Package('system-settings')]class CustomFieldSubscriber implements EventSubscriberInterface{ private const CUSTOM_FIELD_ID_FIELD = 'custom_field_id'; private Connection $connection; /** * @internal */ public function __construct(Connection $connection) { $this->connection = $connection; } public static function getSubscribedEvents(): array { return [ 'custom_field.written' => 'customFieldIsWritten', 'custom_field.deleted' => 'customFieldIsDeleted', ]; } public function customFieldIsWritten(EntityWrittenEvent $event): void { $snippets = []; $snippetSets = null; foreach ($event->getWriteResults() as $writeResult) { if (!isset($writeResult->getPayload()['config']['label']) || empty($writeResult->getPayload()['config']['label'])) { continue; } if ($writeResult->getOperation() === EntityWriteResult::OPERATION_INSERT) { if ($snippetSets === null) { $snippetSets = $this->connection->fetchAllAssociative('SELECT id, iso FROM snippet_set'); } if (empty($snippetSets)) { return; } $this->setInsertSnippets($writeResult, $snippetSets, $snippets); } } if (empty($snippets)) { return; } foreach ($snippets as $snippet) { $this->connection->executeStatement( 'INSERT INTO snippet (`id`, `snippet_set_id`, `translation_key`, `value`, `author`, `custom_fields`, `created_at`) VALUES (:id, :setId, :translationKey, :value, :author, :customFields, :createdAt) ON DUPLICATE KEY UPDATE `value` = :value', $snippet ); } } public function customFieldIsDeleted(EntityDeletedEvent $event): void { $this->connection->executeStatement( 'DELETE FROM `snippet` WHERE JSON_EXTRACT(`custom_fields`, "$.custom_field_id") IN (:customFieldIds)', ['customFieldIds' => $event->getIds()], ['customFieldIds' => Connection::PARAM_STR_ARRAY] ); } /** * @param list<array<string, string>> $snippetSets * @param array<string, mixed> $snippets */ private function setInsertSnippets(EntityWriteResult $writeResult, array $snippetSets, array &$snippets): void { $name = $writeResult->getPayload()['name']; $labels = $writeResult->getPayload()['config']['label']; foreach ($snippetSets as $snippetSet) { $label = $name; $iso = $snippetSet['iso']; if (isset($labels[$iso])) { $label = $labels[$iso]; } $snippets[] = [ 'id' => Uuid::randomBytes(), 'setId' => $snippetSet['id'], 'translationKey' => 'customFields.' . $name, 'value' => $label, 'author' => 'System', 'customFields' => json_encode([ self::CUSTOM_FIELD_ID_FIELD => $writeResult->getPrimaryKey(), ]), 'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT), ]; } }}