vendor/shopware/core/System/CustomField/CustomFieldService.php line 82

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\System\CustomField;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\FetchModeHelper;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Field\BoolField;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Field\DateTimeField;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Field\Field;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\AllowHtml;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\ApiAware;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Field\FloatField;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Field\IntField;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Field\JsonField;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Field\LongTextField;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Field\PriceField;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class CustomFieldService implements EventSubscriberInterface
  17. {
  18.     /**
  19.      * @var string[]|null
  20.      */
  21.     private $customFields;
  22.     /**
  23.      * @var Connection
  24.      */
  25.     private $connection;
  26.     public function __construct(Connection $connection)
  27.     {
  28.         $this->connection $connection;
  29.     }
  30.     public function getCustomField(string $attributeName): ?Field
  31.     {
  32.         $type $this->getCustomFields()[$attributeName] ?? null;
  33.         if (!$type) {
  34.             return null;
  35.         }
  36.         switch ($type) {
  37.             case CustomFieldTypes::INT:
  38.                 return (new IntField($attributeName$attributeName))->addFlags(new ApiAware());
  39.             case CustomFieldTypes::FLOAT:
  40.                 return (new FloatField($attributeName$attributeName))->addFlags(new ApiAware());
  41.             case CustomFieldTypes::BOOL:
  42.                 return (new BoolField($attributeName$attributeName))->addFlags(new ApiAware());
  43.             case CustomFieldTypes::DATETIME:
  44.                 return (new DateTimeField($attributeName$attributeName))->addFlags(new ApiAware());
  45.             case CustomFieldTypes::TEXT:
  46.                 return (new LongTextField($attributeName$attributeName))->addFlags(new ApiAware());
  47.             case CustomFieldTypes::HTML:
  48.                 return (new LongTextField($attributeName$attributeName))->addFlags(new ApiAware(), new AllowHtml());
  49.             case CustomFieldTypes::PRICE:
  50.                 return (new PriceField($attributeName$attributeName))->addFlags(new ApiAware());
  51.             case CustomFieldTypes::JSON:
  52.             default:
  53.                 return (new JsonField($attributeName$attributeName))->addFlags(new ApiAware());
  54.         }
  55.     }
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             CustomFieldEvents::CUSTOM_FIELD_DELETED_EVENT => 'invalidateCache',
  60.             CustomFieldEvents::CUSTOM_FIELD_WRITTEN_EVENT => 'invalidateCache',
  61.         ];
  62.     }
  63.     /**
  64.      * @internal
  65.      */
  66.     public function invalidateCache(): void
  67.     {
  68.         $this->customFields null;
  69.     }
  70.     /**
  71.      * @return string[]
  72.      */
  73.     private function getCustomFields(): array
  74.     {
  75.         if ($this->customFields !== null) {
  76.             return $this->customFields;
  77.         }
  78.         $fields $this->connection->fetchAll('SELECT `name`, `type` FROM `custom_field` WHERE `active` = 1');
  79.         $this->customFields FetchModeHelper::keyPair($fields);
  80.         return $this->customFields;
  81.     }
  82. }