diff --git a/lib/Subscribers/SubscriberActions.php b/lib/Subscribers/SubscriberActions.php index 7179adb531..5a1f46b09e 100644 --- a/lib/Subscribers/SubscriberActions.php +++ b/lib/Subscribers/SubscriberActions.php @@ -82,6 +82,9 @@ class SubscriberActions { $subscriber->setUnconfirmedData($unconfirmedData ?: null); } + // Update custom fields + $this->subscriberSaveController->updateCustomFields($subscriberData, $subscriber); + // restore trashed subscriber if ($subscriber->getDeletedAt()) { $subscriber->setDeletedAt(null); diff --git a/lib/Subscribers/SubscriberSaveController.php b/lib/Subscribers/SubscriberSaveController.php index dedeb9fc9e..977f97976d 100644 --- a/lib/Subscribers/SubscriberSaveController.php +++ b/lib/Subscribers/SubscriberSaveController.php @@ -229,7 +229,7 @@ class SubscriberSaveController { return $subscriber; } - private function updateCustomFields(array $data, SubscriberEntity $subscriber): void { + public function updateCustomFields(array $data, SubscriberEntity $subscriber): void { $customFieldsMap = []; foreach ($data as $key => $value) { if (strpos($key, 'cf_') === 0) { diff --git a/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php b/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php index 7ae8e9b4bc..eb4e9f016f 100644 --- a/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php +++ b/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php @@ -3,8 +3,10 @@ namespace MailPoet\Subscribers; use Codeception\Util\Fixtures; +use MailPoet\Entities\CustomFieldEntity; use MailPoet\Entities\FormEntity; use MailPoet\Entities\SegmentEntity; +use MailPoet\Entities\SubscriberCustomFieldEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Form\Util\FieldNameObfuscator; @@ -33,6 +35,9 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { /** @var string */ private $obfuscatedSegments; + /** @var SubscriberCustomFieldRepository */ + private $subscriberCustomFieldRepository; + public function _before() { parent::_before(); $this->cleanup(); @@ -44,6 +49,7 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); + $this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class); } public function testItCanSubscribeSubscriberWithoutConfirmation(): void { @@ -82,11 +88,42 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNCONFIRMED); } + public function testItCanSubscribeSubscriberWithCustomField(): void { + $this->settings->set('signup_confirmation.enabled', false); + $segment = $this->segmentsRepository->createOrUpdate('Segment 1'); + $customField = $this->createCustomField('Custom Field'); + $form = $this->createForm($segment, [$customField]); + + $data = [ + $this->obfuscatedEmail => 'subscriber' . rand(0, 10000) . '@example.com', + $this->obfuscatedSegments => [$segment->getId()], + 'form_id' => $form->getId(), + 'cf_' . $customField->getId() => 'field value', + ]; + $this->subscribeController->subscribe($data); + + $subscriber = $this->subscribersRepository->findOneBy(['email' => $data[$this->obfuscatedEmail]]); + assert($subscriber instanceof SubscriberEntity); + expect($subscriber)->isInstanceOf(SubscriberEntity::class); + expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriberCustomFields = $this->subscriberCustomFieldRepository->findBy(['subscriber' => $subscriber]); + expect($subscriberCustomFields)->count(1); + $subscriberCustomField = reset($subscriberCustomFields); + assert($subscriberCustomField instanceof SubscriberCustomFieldEntity); + expect($subscriberCustomField)->isInstanceOf(SubscriberCustomFieldEntity::class); + expect($subscriberCustomField->getSubscriber())->equals($subscriber); + expect($subscriberCustomField->getCustomField())->equals($customField); + expect($subscriberCustomField->getValue())->equals($data['cf_' . $customField->getId()]); + } + public function _after(): void { $this->cleanup(); } - private function createForm(SegmentEntity $segment): FormEntity { + /** + * @param CustomFieldEntity[] $customFields + */ + private function createForm(SegmentEntity $segment, array $customFields = []): FormEntity { $form = new FormEntity('Form' . rand(0, 10000)); $body = Fixtures::get('form_body_template'); // Add segment selection block @@ -96,6 +133,14 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { 'values' => [['id' => $segment->getId()]], ], ]; + foreach ($customFields as $customField) { + $body[] = [ + 'type' => $customField->getType(), + 'name' => $customField->getName(), + 'id' => $customField->getId(), + 'params' => $customField->getParams(), + ]; + } $form->setBody($body); $form->setSettings([ 'segments_selected_by' => 'user', @@ -106,6 +151,15 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { return $form; } + private function createCustomField(string $name): CustomFieldEntity { + $customField = new CustomFieldEntity(); + $customField->setType(CustomFieldEntity::TYPE_TEXT); + $customField->setName($name); + $this->entityManager->persist($customField); + $this->entityManager->flush(); + return $customField; + } + private function cleanup(): void { $this->truncateEntity(FormEntity::class); $this->truncateEntity(SubscriberEntity::class);