Spaces:
No application file
No application file
| namespace Mautic\LeadBundle\Model; | |
| use Doctrine\DBAL\Exception\DriverException; | |
| use Doctrine\ORM\EntityManagerInterface; | |
| use Doctrine\ORM\Tools\Pagination\Paginator; | |
| use Mautic\CoreBundle\Cache\ResultCacheOptions; | |
| use Mautic\CoreBundle\Doctrine\Helper\ColumnSchemaHelper; | |
| use Mautic\CoreBundle\Doctrine\Paginator\SimplePaginator; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\InputHelper; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\CoreBundle\Model\FormModel; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use Mautic\LeadBundle\Entity\LeadField; | |
| use Mautic\LeadBundle\Entity\LeadFieldRepository; | |
| use Mautic\LeadBundle\Entity\LeadRepository; | |
| use Mautic\LeadBundle\Event\LeadFieldEvent; | |
| use Mautic\LeadBundle\Exception\NoListenerException; | |
| use Mautic\LeadBundle\Field\CustomFieldColumn; | |
| use Mautic\LeadBundle\Field\Dispatcher\FieldSaveDispatcher; | |
| use Mautic\LeadBundle\Field\Exception\AbortColumnCreateException; | |
| use Mautic\LeadBundle\Field\Exception\AbortColumnUpdateException; | |
| use Mautic\LeadBundle\Field\Exception\CustomFieldLimitException; | |
| use Mautic\LeadBundle\Field\FieldList; | |
| use Mautic\LeadBundle\Field\FieldsWithUniqueIdentifier; | |
| use Mautic\LeadBundle\Field\LeadFieldSaver; | |
| use Mautic\LeadBundle\Field\SchemaDefinition; | |
| use Mautic\LeadBundle\Form\Type\FieldType; | |
| use Mautic\LeadBundle\Helper\FormFieldHelper; | |
| use Mautic\LeadBundle\LeadEvents; | |
| use Psr\Log\LoggerInterface; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\Form\FormFactoryInterface; | |
| use Symfony\Component\Form\FormInterface; | |
| use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; | |
| use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
| use Symfony\Contracts\EventDispatcher\Event; | |
| /** | |
| * @extends FormModel<LeadField> | |
| */ | |
| class FieldModel extends FormModel | |
| { | |
| public static $coreFields = [ | |
| // Listed according to $order for installation | |
| 'title' => [ | |
| 'type' => 'lookup', | |
| 'properties' => [ | |
| 'list' => [ | |
| 'Mr', | |
| 'Mrs', | |
| 'Miss', | |
| ], | |
| ], | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'firstname' => [ | |
| 'fixed' => true, | |
| 'short' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'lastname' => [ | |
| 'fixed' => true, | |
| 'short' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'company' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'position' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'email' => [ | |
| 'type' => 'email', | |
| 'unique' => true, | |
| 'fixed' => true, | |
| 'short' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'mobile' => [ | |
| 'type' => 'tel', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'phone' => [ | |
| 'type' => 'tel', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'points' => [ | |
| 'type' => 'number', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| 'default' => 0, | |
| ], | |
| 'fax' => [ | |
| 'type' => 'tel', | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'address1' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'address2' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'city' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'state' => [ | |
| 'type' => 'region', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'zipcode' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'country' => [ | |
| 'type' => 'country', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'preferred_locale' => [ | |
| 'type' => 'locale', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'timezone' => [ | |
| 'type' => 'timezone', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'last_active' => [ | |
| 'type' => 'datetime', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'attribution_date' => [ | |
| 'type' => 'datetime', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'attribution' => [ | |
| 'type' => 'number', | |
| 'properties' => ['roundmode' => 4, 'scale' => 2], | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'website' => [ | |
| 'type' => 'url', | |
| 'listable' => true, | |
| 'object' => 'lead', | |
| ], | |
| 'facebook' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| 'foursquare' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| 'instagram' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| 'linkedin' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| 'skype' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| 'twitter' => [ | |
| 'listable' => true, | |
| 'group' => 'social', | |
| 'object' => 'lead', | |
| ], | |
| ]; | |
| public static $coreCompanyFields = [ | |
| // Listed according to $order for installation | |
| 'companyaddress1' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyaddress2' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyemail' => [ | |
| 'type' => 'email', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyphone' => [ | |
| 'type' => 'tel', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companycity' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companystate' => [ | |
| 'type' => 'region', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyzipcode' => [ | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companycountry' => [ | |
| 'type' => 'country', | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyname' => [ | |
| 'fixed' => true, | |
| 'required' => true, | |
| 'listable' => true, | |
| 'unique' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companywebsite' => [ | |
| 'fixed' => true, | |
| 'type' => 'url', | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companynumber_of_employees' => [ | |
| 'type' => 'number', | |
| 'properties' => ['roundmode' => 4, 'scale' => 0], | |
| 'group' => 'professional', | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companyfax' => [ | |
| 'type' => 'tel', | |
| 'listable' => true, | |
| 'group' => 'professional', | |
| 'object' => 'company', | |
| ], | |
| 'companyannual_revenue' => [ | |
| 'type' => 'number', | |
| 'properties' => ['roundmode' => 4, 'scale' => 2], | |
| 'listable' => true, | |
| 'group' => 'professional', | |
| 'object' => 'company', | |
| ], | |
| 'companyindustry' => [ | |
| 'type' => 'select', | |
| 'group' => 'professional', | |
| 'properties' => [ | |
| 'list' => [ | |
| [ | |
| 'label' => 'Aerospace & Defense', | |
| 'value' => 'Aerospace & Defense', | |
| ], | |
| [ | |
| 'label' => 'Agriculture', | |
| 'value' => 'Agriculture', | |
| ], | |
| [ | |
| 'label' => 'Apparel', | |
| 'value' => 'Apparel', | |
| ], | |
| [ | |
| 'label' => 'Automotive & Assembly', | |
| 'value' => 'Automotive & Assembly', | |
| ], | |
| [ | |
| 'label' => 'Banking', | |
| 'value' => 'Banking', | |
| ], | |
| [ | |
| 'label' => 'Biotechnology', | |
| 'value' => 'Biotechnology', | |
| ], | |
| [ | |
| 'label' => 'Chemicals', | |
| 'value' => 'Chemicals', | |
| ], | |
| [ | |
| 'label' => 'Communications', | |
| 'value' => 'Communications', | |
| ], | |
| [ | |
| 'label' => 'Construction', | |
| 'value' => 'Construction', | |
| ], | |
| [ | |
| 'label' => 'Consumer Packaged Goods', | |
| 'value' => 'Consumer Packaged Goods', | |
| ], | |
| [ | |
| 'label' => 'Education', | |
| 'value' => 'Education', | |
| ], | |
| [ | |
| 'label' => 'Electronics', | |
| 'value' => 'Electronics', | |
| ], | |
| [ | |
| 'label' => 'Energy', | |
| 'value' => 'Energy', | |
| ], | |
| [ | |
| 'label' => 'Engineering', | |
| 'value' => 'Engineering', | |
| ], | |
| [ | |
| 'label' => 'Entertainment', | |
| 'value' => 'Entertainment', | |
| ], | |
| [ | |
| 'label' => 'Environmental', | |
| 'value' => 'Environmental', | |
| ], | |
| [ | |
| 'label' => 'Finance', | |
| 'value' => 'Finance', | |
| ], | |
| [ | |
| 'label' => 'Food & Beverage', | |
| 'value' => 'Food & Beverage', | |
| ], | |
| [ | |
| 'label' => 'Government', | |
| 'value' => 'Government', | |
| ], | |
| [ | |
| 'label' => 'Healthcare', | |
| 'value' => 'Healthcare', | |
| ], | |
| [ | |
| 'label' => 'Hospitality', | |
| 'value' => 'Hospitality', | |
| ], | |
| [ | |
| 'label' => 'Insurance', | |
| 'value' => 'Insurance', | |
| ], | |
| [ | |
| 'label' => 'Machinery', | |
| 'value' => 'Machinery', | |
| ], | |
| [ | |
| 'label' => 'Manufacturing', | |
| 'value' => 'Manufacturing', | |
| ], | |
| [ | |
| 'label' => 'Media', | |
| 'value' => 'Media', | |
| ], | |
| [ | |
| 'label' => 'Metals & Mining', | |
| 'value' => 'Metals & Mining', | |
| ], | |
| [ | |
| 'label' => 'Not for Profit', | |
| 'value' => 'Not for Profit', | |
| ], | |
| [ | |
| 'label' => 'Oil & Gas', | |
| 'value' => 'Oil & Gas', | |
| ], | |
| [ | |
| 'label' => 'Packaging & Paper', | |
| 'value' => 'Packaging & Paper', | |
| ], | |
| [ | |
| 'label' => 'Private Equity & Principal Investors', | |
| 'value' => 'Private Equity & Principal Investors', | |
| ], | |
| [ | |
| 'label' => 'Recreation', | |
| 'value' => 'Recreation', | |
| ], | |
| [ | |
| 'label' => 'Real Estate', | |
| 'value' => 'Real Estate', | |
| ], | |
| [ | |
| 'label' => 'Retail', | |
| 'value' => 'Retail', | |
| ], | |
| [ | |
| 'label' => 'Semiconductors', | |
| 'value' => 'Semiconductors', | |
| ], | |
| [ | |
| 'label' => 'Shipping', | |
| 'value' => 'Shipping', | |
| ], | |
| [ | |
| 'label' => 'Social Sector', | |
| 'value' => 'Social Sector', | |
| ], | |
| [ | |
| 'label' => 'Technology', | |
| 'value' => 'Technology', | |
| ], | |
| [ | |
| 'label' => 'Telecommunications', | |
| 'value' => 'Telecommunications', | |
| ], | |
| [ | |
| 'label' => 'Transportation', | |
| 'value' => 'Transportation', | |
| ], | |
| [ | |
| 'label' => 'Utilities', | |
| 'value' => 'Utilities', | |
| ], | |
| [ | |
| 'label' => 'Other', | |
| 'value' => 'Other', | |
| ], | |
| ], | |
| ], | |
| 'fixed' => true, | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| 'companydescription' => [ | |
| 'fixed' => true, | |
| 'group' => 'professional', | |
| 'listable' => true, | |
| 'object' => 'company', | |
| ], | |
| ]; | |
| public function __construct( | |
| private ColumnSchemaHelper $columnSchemaHelper, | |
| private ListModel $leadListModel, | |
| private CustomFieldColumn $customFieldColumn, | |
| private FieldSaveDispatcher $fieldSaveDispatcher, | |
| private LeadFieldRepository $leadFieldRepository, | |
| private FieldsWithUniqueIdentifier $fieldsWithUniqueIdentifier, | |
| private FieldList $fieldList, | |
| private LeadFieldSaver $leadFieldSaver, | |
| EntityManagerInterface $em, | |
| CorePermissions $security, | |
| EventDispatcherInterface $dispatcher, | |
| UrlGeneratorInterface $router, | |
| Translator $translator, | |
| UserHelper $userHelper, | |
| LoggerInterface $mauticLogger, | |
| CoreParametersHelper $coreParametersHelper | |
| ) { | |
| parent::__construct($em, $security, $dispatcher, $router, $translator, $userHelper, $mauticLogger, $coreParametersHelper); | |
| } | |
| public function getRepository(): LeadFieldRepository | |
| { | |
| return $this->leadFieldRepository; | |
| } | |
| public function getPermissionBase(): string | |
| { | |
| return 'lead:fields'; | |
| } | |
| /** | |
| * Get a specific entity or generate a new one if id is empty. | |
| */ | |
| public function getEntity($id = null): ?LeadField | |
| { | |
| if (null === $id) { | |
| return new LeadField(); | |
| } | |
| return parent::getEntity($id); | |
| } | |
| /** | |
| * @return LeadField[]|array<int,mixed>|iterable<LeadField>|\Doctrine\ORM\Internal\Hydration\IterableResult<LeadField>|Paginator<LeadField>|SimplePaginator<LeadField> | |
| */ | |
| public function getEntities(array $args = []) | |
| { | |
| $repository = $this->em->getRepository(LeadField::class); | |
| \assert($repository instanceof LeadFieldRepository); | |
| return $repository->getEntities($args); | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getLeadFields() | |
| { | |
| return $this->getEntities([ | |
| 'filter' => [ | |
| 'force' => [ | |
| [ | |
| 'column' => 'f.object', | |
| 'expr' => 'like', | |
| 'value' => 'lead', | |
| ], | |
| ], | |
| ], | |
| ]); | |
| } | |
| /** | |
| * @return LeadField[] | |
| */ | |
| public function getLeadFieldCustomFields(): array | |
| { | |
| $forceFilter = [ | |
| [ | |
| 'column' => $this->getRepository()->getTableAlias().'.object', | |
| 'expr' => 'like', | |
| 'value' => 'lead', | |
| ], | |
| [ | |
| 'column' => $this->getRepository()->getTableAlias().'.dateAdded', | |
| 'expr' => 'isNotNull', | |
| ], | |
| ]; | |
| return $this->getEntities([ | |
| 'filter' => [ | |
| 'force' => $forceFilter, | |
| ], | |
| 'ignore_paginator' => true, | |
| ]); | |
| } | |
| /** | |
| * @return mixed[] | |
| */ | |
| public function getLeadFieldCustomFieldSchemaDetails(): array | |
| { | |
| $fields = $this->getLeadFieldCustomFields(); | |
| $columns = $this->columnSchemaHelper->setName('leads')->getColumns(); | |
| $schemaDetails = []; | |
| foreach ($fields as $value) { | |
| if (!empty($columns[$value->getAlias()])) { | |
| $schemaDetails[$value->getAlias()] = $columns[$value->getAlias()]; | |
| } | |
| } | |
| return $schemaDetails; | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getCompanyFields() | |
| { | |
| return $this->getEntities([ | |
| 'filter' => [ | |
| 'force' => [ | |
| [ | |
| 'column' => 'f.object', | |
| 'expr' => 'like', | |
| 'value' => 'company', | |
| ], | |
| ], | |
| ], | |
| ]); | |
| } | |
| /** | |
| * @param LeadField $entity | |
| * @param bool $unlock | |
| * | |
| * @throws AbortColumnCreateException | |
| * @throws AbortColumnUpdateException | |
| * @throws \Doctrine\DBAL\Exception | |
| * @throws DriverException | |
| * @throws \Doctrine\DBAL\Schema\SchemaException | |
| * @throws \Mautic\CoreBundle\Exception\SchemaException | |
| */ | |
| public function saveEntity($entity, $unlock = true): void | |
| { | |
| if (!$entity instanceof LeadField) { | |
| throw new MethodNotAllowedHttpException(['LeadEntity']); | |
| } | |
| $this->setTimestamps($entity, $entity->isNew(), $unlock); | |
| if ('time' === $entity->getType()) { | |
| // time does not work well with list filters | |
| $entity->setIsListable(false); | |
| } | |
| // Save the entity now if it's an existing entity | |
| if (!$entity->isNew()) { | |
| $this->leadFieldSaver->saveLeadFieldEntity($entity, false); | |
| } | |
| try { | |
| $this->customFieldColumn->createLeadColumn($entity); | |
| } catch (CustomFieldLimitException $e) { | |
| // Convert to original Exception not to cause BC | |
| throw new \Doctrine\DBAL\Exception($this->translator->trans($e->getMessage())); | |
| } | |
| // Update order of the other fields. | |
| $this->reorderFieldsByEntity($entity); | |
| } | |
| /** | |
| * Build schema for each entity. | |
| * | |
| * @param array $entities | |
| * @param bool $unlock | |
| * | |
| * @throws AbortColumnCreateException | |
| * @throws \Doctrine\DBAL\Exception | |
| * @throws DriverException | |
| * @throws \Doctrine\DBAL\Schema\SchemaException | |
| * @throws \Mautic\CoreBundle\Exception\SchemaException | |
| */ | |
| public function saveEntities($entities, $unlock = true): void | |
| { | |
| foreach ($entities as $entity) { | |
| $this->saveEntity($entity, $unlock); | |
| } | |
| } | |
| /** | |
| * @param object $entity | |
| * | |
| * @throws \Mautic\CoreBundle\Exception\SchemaException | |
| */ | |
| public function deleteEntity($entity): void | |
| { | |
| parent::deleteEntity($entity); | |
| switch ($entity->getObject()) { | |
| case 'lead': | |
| $this->columnSchemaHelper->setName('leads')->dropColumn($entity->getAlias())->executeChanges(); | |
| break; | |
| case 'company': | |
| $this->columnSchemaHelper->setName('companies')->dropColumn($entity->getAlias())->executeChanges(); | |
| break; | |
| } | |
| } | |
| /** | |
| * Delete an array of entities. | |
| * | |
| * @param mixed[] $ids | |
| * | |
| * @return mixed[] | |
| * | |
| * @throws \Mautic\CoreBundle\Exception\SchemaException | |
| */ | |
| public function deleteEntities($ids): array | |
| { | |
| $entities = parent::deleteEntities($ids); | |
| /** @var LeadField $entity */ | |
| foreach ($entities as $entity) { | |
| switch ($entity->getObject()) { | |
| case 'lead': | |
| $this->columnSchemaHelper->setName('leads')->dropColumn($entity->getAlias())->executeChanges(); | |
| break; | |
| case 'company': | |
| $this->columnSchemaHelper->setName('companies')->dropColumn($entity->getAlias())->executeChanges(); | |
| break; | |
| } | |
| } | |
| return $entities; | |
| } | |
| /** | |
| * Is field used in segment filter? | |
| */ | |
| public function isUsedField(LeadField $field): bool | |
| { | |
| return $this->leadListModel->isFieldUsed($field); | |
| } | |
| /** | |
| * Returns list of all segments that use $field. | |
| * | |
| * @return Paginator | |
| */ | |
| public function getFieldSegments(LeadField $field) | |
| { | |
| return $this->leadListModel->getFieldSegments($field); | |
| } | |
| /** | |
| * Filter used field ids. | |
| */ | |
| public function filterUsedFieldIds(array $ids): array | |
| { | |
| return array_filter($ids, fn ($id): bool => false === $this->isUsedField($this->getEntity($id))); | |
| } | |
| /** | |
| * Reorder fields based on passed entity position. | |
| */ | |
| public function reorderFieldsByEntity($entity): void | |
| { | |
| if (!$entity instanceof LeadField) { | |
| throw new MethodNotAllowedHttpException(['LeadEntity']); | |
| } | |
| $fields = $this->getRepository()->findBy([], ['order' => 'ASC']); | |
| $count = 1; | |
| $order = $entity->getOrder(); | |
| $id = $entity->getId(); | |
| $hit = false; | |
| foreach ($fields as $field) { | |
| if ($id !== $field->getId()) { | |
| if ($order === $field->getOrder()) { | |
| if ($hit) { | |
| $field->setOrder($count - 1); | |
| } else { | |
| $field->setOrder($count + 1); | |
| } | |
| } else { | |
| $field->setOrder($count); | |
| } | |
| $this->em->persist($field); | |
| } else { | |
| $hit = true; | |
| } | |
| ++$count; | |
| } | |
| $this->em->flush(); | |
| } | |
| /** | |
| * Reorders fields by a list of field ids. | |
| * | |
| * @param int $start Number to start the order by (used for paginated reordering) | |
| */ | |
| public function reorderFieldsByList(array $list, $start = 1): void | |
| { | |
| $fields = $this->getRepository()->findBy([], ['order' => 'ASC']); | |
| foreach ($fields as $field) { | |
| if (in_array($field->getId(), $list)) { | |
| $order = ((int) array_search($field->getId(), $list) + $start); | |
| $field->setOrder($order); | |
| $this->em->persist($field); | |
| } | |
| } | |
| $this->em->flush(); | |
| } | |
| /** | |
| * Get list of custom field values for autopopulate fields. | |
| * | |
| * @param string $type | |
| * @param string $filter | |
| * @param int $limit | |
| * | |
| * @return array | |
| */ | |
| public function getLookupResults($type, $filter = '', $limit = 10) | |
| { | |
| /** @var LeadRepository $contactRepository */ | |
| $contactRepository = $this->em->getRepository(Lead::class); | |
| return $contactRepository->getValueList($type, $filter, $limit); | |
| } | |
| /** | |
| * @param array $options | |
| * | |
| * @throws MethodNotAllowedHttpException | |
| */ | |
| public function createForm($entity, FormFactoryInterface $formFactory, $action = null, $options = []): FormInterface | |
| { | |
| if (!$entity instanceof LeadField) { | |
| throw new MethodNotAllowedHttpException(['LeadField']); | |
| } | |
| if (!empty($action)) { | |
| $options['action'] = $action; | |
| } | |
| return $formFactory->create(FieldType::class, $entity, $options); | |
| } | |
| /** | |
| * @return string|true | |
| */ | |
| public function setFieldProperties(LeadField $entity, array $properties) | |
| { | |
| if (!empty($properties) && is_array($properties)) { | |
| $properties = InputHelper::clean($properties); | |
| } else { | |
| $properties = []; | |
| } | |
| // validate properties | |
| $type = $entity->getType(); | |
| $result = FormFieldHelper::validateProperties($type, $properties); | |
| if ($result[0]) { | |
| $entity->setProperties($properties); | |
| return true; | |
| } | |
| return $result[1]; | |
| } | |
| /** | |
| * @throws MethodNotAllowedHttpException | |
| */ | |
| protected function dispatchEvent($action, &$entity, $isNew = false, ?Event $event = null): ?Event | |
| { | |
| switch ($action) { | |
| case 'pre_save': | |
| $action = LeadEvents::FIELD_PRE_SAVE; | |
| break; | |
| case 'post_save': | |
| $action = LeadEvents::FIELD_POST_SAVE; | |
| break; | |
| case 'pre_delete': | |
| $action = LeadEvents::FIELD_PRE_DELETE; | |
| break; | |
| case 'post_delete': | |
| $action = LeadEvents::FIELD_POST_DELETE; | |
| break; | |
| } | |
| if (!$entity instanceof LeadField) { | |
| throw new MethodNotAllowedHttpException(['LeadField']); | |
| } | |
| if (null !== $event && !$event instanceof LeadFieldEvent) { | |
| throw new \RuntimeException('Event should be LeadFieldEvent|null.'); | |
| } | |
| try { | |
| return $this->fieldSaveDispatcher->dispatchEvent($action, $entity, $isNew, $event); | |
| } catch (NoListenerException) { | |
| return $event; | |
| } | |
| } | |
| /** | |
| * @deprecated Use FieldList::getFieldList method instead | |
| * | |
| * @param bool|true $byGroup | |
| * @param bool|true $alphabetical | |
| * @param array $filters | |
| * | |
| * @return mixed[] | |
| */ | |
| public function getFieldList($byGroup = true, $alphabetical = true, $filters = ['isPublished' => true, 'object' => 'lead']): array | |
| { | |
| return $this->fieldList->getFieldList($byGroup, $alphabetical, $filters); | |
| } | |
| /** | |
| * @param string $object | |
| * | |
| * @return array | |
| */ | |
| public function getPublishedFieldArrays($object = 'lead') | |
| { | |
| return $this->getEntities( | |
| [ | |
| 'filter' => [ | |
| 'force' => [ | |
| [ | |
| 'column' => 'f.isPublished', | |
| 'expr' => 'eq', | |
| 'value' => true, | |
| ], | |
| [ | |
| 'column' => 'f.object', | |
| 'expr' => 'eq', | |
| 'value' => $object, | |
| ], | |
| ], | |
| ], | |
| 'hydration_mode' => 'HYDRATE_ARRAY', | |
| 'result_cache' => new ResultCacheOptions(LeadField::CACHE_NAMESPACE), | |
| ] | |
| ); | |
| } | |
| /** | |
| * @param string $object | |
| */ | |
| public function getFieldListWithProperties($object = 'lead'): array | |
| { | |
| $forceFilters[] = [ | |
| 'column' => 'f.object', | |
| 'expr' => 'eq', | |
| 'value' => $object, | |
| ]; | |
| $contactFields = $this->getEntities( | |
| [ | |
| 'filter' => [ | |
| 'force' => $forceFilters, | |
| ], | |
| 'ignore_paginator' => true, | |
| 'hydration_mode' => 'hydrate_array', | |
| ] | |
| ); | |
| $fields = []; | |
| foreach ($contactFields as $contactField) { | |
| $fields[$contactField['alias']] = [ | |
| 'label' => $contactField['label'], | |
| 'alias' => $contactField['alias'], | |
| 'type' => $contactField['type'], | |
| 'group' => $contactField['group'], | |
| 'group_label' => $this->translator->trans('mautic.lead.field.group.'.$contactField['group']), | |
| 'defaultValue' => $contactField['defaultValue'], | |
| 'properties' => $contactField['properties'], | |
| 'isPublished' => $contactField['isPublished'], | |
| ]; | |
| } | |
| return $fields; | |
| } | |
| /** | |
| * Get the fields for a specific group. | |
| * | |
| * @param array $filters | |
| */ | |
| public function getGroupFields($group, $filters = ['isPublished' => true]): array | |
| { | |
| $forceFilters = [ | |
| [ | |
| 'column' => 'f.group', | |
| 'expr' => 'eq', | |
| 'value' => $group, | |
| ], | |
| ]; | |
| foreach ($filters as $col => $val) { | |
| $forceFilters[] = [ | |
| 'column' => "f.{$col}", | |
| 'expr' => 'eq', | |
| 'value' => $val, | |
| ]; | |
| } | |
| // Get a list of custom form fields | |
| $fields = $this->getEntities([ | |
| 'filter' => [ | |
| 'force' => $forceFilters, | |
| ], | |
| 'orderBy' => 'f.order', | |
| 'orderByDir' => 'asc', | |
| ]); | |
| $leadFields = []; | |
| foreach ($fields as $f) { | |
| $leadFields[$f->getAlias()] = $f->getLabel(); | |
| } | |
| return $leadFields; | |
| } | |
| /** | |
| * Retrieves a list of published fields that are unique identifers. | |
| * | |
| * @deprecated to be removed in 3.0 | |
| * | |
| * @return array<mixed> | |
| */ | |
| public function getUniqueIdentiferFields($filters = []): array | |
| { | |
| return $this->getUniqueIdentifierFields($filters); | |
| } | |
| /** | |
| * Retrieves a list of published fields that are unique identifers. | |
| * | |
| * @deprecated Use FieldsWithUniqueIdentifier::getFieldsWithUniqueIdentifier method instead | |
| * | |
| * @param array<mixed> $filters | |
| * | |
| * @return array<mixed> | |
| */ | |
| public function getUniqueIdentifierFields(array $filters = []): array | |
| { | |
| return $this->fieldsWithUniqueIdentifier->getFieldsWithUniqueIdentifier($filters); | |
| } | |
| /** | |
| * Get the MySQL database type based on the field type | |
| * Use a static function so that it's accessible from DoctrineSubscriber | |
| * without causing a circular service injection error. | |
| * | |
| * @deprecated Use SchemaDefinition::getSchemaDefinition method instead | |
| * | |
| * @param bool $isUnique | |
| */ | |
| public static function getSchemaDefinition($alias, $type, $isUnique = false): array | |
| { | |
| return SchemaDefinition::getSchemaDefinition($alias, $type, $isUnique); | |
| } | |
| public function getEntityByAlias($alias, $categoryAlias = null, $lang = null) | |
| { | |
| return $this->getRepository()->findOneByAlias($alias); | |
| } | |
| } | |