Set newsletter segment data using Doctrine
[MAILPOET-2900]
This commit is contained in:
@ -268,6 +268,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Listing\NewsletterListingRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\Listing\NewsletterListingRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Preview\SendPreviewController::class);
|
$container->autowire(\MailPoet\Newsletter\Preview\SendPreviewController::class);
|
||||||
|
$container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class);
|
||||||
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class);
|
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class);
|
||||||
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class);
|
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class);
|
||||||
|
@ -30,6 +30,11 @@ class NewsletterSegmentEntity {
|
|||||||
*/
|
*/
|
||||||
private $segment;
|
private $segment;
|
||||||
|
|
||||||
|
public function __construct(NewsletterEntity $newsletter, SegmentEntity $segment) {
|
||||||
|
$this->newsletter = $newsletter;
|
||||||
|
$this->segment = $segment;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return NewsletterEntity|null
|
* @return NewsletterEntity|null
|
||||||
*/
|
*/
|
||||||
@ -38,10 +43,6 @@ class NewsletterSegmentEntity {
|
|||||||
return $this->newsletter;
|
return $this->newsletter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setNewsletter(NewsletterEntity $newsletter) {
|
|
||||||
$this->newsletter = $newsletter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return SegmentEntity|null
|
* @return SegmentEntity|null
|
||||||
*/
|
*/
|
||||||
@ -49,8 +50,4 @@ class NewsletterSegmentEntity {
|
|||||||
$this->safelyLoadToOneAssociation('segment');
|
$this->safelyLoadToOneAssociation('segment');
|
||||||
return $this->segment;
|
return $this->segment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setSegment(SegmentEntity $segment) {
|
|
||||||
$this->segment = $segment;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,16 @@ namespace MailPoet\Newsletter;
|
|||||||
|
|
||||||
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Entities\NewsletterSegmentEntity;
|
||||||
|
use MailPoet\Entities\SegmentEntity;
|
||||||
use MailPoet\InvalidStateException;
|
use MailPoet\InvalidStateException;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\NewsletterOption;
|
use MailPoet\Models\NewsletterOption;
|
||||||
use MailPoet\Models\NewsletterOptionField;
|
use MailPoet\Models\NewsletterOptionField;
|
||||||
use MailPoet\Models\NewsletterSegment;
|
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Newsletter\Scheduler\PostNotificationScheduler;
|
use MailPoet\Newsletter\Scheduler\PostNotificationScheduler;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
|
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
|
||||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
||||||
use MailPoet\NotFoundException;
|
use MailPoet\NotFoundException;
|
||||||
@ -20,6 +22,7 @@ use MailPoet\Settings\SettingsController;
|
|||||||
use MailPoet\UnexpectedValueException;
|
use MailPoet\UnexpectedValueException;
|
||||||
use MailPoet\WP\Emoji;
|
use MailPoet\WP\Emoji;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
class NewsletterSaveController {
|
class NewsletterSaveController {
|
||||||
/** @var AuthorizedEmailsController */
|
/** @var AuthorizedEmailsController */
|
||||||
@ -28,9 +31,15 @@ class NewsletterSaveController {
|
|||||||
/** @var Emoji */
|
/** @var Emoji */
|
||||||
private $emoji;
|
private $emoji;
|
||||||
|
|
||||||
|
/** @var EntityManager */
|
||||||
|
private $entityManager;
|
||||||
|
|
||||||
/** @var NewslettersRepository */
|
/** @var NewslettersRepository */
|
||||||
private $newslettersRepository;
|
private $newslettersRepository;
|
||||||
|
|
||||||
|
/** @var NewsletterSegmentRepository */
|
||||||
|
private $newsletterSegmentRepository;
|
||||||
|
|
||||||
/** @var NewsletterTemplatesRepository */
|
/** @var NewsletterTemplatesRepository */
|
||||||
private $newsletterTemplatesRepository;
|
private $newsletterTemplatesRepository;
|
||||||
|
|
||||||
@ -46,7 +55,9 @@ class NewsletterSaveController {
|
|||||||
public function __construct(
|
public function __construct(
|
||||||
AuthorizedEmailsController $authorizedEmailsController,
|
AuthorizedEmailsController $authorizedEmailsController,
|
||||||
Emoji $emoji,
|
Emoji $emoji,
|
||||||
|
EntityManager $entityManager,
|
||||||
NewslettersRepository $newslettersRepository,
|
NewslettersRepository $newslettersRepository,
|
||||||
|
NewsletterSegmentRepository $newsletterSegmentRepository,
|
||||||
NewsletterTemplatesRepository $newsletterTemplatesRepository,
|
NewsletterTemplatesRepository $newsletterTemplatesRepository,
|
||||||
PostNotificationScheduler $postNotificationScheduler,
|
PostNotificationScheduler $postNotificationScheduler,
|
||||||
SettingsController $settings,
|
SettingsController $settings,
|
||||||
@ -54,7 +65,9 @@ class NewsletterSaveController {
|
|||||||
) {
|
) {
|
||||||
$this->authorizedEmailsController = $authorizedEmailsController;
|
$this->authorizedEmailsController = $authorizedEmailsController;
|
||||||
$this->emoji = $emoji;
|
$this->emoji = $emoji;
|
||||||
|
$this->entityManager = $entityManager;
|
||||||
$this->newslettersRepository = $newslettersRepository;
|
$this->newslettersRepository = $newslettersRepository;
|
||||||
|
$this->newsletterSegmentRepository = $newsletterSegmentRepository;
|
||||||
$this->newsletterTemplatesRepository = $newsletterTemplatesRepository;
|
$this->newsletterTemplatesRepository = $newsletterTemplatesRepository;
|
||||||
$this->postNotificationScheduler = $postNotificationScheduler;
|
$this->postNotificationScheduler = $postNotificationScheduler;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
@ -83,6 +96,7 @@ class NewsletterSaveController {
|
|||||||
|
|
||||||
$newsletter = $this->getNewsletter($data);
|
$newsletter = $this->getNewsletter($data);
|
||||||
$this->updateNewsletter($newsletter, $data);
|
$this->updateNewsletter($newsletter, $data);
|
||||||
|
$this->updateSegments($newsletter, $data['segments'] ?? []);
|
||||||
|
|
||||||
// fetch old model for back compatibility
|
// fetch old model for back compatibility
|
||||||
$newsletterModel = Newsletter::findOne((int)$data['id']);
|
$newsletterModel = Newsletter::findOne((int)$data['id']);
|
||||||
@ -90,19 +104,6 @@ class NewsletterSaveController {
|
|||||||
throw new InvalidStateException();
|
throw new InvalidStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
$segments = $data['segments'] ?? [];
|
|
||||||
if ($segments) {
|
|
||||||
NewsletterSegment::where('newsletter_id', $newsletterModel->id)
|
|
||||||
->deleteMany();
|
|
||||||
foreach ($segments as $segment) {
|
|
||||||
if (!is_array($segment)) continue;
|
|
||||||
$relation = NewsletterSegment::create();
|
|
||||||
$relation->segmentId = (int)$segment['id'];
|
|
||||||
$relation->newsletterId = $newsletterModel->id;
|
|
||||||
$relation->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// save default sender if needed
|
// save default sender if needed
|
||||||
if (!$this->settings->get('sender') && !empty($data['sender_address']) && !empty($data['sender_name'])) {
|
if (!$this->settings->get('sender') && !empty($data['sender_address']) && !empty($data['sender_name'])) {
|
||||||
$this->settings->set('sender', [
|
$this->settings->set('sender', [
|
||||||
@ -221,4 +222,35 @@ class NewsletterSaveController {
|
|||||||
|
|
||||||
$this->newslettersRepository->flush();
|
$this->newslettersRepository->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function updateSegments(NewsletterEntity $newsletter, array $segments) {
|
||||||
|
$oldNewsletterSegments = $newsletter->getNewsletterSegments()->toArray();
|
||||||
|
|
||||||
|
// clear old & add new newsletter segments
|
||||||
|
$newsletter->getNewsletterSegments()->clear();
|
||||||
|
foreach ($segments as $segment) {
|
||||||
|
if (!is_array($segment) || !isset($segment['id'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$segment = $this->entityManager->getReference(SegmentEntity::class, (int)$segment['id']);
|
||||||
|
$newsletterSegment = $this->newsletterSegmentRepository->findBy([
|
||||||
|
'newsletter' => $newsletter,
|
||||||
|
'segment' => $segment,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!$newsletterSegment) {
|
||||||
|
$newsletterSegment = new NewsletterSegmentEntity($newsletter, $segment);
|
||||||
|
$this->entityManager->persist($newsletterSegment);
|
||||||
|
}
|
||||||
|
$newsletter->getNewsletterSegments()->add($newsletterSegment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove orphaned newsletter segments
|
||||||
|
foreach (array_diff($oldNewsletterSegments, $newsletter->getNewsletterSegments()->toArray()) as $newsletterSegment) {
|
||||||
|
$this->newsletterSegmentRepository->remove($newsletterSegment);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->entityManager->flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
15
lib/Newsletter/Segment/NewsletterSegmentRepository.php
Normal file
15
lib/Newsletter/Segment/NewsletterSegmentRepository.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter\Segment;
|
||||||
|
|
||||||
|
use MailPoet\Doctrine\Repository;
|
||||||
|
use MailPoet\Entities\NewsletterSegmentEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @extends Repository<NewsletterSegmentEntity>
|
||||||
|
*/
|
||||||
|
class NewsletterSegmentRepository extends Repository {
|
||||||
|
protected function getEntityClassName() {
|
||||||
|
return NewsletterSegmentEntity::class;
|
||||||
|
}
|
||||||
|
}
|
@ -243,3 +243,8 @@ parameters:
|
|||||||
message: "#^Parameter \\#1 \\$newsletter of method MailPoet\\\\Entities\\\\NewsletterTemplateEntity\\:\\:setNewsletter\\(\\) expects MailPoet\\\\Entities\\\\NewsletterEntity\\|null, object given\\.$#"
|
message: "#^Parameter \\#1 \\$newsletter of method MailPoet\\\\Entities\\\\NewsletterTemplateEntity\\:\\:setNewsletter\\(\\) expects MailPoet\\\\Entities\\\\NewsletterEntity\\|null, object given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: ../../lib/NewsletterTemplates/NewsletterTemplatesRepository.php
|
path: ../../lib/NewsletterTemplates/NewsletterTemplatesRepository.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#2 \\$segment of class MailPoet\\\\Entities\\\\NewsletterSegmentEntity constructor expects MailPoet\\\\Entities\\\\SegmentEntity, object given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: ../../lib/Newsletter/NewsletterSaveController.php
|
||||||
|
@ -80,9 +80,7 @@ class NewsletterListingRepositoryTest extends \MailPoetTest {
|
|||||||
$newsletter->setSubject('Newsletter with segment');
|
$newsletter->setSubject('Newsletter with segment');
|
||||||
$this->entityManager->persist($newsletter);
|
$this->entityManager->persist($newsletter);
|
||||||
|
|
||||||
$newsletterSegment = new NewsletterSegmentEntity();
|
$newsletterSegment = new NewsletterSegmentEntity($newsletter, $segment);
|
||||||
$newsletterSegment->setSegment($segment);
|
|
||||||
$newsletterSegment->setNewsletter($newsletter);
|
|
||||||
$this->entityManager->persist($newsletterSegment);
|
$this->entityManager->persist($newsletterSegment);
|
||||||
|
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
Reference in New Issue
Block a user