vendor/ibexa/activity-log/src/bundle/EventSubscriber/PageBuilder/AbstractChoiceAttributeSerializationSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\ActivityLog\EventSubscriber\PageBuilder;
  8. use Ibexa\Contracts\FieldTypePage\FieldType\Page\Block\Definition\BlockAttributeDefinition;
  9. use Ibexa\FieldTypePage\Event\AttributeSerializationEvent;
  10. use Ibexa\FieldTypePage\Event\PageEvents;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. /**
  13.  * @template T of object
  14.  */
  15. abstract class AbstractChoiceAttributeSerializationSubscriber implements EventSubscriberInterface
  16. {
  17.     protected const SERIALIZATION_SEPARATOR ',';
  18.     abstract protected function supportsAttribute(BlockAttributeDefinition $attributeDefinition): bool;
  19.     /**
  20.      * @return T|null
  21.      */
  22.     abstract protected function deserializeSingleItem(string $serializedValue): ?object;
  23.     /**
  24.      * @phpstan-param T $value
  25.      */
  26.     abstract protected function serializeSingleItem(object $value): string;
  27.     protected function isMultipleValues(BlockAttributeDefinition $attributeDefinition): bool
  28.     {
  29.         return $attributeDefinition->getOptions()['multiple'] ?? false;
  30.     }
  31.     public static function getSubscribedEvents(): array
  32.     {
  33.         return [
  34.             PageEvents::ATTRIBUTE_SERIALIZATION => ['onAttributeSerialization'10],
  35.             PageEvents::ATTRIBUTE_DESERIALIZATION => ['onAttributeDeserialization'10],
  36.         ];
  37.     }
  38.     final public function onAttributeSerialization(AttributeSerializationEvent $event): void
  39.     {
  40.         $attributeDefinition $event->getAttributeDefinition();
  41.         if ($attributeDefinition === null || !$this->supportsAttribute($attributeDefinition)) {
  42.             return;
  43.         }
  44.         $deserializedValue $event->getDeserializedValue();
  45.         if ($deserializedValue === null) {
  46.             return;
  47.         }
  48.         if (!is_array($deserializedValue)) {
  49.             $deserializedValue = [$deserializedValue];
  50.         }
  51.         $serializedValue implode(
  52.             self::SERIALIZATION_SEPARATOR,
  53.             array_map([$this'serializeSingleItem'], $deserializedValue),
  54.         );
  55.         $event->setSerializedValue($serializedValue);
  56.         $event->stopPropagation();
  57.     }
  58.     final public function onAttributeDeserialization(AttributeSerializationEvent $event): void
  59.     {
  60.         $serializedValue $event->getSerializedValue();
  61.         if (!is_string($serializedValue)) {
  62.             return;
  63.         }
  64.         $attributeDefinition $event->getAttributeDefinition();
  65.         if ($attributeDefinition === null || !$this->supportsAttribute($attributeDefinition)) {
  66.             return;
  67.         }
  68.         if (!$this->isMultipleValues($attributeDefinition)) {
  69.             $object $this->deserializeSingleItem($serializedValue);
  70.             if ($object !== null) {
  71.                 $event->setDeserializedValue($object);
  72.             }
  73.             $event->stopPropagation();
  74.             return;
  75.         }
  76.         $serializedValues explode(self::SERIALIZATION_SEPARATOR$serializedValue);
  77.         $matches = [];
  78.         foreach ($serializedValues as $value) {
  79.             $object $this->deserializeSingleItem($value);
  80.             if ($object !== null) {
  81.                 $matches[] = $object;
  82.             }
  83.         }
  84.         $event->setDeserializedValue($matches);
  85.         $event->stopPropagation();
  86.     }
  87. }