['leadfield:read'], 'swagger_definition_name' => 'Read', ], denormalizationContext: [ 'groups' => ['leadfield:write'], 'swagger_definition_name' => 'Write', ] )] class LeadField extends FormEntity implements CacheInvalidateInterface, UuidInterface { use UuidTrait; public const MAX_VARCHAR_LENGTH = 191; public const CACHE_NAMESPACE = 'LeadField'; public const TYPES_SUPPORTING_LENGTH = [ 'text', 'select', 'phone', 'url', 'email', ]; public const ENTITY_NAME = 'lead_field'; /** * @var int */ #[Groups(['leadfield:read'])] private $id; private bool $isCloned = false; /** * @var string */ #[Groups(['leadfield:read', 'leadfield:write'])] private $label; /** * @var string */ #[Groups(['leadfield:read', 'leadfield:write'])] private $alias; /** * @var string */ #[Groups(['leadfield:read', 'leadfield:write'])] private $type = 'text'; /** * @var string|null */ #[Groups(['leadfield:read', 'leadfield:write'])] private $group = 'core'; /** * @var string|null */ #[Groups(['leadfield:read', 'leadfield:write'])] private $defaultValue; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isRequired = false; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isFixed = false; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isVisible = true; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isShortVisible = false; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isListable = true; /** * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isPubliclyUpdatable = false; /** * @var bool|null */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isUniqueIdentifer = false; /** * Workaround for incorrectly spelled $isUniqueIdentifer. * * @var bool */ #[Groups(['leadfield:read', 'leadfield:write'])] private $isUniqueIdentifier = false; #[Groups(['leadfield:read', 'leadfield:write'])] private ?int $charLengthLimit = 64; /** * @var int|null */ #[Groups(['leadfield:read', 'leadfield:write'])] private $order = 1; /** * @var string|null */ #[Groups(['leadfield:read', 'leadfield:write'])] private $object = 'lead'; /** * @var array */ #[Groups(['leadfield:read', 'leadfield:write'])] private $properties = []; #[Groups(['leadfield:read', 'leadfield:write'])] private bool $isIndex = false; /** * The column in lead_fields table was not created yet if this property is true. * Entity cannot be published and we cannot work with it until column is created. */ #[Groups(['leadfield:read'])] private bool $columnIsNotCreated = false; /** * The column in lead_fields table was not removed yet if this property is true. */ #[Groups(['leadfield:read'])] private bool $columnIsNotRemoved = false; /** * This property contains an original value for $isPublished. * $isPublished is always set on false if $columnIsNotCreated is true. */ #[Groups(['leadfield:read'])] private bool $originalIsPublishedValue = false; /** * @var CustomFieldObject */ private $customFieldObject; public function __clone() { $this->id = null; $this->isCloned = true; $this->order = 0; $this->isFixed = false; parent::__clone(); } public static function loadMetadata(ORM\ClassMetadata $metadata): void { $builder = new ClassMetadataBuilder($metadata); $builder->addLifecycleEvent('identifierWorkaround', 'postLoad'); $builder->setTable('lead_fields') ->setCustomRepositoryClass(LeadFieldRepository::class) ->addIndex(['object', 'field_order', 'is_published'], 'idx_object_field_order_is_published'); $builder->addId(); $builder->addField('label', 'string'); $builder->addField('alias', 'string'); $builder->createField('type', 'string') ->length(50) ->build(); $builder->createField('group', 'string') ->columnName('field_group') ->nullable() ->build(); $builder->createField('defaultValue', 'string') ->columnName('default_value') ->nullable() ->build(); $builder->createField('isRequired', 'boolean') ->columnName('is_required') ->build(); $builder->createField('isFixed', 'boolean') ->columnName('is_fixed') ->build(); $builder->createField('isVisible', 'boolean') ->columnName('is_visible') ->build(); $builder->createField('isShortVisible', 'boolean') ->columnName('is_short_visible') ->nullable(false) ->option('default', false) ->build(); $builder->createField('isListable', 'boolean') ->columnName('is_listable') ->build(); $builder->createField('isPubliclyUpdatable', 'boolean') ->columnName('is_publicly_updatable') ->build(); $builder->addNullableField('isUniqueIdentifer', 'boolean', 'is_unique_identifer'); $builder->createField('isIndex', 'boolean') ->columnName('is_index') ->option('default', false) ->nullable(false) ->build(); $builder->createField('charLengthLimit', 'integer') ->columnName('char_length_limit') ->nullable() ->build(); $builder->createField('order', 'integer') ->columnName('field_order') ->nullable() ->build(); $builder->createField('object', 'string') ->nullable() ->build(); $builder->createField('properties', 'array') ->nullable() ->build(); $builder->createField('columnIsNotCreated', 'boolean') ->columnName('column_is_not_created') ->option('default', false) ->build(); $builder->createField('columnIsNotRemoved', Types::BOOLEAN) ->columnName('column_is_not_removed') ->option('default', false) ->build(); $builder->createField('originalIsPublishedValue', 'boolean') ->columnName('original_is_published_value') ->option('default', false) ->build(); static::addUuidField($builder); } public static function loadValidatorMetadata(ClassMetadata $metadata): void { $metadata->addPropertyConstraint('label', new Assert\NotBlank( ['message' => 'mautic.lead.field.label.notblank'] )); $metadata->addPropertyConstraint('label', new Assert\Length([ 'max' => 191, 'maxMessage' => 'mautic.lead.field.label.maxlength', ])); $metadata->addConstraint(new UniqueEntity([ 'fields' => ['alias'], 'message' => 'mautic.lead.field.alias.unique', ])); $metadata->addConstraint(new Assert\Callback( function (LeadField $field, ExecutionContextInterface $context): void { $violations = $context->getValidator()->validate($field, [new FieldAliasKeyword()]); if ($violations->count() > 0) { $context->buildViolation($violations->get(0)->getMessage()) ->atPath('alias') ->addViolation(); } }, )); $metadata->addConstraint(new LeadFieldMinimumLength()); } /** * Prepares the metadata for API usage. */ public static function loadApiMetadata(ApiMetadataDriver $metadata): void { $metadata->setGroupPrefix('leadField') ->addListProperties( [ 'id', 'label', 'alias', 'type', 'group', 'order', 'object', ] ) ->addProperties( [ 'defaultValue', 'isRequired', 'isFixed', 'isListable', 'isVisible', 'isVisible', 'isShortVisible', 'isUniqueIdentifier', 'isPubliclyUpdatable', 'properties', 'isIndex', 'charLengthLimit', ] ) ->build(); } public function setId(?int $id = null): void { $this->id = $id; } /** * Get id. * * @return int */ public function getId() { return $this->id; } public function getIsCloned(): bool { return $this->isCloned; } /** * Set label. * * @param string $label * * @return LeadField */ public function setLabel($label) { $this->isChanged('label', $label); $this->label = $label; return $this; } /** * Get label. * * @return string */ public function getLabel() { return $this->label; } /** * Proxy function to setLabel(). * * @param string $label * * @return LeadField */ public function setName($label) { $this->isChanged('label', $label); return $this->setLabel($label); } /** * Proxy function for getLabel(). * * @return string */ public function getName() { return $this->getLabel(); } /** * Set type. * * @param string $type * * @return LeadField */ public function setType($type) { $this->isChanged('type', $type); $this->type = $type; return $this; } /** * Get type. * * @return string */ public function getType() { return $this->type; } /** * Set defaultValue. * * @param string|array $defaultValue * * @return LeadField */ public function setDefaultValue($defaultValue) { $defaultValue = is_array($defaultValue) ? implode('|', $defaultValue) : $defaultValue; $this->isChanged('defaultValue', $defaultValue); $this->defaultValue = $defaultValue; return $this; } /** * Get defaultValue. * * @return string */ public function getDefaultValue() { return $this->defaultValue; } /** * Set isRequired. * * @param bool $isRequired * * @return LeadField */ public function setIsRequired($isRequired) { $this->isChanged('isRequired', $isRequired); $this->isRequired = $isRequired; return $this; } /** * Get isRequired. * * @return bool */ public function getIsRequired() { return $this->isRequired; } /** * Proxy to getIsRequired(). * * @return bool */ public function isRequired() { return $this->getIsRequired(); } /** * Set isFixed. * * @param bool $isFixed * * @return LeadField */ public function setIsFixed($isFixed) { $this->isFixed = $isFixed; return $this; } /** * Get isFixed. * * @return bool */ public function getIsFixed() { return $this->isFixed; } /** * Proxy to getIsFixed(). * * @return bool */ public function isFixed() { return $this->getIsFixed(); } /** * @param mixed[] $properties * * @return LeadField */ public function setProperties($properties) { $this->isChanged('properties', $properties); $this->properties = $properties; return $this; } /** * @return mixed[] */ public function getProperties() { return $this->properties; } /** * Set order. * * @param int $order * * @return LeadField */ public function setOrder($order) { $this->isChanged('order', $order); $this->order = $order; return $this; } /** * Get object. * * @return string */ public function getObject() { return $this->object; } public function setCharLengthLimit(?int $charLengthLimit): LeadField { $this->isChanged('charLengthLimit', $charLengthLimit); $this->charLengthLimit = $charLengthLimit; return $this; } public function getCharLengthLimit(): ?int { return $this->charLengthLimit; } public function getCustomFieldObject(): string { if (!$this->customFieldObject) { $this->customFieldObject = new CustomFieldObject($this); } return $this->customFieldObject->getObject(); } /** * Set object. * * @param string $object * * @return LeadField */ public function setObject($object) { $this->isChanged('object', $object); $this->object = $object; return $this; } /** * Get order. * * @return int */ public function getOrder() { return $this->order; } /** * Set isVisible. * * @param bool $isVisible * * @return LeadField */ public function setIsVisible($isVisible) { $this->isChanged('isVisible', $isVisible); $this->isVisible = $isVisible; return $this; } /** * Get isVisible. * * @return bool */ public function getIsVisible() { return $this->isVisible; } /** * Proxy to getIsVisible(). * * @return bool */ public function isVisible() { return $this->getIsVisible(); } public function setIsShortVisible(?bool $isShortVisible): self { $isShortVisible = $isShortVisible ?? false; $this->isChanged('isShortVisible', $isShortVisible); $this->isShortVisible = $isShortVisible; return $this; } /** * Get isShortVisible. * * @return bool */ public function getIsShortVisible() { return $this->isShortVisible; } /** * Proxy to getIsShortVisible(). * * @return bool */ public function isShortVisible() { return $this->getIsShortVisible(); } /** * Get the unique identifer state of the field. * * @return bool */ public function getIsUniqueIdentifer() { return $this->isUniqueIdentifer; } /** * Set the unique identifer state of the field. * * @param mixed $isUniqueIdentifer * * @return LeadField */ public function setIsUniqueIdentifer($isUniqueIdentifer) { if ($isUniqueIdentifer) { $this->isIndex = true; } $this->isUniqueIdentifer = $this->isUniqueIdentifier = $isUniqueIdentifer; return $this; } /** * Wrapper for incorrectly spelled setIsUniqueIdentifer. * * @return bool */ public function getIsUniqueIdentifier() { return $this->getIsUniqueIdentifer(); } /** * Wrapper for incorrectly spelled setIsUniqueIdentifer. * * @param mixed $isUniqueIdentifier * * @return LeadField */ public function setIsUniqueIdentifier($isUniqueIdentifier) { return $this->setIsUniqueIdentifer($isUniqueIdentifier); } /** * Set alias. * * @param string $alias * * @return LeadField */ public function setAlias($alias) { $this->isChanged('alias', $alias); $this->alias = $alias; return $this; } /** * Get alias. * * @return string */ public function getAlias() { return $this->alias; } /** * Set isListable. * * @param bool $isListable * * @return LeadField */ public function setIsListable($isListable) { $this->isChanged('isListable', $isListable); $this->isListable = $isListable; return $this; } /** * Get isListable. * * @return bool */ public function getIsListable() { return $this->isListable; } /** * Proxy to getIsListable(). * * @return bool */ public function isListable() { return $this->getIsListable(); } /** * @return mixed */ public function getGroup() { return $this->group; } /** * @param mixed $group */ public function setGroup($group): void { $this->group = $group; } /** * @return mixed */ public function getIsPubliclyUpdatable() { return $this->isPubliclyUpdatable; } /** * @param mixed $isPubliclyUpdatable */ public function setIsPubliclyUpdatable($isPubliclyUpdatable): void { $this->isPubliclyUpdatable = (bool) $isPubliclyUpdatable; } /** * Workaround for mispelled isUniqueIdentifer. */ public function identifierWorkaround(): void { $this->isUniqueIdentifier = $this->isUniqueIdentifer; } public function isNew(): bool { return $this->getId() ? false : true; } public function getColumnIsNotCreated(): bool { return $this->columnIsNotCreated; } public function getColumnIsNotRemoved(): bool { return $this->columnIsNotRemoved; } public function setColumnIsNotCreated(): void { $this->columnIsNotCreated = true; $this->originalIsPublishedValue = $this->getIsPublished(); $this->setIsPublished(false); } public function setColumnIsNotRemoved(): void { $this->columnIsNotRemoved = true; $this->setIsPublished(false); } public function setColumnWasCreated(): void { $this->columnIsNotCreated = false; $this->setIsPublished($this->getOriginalIsPublishedValue()); } public function disablePublishChange(): bool { return 'email' === $this->getAlias() || $this->getColumnIsNotCreated() || $this->getColumnIsNotRemoved(); } public function getOriginalIsPublishedValue(): bool { return (bool) $this->originalIsPublishedValue; } public function getCacheNamespacesToDelete(): array { return [self::CACHE_NAMESPACE]; } public function isIsIndex(): bool { return $this->isIndex; } public function setIsIndex(?bool $indexable): void { $this->isIndex = $indexable ?? false; } public function supportsLength(): bool { return in_array($this->type, self::TYPES_SUPPORTING_LENGTH); } }