Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Entity; | |
use Doctrine\ORM\Mapping as ORM; | |
use Mautic\ApiBundle\Serializer\Driver\ApiMetadataDriver; | |
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
use Mautic\CoreBundle\Entity\CacheInvalidateInterface; | |
use Mautic\CoreBundle\Entity\FormEntity; | |
use Mautic\LeadBundle\Field\DTO\CustomFieldObject; | |
use Mautic\LeadBundle\Form\Validator\Constraints\FieldAliasKeyword; | |
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; | |
use Symfony\Component\Validator\Constraints as Assert; | |
use Symfony\Component\Validator\Context\ExecutionContextInterface; | |
use Symfony\Component\Validator\Mapping\ClassMetadata; | |
class LeadField extends FormEntity implements CacheInvalidateInterface | |
{ | |
public const CACHE_NAMESPACE = 'LeadField'; | |
/** | |
* @var int | |
*/ | |
private $id; | |
/** | |
* @var string | |
*/ | |
private $label; | |
/** | |
* @var string | |
*/ | |
private $alias; | |
/** | |
* @var string | |
*/ | |
private $type = 'text'; | |
/** | |
* @var string|null | |
*/ | |
private $group = 'core'; | |
/** | |
* @var string|null | |
*/ | |
private $defaultValue; | |
/** | |
* @var bool | |
*/ | |
private $isRequired = false; | |
/** | |
* @var bool | |
*/ | |
private $isFixed = false; | |
/** | |
* @var bool | |
*/ | |
private $isVisible = true; | |
/** | |
* @var bool | |
*/ | |
private $isShortVisible = true; | |
/** | |
* @var bool | |
*/ | |
private $isListable = true; | |
/** | |
* @var bool | |
*/ | |
private $isPubliclyUpdatable = false; | |
/** | |
* @var bool|null | |
*/ | |
private $isUniqueIdentifer = false; | |
/** | |
* Workaround for incorrectly spelled $isUniqueIdentifer. | |
* | |
* @var bool | |
*/ | |
private $isUniqueIdentifier = false; | |
private ?int $charLengthLimit = 64; | |
/** | |
* @var int|null | |
*/ | |
private $order = 1; | |
/** | |
* @var string|null | |
*/ | |
private $object = 'lead'; | |
/** | |
* @var array | |
*/ | |
private $properties = []; | |
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. | |
* | |
* @var bool | |
*/ | |
private $columnIsNotCreated = false; | |
/** | |
* This property contains an original value for $isPublished. | |
* $isPublished is always set on false if $columnIsNotCreated is true. | |
* | |
* @var bool | |
*/ | |
private $originalIsPublishedValue = false; | |
/** | |
* @var CustomFieldObject | |
*/ | |
private $customFieldObject; | |
public function __clone() | |
{ | |
$this->id = null; | |
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') | |
->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->addNullableField('isIndex', 'boolean', 'is_index'); | |
$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('originalIsPublishedValue', 'boolean') | |
->columnName('original_is_published_value') | |
->option('default', false) | |
->build(); | |
} | |
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([ | |
'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(); | |
} | |
}, | |
])); | |
} | |
/** | |
* 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', | |
] | |
) | |
->build(); | |
} | |
public function setId(?int $id = null): void | |
{ | |
$this->id = $id; | |
} | |
/** | |
* Get id. | |
* | |
* @return int | |
*/ | |
public function getId() | |
{ | |
return $this->id; | |
} | |
/** | |
* 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<string> $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(); | |
} | |
/** | |
* Set isShortVisible. | |
* | |
* @param bool $isShortVisible | |
* | |
* @return LeadField | |
*/ | |
public function setIsShortVisible($isShortVisible) | |
{ | |
$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; | |
} | |
/** | |
* @return bool | |
*/ | |
public function getColumnIsNotCreated() | |
{ | |
return $this->columnIsNotCreated; | |
} | |
public function setColumnIsNotCreated(): void | |
{ | |
$this->columnIsNotCreated = true; | |
$this->originalIsPublishedValue = $this->getIsPublished(); | |
$this->setIsPublished(false); | |
} | |
public function setColumnWasCreated(): void | |
{ | |
$this->columnIsNotCreated = false; | |
$this->setIsPublished($this->getOriginalIsPublishedValue()); | |
} | |
public function disablePublishChange(): bool | |
{ | |
return 'email' === $this->getAlias() || $this->getColumnIsNotCreated(); | |
} | |
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; | |
} | |
} | |