Free up shortcodes constructor for DI
[MAILPOET-2993]
This commit is contained in:
@ -46,7 +46,12 @@ class Newsletter {
|
||||
/** @var Emoji */
|
||||
private $emoji;
|
||||
|
||||
public function __construct(WPFunctions $wp = null, PostsTask $postsTask = null, GATracking $gaTracking = null, Emoji $emoji = null) {
|
||||
public function __construct(
|
||||
WPFunctions $wp = null,
|
||||
PostsTask $postsTask = null,
|
||||
GATracking $gaTracking = null,
|
||||
Emoji $emoji = null
|
||||
) {
|
||||
$settings = SettingsController::getInstance();
|
||||
$this->trackingEnabled = (boolean)$settings->get('tracking.enabled');
|
||||
if ($wp === null) {
|
||||
|
@ -2,11 +2,49 @@
|
||||
|
||||
namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
|
||||
|
||||
use MailPoet\DI\ContainerWrapper;
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\NewslettersRepository;
|
||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use MailPoet\Tasks\Sending;
|
||||
|
||||
class Shortcodes {
|
||||
public static function process($content, $contentSource = null, $newsletter = null, $subscriber = null, $queue = null) {
|
||||
$shortcodes = new NewsletterShortcodes($newsletter, $subscriber, $queue);
|
||||
/** @var NewsletterShortcodes $shortcodes */
|
||||
$shortcodes = ContainerWrapper::getInstance()->get(NewsletterShortcodes::class);
|
||||
/** @var SendingQueuesRepository $sendingQueueRepository */
|
||||
$sendingQueueRepository = ContainerWrapper::getInstance()->get(SendingQueuesRepository::class);
|
||||
/** @var NewslettersRepository $newsletterRepository */
|
||||
$newsletterRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
|
||||
/** @var NewslettersRepository $newsletterRepository */
|
||||
$subscribersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
|
||||
/** @var SubscribersRepository $subscribersRepository */
|
||||
$subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class);
|
||||
|
||||
if ($queue instanceof Sending || $queue instanceof SendingQueue) {
|
||||
$queue = $sendingQueueRepository->findOneById($queue->id);
|
||||
}
|
||||
if ($queue instanceof SendingQueueEntity) {
|
||||
$shortcodes->setQueue($queue);
|
||||
}
|
||||
if ($newsletter instanceof \MailPoet\Models\Newsletter) {
|
||||
$newsletter = $newsletterRepository->findOneById($newsletter->id);
|
||||
}
|
||||
if ($newsletter instanceof NewsletterEntity) {
|
||||
$shortcodes->setNewsletter($newsletter);
|
||||
}
|
||||
if ($subscriber instanceof Subscriber) {
|
||||
$subscriber = $subscribersRepository->findOneById($subscriber->id);
|
||||
}
|
||||
if ($subscriber instanceof SubscriberEntity) {
|
||||
$shortcodes->setSubscriber($subscriber);
|
||||
}
|
||||
return $shortcodes->replace($content, $contentSource);
|
||||
}
|
||||
}
|
||||
|
@ -308,6 +308,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Shortcodes\ShortcodesHelper::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Shortcodes\Shortcodes::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class)->setPublic(true);
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace MailPoet\Newsletter\Links;
|
||||
|
||||
use MailPoet\DI\ContainerWrapper;
|
||||
use MailPoet\Models\NewsletterLink;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\Shortcodes\Categories\Link;
|
||||
@ -29,7 +30,8 @@ class Links {
|
||||
public static function extract($content) {
|
||||
$extractedLinks = [];
|
||||
// extract link shortcodes
|
||||
$shortcodes = new Shortcodes();
|
||||
/** @var Shortcodes $shortcodes */
|
||||
$shortcodes = ContainerWrapper::getInstance()->get(Shortcodes::class);
|
||||
$shortcodes = $shortcodes->extract(
|
||||
$content,
|
||||
$categories = [Link::CATEGORY_NAME]
|
||||
@ -97,7 +99,7 @@ class Links {
|
||||
foreach ($matches[1] as $index => $match) {
|
||||
$hash = null;
|
||||
if (preg_match('/-/', $match)) {
|
||||
list(, $hash) = explode('-', $match);
|
||||
[, $hash] = explode('-', $match);
|
||||
}
|
||||
$linkTokens = new LinkTokens;
|
||||
$data = self::createUrlDataObject(
|
||||
|
@ -3,12 +3,13 @@
|
||||
namespace MailPoet\Newsletter\Preview;
|
||||
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Mailer\Mailer;
|
||||
use MailPoet\Mailer\MetaInfo;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class SendPreviewController {
|
||||
@ -24,25 +25,29 @@ class SendPreviewController {
|
||||
/** @var Renderer */
|
||||
private $renderer;
|
||||
|
||||
/** @var Shortcodes */
|
||||
private $shortcodes;
|
||||
|
||||
/** @var SubscribersRepository */
|
||||
private $subscribersRepository;
|
||||
|
||||
public function __construct(
|
||||
Mailer $mailer,
|
||||
MetaInfo $mailerMetaInfo,
|
||||
Renderer $renderer,
|
||||
WPFunctions $wp
|
||||
WPFunctions $wp,
|
||||
SubscribersRepository $subscribersRepository,
|
||||
Shortcodes $shortcodes
|
||||
) {
|
||||
$this->mailer = $mailer;
|
||||
$this->mailerMetaInfo = $mailerMetaInfo;
|
||||
$this->wp = $wp;
|
||||
$this->renderer = $renderer;
|
||||
$this->shortcodes = $shortcodes;
|
||||
$this->subscribersRepository = $subscribersRepository;
|
||||
}
|
||||
|
||||
public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) {
|
||||
// Renderer and Shortcodes need old Newsletter model, until they're rewritten to use Doctrine
|
||||
$newsletterModel = Newsletter::findOne($newsletter->getId());
|
||||
if (!$newsletterModel) {
|
||||
throw new SendPreviewException("Newsletter with ID '{$newsletter->getId()}' not found");
|
||||
}
|
||||
|
||||
$renderedNewsletter = $this->renderer->renderAsPreview($newsletter);
|
||||
$divider = '***MailPoet***';
|
||||
$dataForShortcodes = array_merge(
|
||||
@ -52,19 +57,21 @@ class SendPreviewController {
|
||||
|
||||
$body = implode($divider, $dataForShortcodes);
|
||||
|
||||
$subscriber = Subscriber::getCurrentWPUser() ?: false;
|
||||
$shortcodes = new Shortcodes(
|
||||
$newsletterModel,
|
||||
$subscriber,
|
||||
$queue = false,
|
||||
$wpUserPreview = true
|
||||
);
|
||||
$subscriber = Subscriber::getCurrentWPUser();
|
||||
if ($subscriber instanceof Subscriber) {
|
||||
$subscriber = $this->subscribersRepository->findOneById($subscriber->id);
|
||||
}
|
||||
$this->shortcodes->setNewsletter($newsletter);
|
||||
if ($subscriber instanceof SubscriberEntity) {
|
||||
$this->shortcodes->setSubscriber($subscriber);
|
||||
}
|
||||
$this->shortcodes->setWpUserPreview(true);
|
||||
|
||||
list(
|
||||
[
|
||||
$renderedNewsletter['subject'],
|
||||
$renderedNewsletter['body']['html'],
|
||||
$renderedNewsletter['body']['text']
|
||||
) = explode($divider, $shortcodes->replace($body));
|
||||
$renderedNewsletter['body']['text'],
|
||||
] = explode($divider, $this->shortcodes->replace($body));
|
||||
$renderedNewsletter['id'] = $newsletter->getId();
|
||||
|
||||
$extraParams = [
|
||||
|
@ -2,24 +2,42 @@
|
||||
|
||||
namespace MailPoet\Newsletter\Shortcodes;
|
||||
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class Shortcodes {
|
||||
const SHORTCODE_CATEGORY_NAMESPACE = 'MailPoet\Newsletter\Shortcodes\Categories\\';
|
||||
public $newsletter;
|
||||
public $subscriber;
|
||||
public $queue;
|
||||
public $wpUserPreview;
|
||||
|
||||
public function __construct(
|
||||
$newsletter = false,
|
||||
$subscriber = false,
|
||||
$queue = false,
|
||||
$wpUserPreview = false
|
||||
) {
|
||||
/** @var NewsletterEntity|null */
|
||||
private $newsletter;
|
||||
|
||||
/** @var SubscriberEntity|null */
|
||||
private $subscriber;
|
||||
|
||||
/** @var SendingQueueEntity|null */
|
||||
private $queue;
|
||||
|
||||
/** @var bool */
|
||||
private $wpUserPreview = false;
|
||||
|
||||
public function setNewsletter(NewsletterEntity $newsletter): void {
|
||||
$this->newsletter = $newsletter;
|
||||
}
|
||||
|
||||
public function setSubscriber(SubscriberEntity $subscriber = null): void {
|
||||
$this->subscriber = $subscriber;
|
||||
}
|
||||
|
||||
public function setQueue(SendingQueueEntity $queue): void {
|
||||
$this->queue = $queue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $wpUserPreview
|
||||
*/
|
||||
public function setWpUserPreview(bool $wpUserPreview): void {
|
||||
$this->wpUserPreview = $wpUserPreview;
|
||||
}
|
||||
|
||||
@ -48,48 +66,47 @@ class Shortcodes {
|
||||
}
|
||||
|
||||
public function process($shortcodes, $content = false) {
|
||||
$_this = $this;
|
||||
$processedShortcodes = array_map(
|
||||
function($shortcode) use ($content, $_this) {
|
||||
$shortcodeDetails = $_this->match($shortcode);
|
||||
$shortcodeDetails['shortcode'] = $shortcode;
|
||||
$shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ?
|
||||
$shortcodeDetails['category'] :
|
||||
false;
|
||||
$shortcodeDetails['action'] = !empty($shortcodeDetails['action']) ?
|
||||
$shortcodeDetails['action'] :
|
||||
false;
|
||||
$shortcodeDetails['action_argument'] = !empty($shortcodeDetails['argument']) ?
|
||||
$shortcodeDetails['argument'] :
|
||||
false;
|
||||
$shortcodeDetails['action_argument_value'] = !empty($shortcodeDetails['argument_value']) ?
|
||||
$shortcodeDetails['argument_value'] :
|
||||
false;
|
||||
$shortcodeClass =
|
||||
Shortcodes::SHORTCODE_CATEGORY_NAMESPACE . ucfirst($shortcodeDetails['category']);
|
||||
if (!class_exists($shortcodeClass)) {
|
||||
$customShortcode = WPFunctions::get()->applyFilters(
|
||||
'mailpoet_newsletter_shortcode',
|
||||
$shortcode,
|
||||
$_this->newsletter,
|
||||
$_this->subscriber,
|
||||
$_this->queue,
|
||||
$content,
|
||||
$_this->wpUserPreview
|
||||
);
|
||||
return ($customShortcode === $shortcode) ?
|
||||
false :
|
||||
$customShortcode;
|
||||
}
|
||||
return $shortcodeClass::process(
|
||||
$shortcodeDetails,
|
||||
$_this->newsletter,
|
||||
$_this->subscriber,
|
||||
$_this->queue,
|
||||
$processedShortcodes = [];
|
||||
foreach ($shortcodes as $shortcode) {
|
||||
$shortcodeDetails = $this->match($shortcode);
|
||||
$shortcodeDetails['shortcode'] = $shortcode;
|
||||
$shortcodeDetails['category'] = !empty($shortcodeDetails['category']) ?
|
||||
$shortcodeDetails['category'] :
|
||||
false;
|
||||
$shortcodeDetails['action'] = !empty($shortcodeDetails['action']) ?
|
||||
$shortcodeDetails['action'] :
|
||||
false;
|
||||
$shortcodeDetails['action_argument'] = !empty($shortcodeDetails['argument']) ?
|
||||
$shortcodeDetails['argument'] :
|
||||
false;
|
||||
$shortcodeDetails['action_argument_value'] = !empty($shortcodeDetails['argument_value']) ?
|
||||
$shortcodeDetails['argument_value'] :
|
||||
false;
|
||||
$shortcodeClass =
|
||||
Shortcodes::SHORTCODE_CATEGORY_NAMESPACE . ucfirst($shortcodeDetails['category']);
|
||||
if (!class_exists($shortcodeClass)) {
|
||||
$customShortcode = WPFunctions::get()->applyFilters(
|
||||
'mailpoet_newsletter_shortcode',
|
||||
$shortcode,
|
||||
$this->newsletter,
|
||||
$this->subscriber,
|
||||
$this->queue,
|
||||
$content,
|
||||
$_this->wpUserPreview
|
||||
$this->wpUserPreview
|
||||
);
|
||||
}, $shortcodes);
|
||||
$processedShortcodes[] = ($customShortcode === $shortcode) ?
|
||||
false :
|
||||
$customShortcode;
|
||||
}
|
||||
$processedShortcodes[] = $shortcodeClass::process(
|
||||
$shortcodeDetails,
|
||||
$this->newsletter,
|
||||
$this->subscriber,
|
||||
$this->queue,
|
||||
$content,
|
||||
$this->wpUserPreview
|
||||
);
|
||||
}
|
||||
return $processedShortcodes;
|
||||
}
|
||||
|
||||
|
@ -2,13 +2,21 @@
|
||||
|
||||
namespace MailPoet\Newsletter\ViewInBrowser;
|
||||
|
||||
use MailPoet\DI\ContainerWrapper;
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\Links\Links;
|
||||
use MailPoet\Newsletter\NewslettersRepository;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Settings\SettingsController;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use MailPoet\Tasks\Sending;
|
||||
use MailPoet\WP\Emoji;
|
||||
|
||||
class ViewInBrowserRenderer {
|
||||
@ -21,14 +29,19 @@ class ViewInBrowserRenderer {
|
||||
/** @var Renderer */
|
||||
private $renderer;
|
||||
|
||||
/** @var Shortcodes */
|
||||
private $shortcodes;
|
||||
|
||||
public function __construct(
|
||||
Emoji $emoji,
|
||||
SettingsController $settings,
|
||||
Shortcodes $shortcodes,
|
||||
Renderer $renderer
|
||||
) {
|
||||
$this->emoji = $emoji;
|
||||
$this->isTrackingEnabled = $settings->get('tracking.enabled');
|
||||
$this->renderer = $renderer;
|
||||
$this->shortcodes = $shortcodes;
|
||||
}
|
||||
|
||||
public function render(
|
||||
@ -61,13 +74,13 @@ class ViewInBrowserRenderer {
|
||||
$newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html');
|
||||
}
|
||||
}
|
||||
$shortcodes = new Shortcodes(
|
||||
$this->prepareShortcodes(
|
||||
$newsletter,
|
||||
$subscriber ?: false,
|
||||
$queue ?: false,
|
||||
$wpUserPreview
|
||||
);
|
||||
$renderedNewsletter = $shortcodes->replace($newsletterBody);
|
||||
$renderedNewsletter = $this->shortcodes->replace($newsletterBody);
|
||||
if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) {
|
||||
$renderedNewsletter = Links::replaceSubscriberData(
|
||||
$subscriber->id,
|
||||
@ -77,4 +90,36 @@ class ViewInBrowserRenderer {
|
||||
}
|
||||
return $renderedNewsletter;
|
||||
}
|
||||
|
||||
/** this is here to prepare entities for the shortcodes library, when this whole file uses doctrine, this can be deleted */
|
||||
private function prepareShortcodes($newsletter, $subscriber, $queue, $wpUserPreview) {
|
||||
/** @var SendingQueuesRepository $sendingQueueRepository */
|
||||
$sendingQueueRepository = ContainerWrapper::getInstance()->get(SendingQueuesRepository::class);
|
||||
/** @var NewslettersRepository $newsletterRepository */
|
||||
$newsletterRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
|
||||
/** @var NewslettersRepository $newsletterRepository */
|
||||
$subscribersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
|
||||
/** @var SubscribersRepository $subscribersRepository */
|
||||
$subscribersRepository = ContainerWrapper::getInstance()->get(SubscribersRepository::class);
|
||||
|
||||
if ($queue instanceof Sending || $queue instanceof SendingQueue) {
|
||||
$queue = $sendingQueueRepository->findOneById($queue->id);
|
||||
}
|
||||
if ($queue instanceof SendingQueueEntity) {
|
||||
$this->shortcodes->setQueue($queue);
|
||||
}
|
||||
if ($newsletter instanceof Newsletter) {
|
||||
$newsletter = $newsletterRepository->findOneById($newsletter->id);
|
||||
}
|
||||
if ($newsletter instanceof NewsletterEntity) {
|
||||
$this->shortcodes->setNewsletter($newsletter);
|
||||
}
|
||||
if ($subscriber instanceof Subscriber) {
|
||||
$subscriber = $subscribersRepository->findOneById($subscriber->id);
|
||||
}
|
||||
$this->shortcodes->setWpUserPreview($wpUserPreview);
|
||||
if ($subscriber instanceof SubscriberEntity) {
|
||||
$this->shortcodes->setSubscriber($subscriber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,9 +27,17 @@ class Clicks {
|
||||
/** @var Cookies */
|
||||
private $cookies;
|
||||
|
||||
public function __construct(SettingsController $settingsController, Cookies $cookies) {
|
||||
/** @var Shortcodes */
|
||||
private $shortcodes;
|
||||
|
||||
public function __construct(
|
||||
SettingsController $settingsController,
|
||||
Cookies $cookies,
|
||||
Shortcodes $shortcodes
|
||||
) {
|
||||
$this->settingsController = $settingsController;
|
||||
$this->cookies = $cookies;
|
||||
$this->shortcodes = $shortcodes;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,8 +123,11 @@ class Clicks {
|
||||
$wpUserPreview
|
||||
);
|
||||
} else {
|
||||
$shortcodes = new Shortcodes($newsletter, $subscriber, $queue, $wpUserPreview);
|
||||
$url = $shortcodes->replace($url);
|
||||
$this->shortcodes->setQueue($queue);
|
||||
$this->shortcodes->setNewsletter($newsletter);
|
||||
$this->shortcodes->setSubscriber($subscriber);
|
||||
$this->shortcodes->setWpUserPreview($wpUserPreview);
|
||||
$url = $this->shortcodes->replace($url);
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
@ -9,7 +9,9 @@ use MailPoet\Mailer\Mailer;
|
||||
use MailPoet\Mailer\MailerError;
|
||||
use MailPoet\Mailer\MetaInfo;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Newsletter\Url;
|
||||
use MailPoet\Subscribers\SubscribersRepository;
|
||||
use MailPoet\Subscription\SubscriptionUrlFactory;
|
||||
use MailPoet\Util\Security;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
@ -68,7 +70,9 @@ class SendPreviewControllerTest extends \MailPoetTest {
|
||||
$mailer,
|
||||
new MetaInfo(),
|
||||
$this->diContainer->get(Renderer::class),
|
||||
new WPFunctions()
|
||||
new WPFunctions(),
|
||||
$this->diContainer->get(Shortcodes::class),
|
||||
$this->diContainer->get(SubscribersRepository::class)
|
||||
);
|
||||
$sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
|
||||
}
|
||||
@ -95,7 +99,9 @@ class SendPreviewControllerTest extends \MailPoetTest {
|
||||
$mailer,
|
||||
new MetaInfo(),
|
||||
$this->diContainer->get(Renderer::class),
|
||||
new WPFunctions()
|
||||
new WPFunctions(),
|
||||
$this->diContainer->get(Shortcodes::class),
|
||||
$this->diContainer->get(SubscribersRepository::class)
|
||||
);
|
||||
$sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
|
||||
}
|
||||
|
@ -3,11 +3,13 @@
|
||||
namespace MailPoet\Test\Newsletter;
|
||||
|
||||
use MailPoet\Config\Populator;
|
||||
use MailPoet\Models\CustomField;
|
||||
use MailPoet\Entities\CustomFieldEntity;
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\Entities\SubscriberCustomFieldEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Models\SubscriberCustomField;
|
||||
use MailPoet\Newsletter\Shortcodes\Categories\Date;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||
@ -15,17 +17,16 @@ use MailPoet\Settings\SettingsController;
|
||||
use MailPoet\Subscribers\LinkTokens;
|
||||
use MailPoet\Subscription\SubscriptionUrlFactory;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
use MailPoetVendor\Idiorm\ORM;
|
||||
|
||||
require_once(ABSPATH . 'wp-admin/includes/user.php');
|
||||
|
||||
class ShortcodesTest extends \MailPoetTest {
|
||||
public $newsletterId;
|
||||
public $wPPost;
|
||||
public $wPUser;
|
||||
public $renderedNewsletter;
|
||||
public $newsletter;
|
||||
public $subscriber;
|
||||
private $wPPost;
|
||||
private $wPUser;
|
||||
/** @var NewsletterEntity */
|
||||
private $newsletter;
|
||||
/** @var SubscriberEntity */
|
||||
private $subscriber;
|
||||
/** @var Shortcodes */
|
||||
private $shortcodesObject;
|
||||
/** @var SettingsController */
|
||||
@ -42,10 +43,9 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
$this->wPPost = $this->_createWPPost();
|
||||
$this->subscriber = $this->_createSubscriber();
|
||||
$this->newsletter = $this->_createNewsletter();
|
||||
$this->shortcodesObject = new Shortcodes(
|
||||
$this->newsletter,
|
||||
$this->subscriber
|
||||
);
|
||||
$this->shortcodesObject = $this->diContainer->get(Shortcodes::class);
|
||||
$this->shortcodesObject->setNewsletter($this->newsletter);
|
||||
$this->shortcodesObject->setSubscriber($this->subscriber);
|
||||
$this->settings->set('tracking.enabled', false);
|
||||
$this->subscriptionUrlFactory = new SubscriptionUrlFactory(WPFunctions::get(), $this->settings, new LinkTokens);
|
||||
}
|
||||
@ -123,7 +123,7 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
'<a href="#">not post</a>';
|
||||
$result =
|
||||
$shortcodesObject->process(['[newsletter:subject]'], $content);
|
||||
expect($result[0])->equals($this->newsletter->subject);
|
||||
expect($result[0])->equals($this->newsletter->getSubject());
|
||||
$result =
|
||||
$shortcodesObject->process(['[newsletter:total]'], $content);
|
||||
expect($result[0])->equals(2);
|
||||
@ -136,65 +136,42 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
public function itCanProcessPostNotificationNewsletterNumberShortcode() {
|
||||
// create first post notification
|
||||
$postNotificationHistory = $this->_createNewsletter(
|
||||
$parentId = $this->newsletterId,
|
||||
$parentId = $this->newsletter,
|
||||
$type = Newsletter::TYPE_NOTIFICATION_HISTORY
|
||||
);
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$postNotificationHistory,
|
||||
$this->subscriber
|
||||
);
|
||||
$result = $shortcodesObject->process(['[newsletter:number]']);
|
||||
$this->shortcodesObject->setNewsletter($postNotificationHistory);
|
||||
$result = $this->shortcodesObject->process(['[newsletter:number]']);
|
||||
expect($result['0'])->equals(1);
|
||||
|
||||
// create another post notification
|
||||
$postNotificationHistory = $this->_createNewsletter(
|
||||
$parentId = $this->newsletterId,
|
||||
$parentId = $this->newsletter,
|
||||
$type = Newsletter::TYPE_NOTIFICATION_HISTORY
|
||||
);
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$postNotificationHistory,
|
||||
$this->subscriber
|
||||
);
|
||||
$result = $shortcodesObject->process(['[newsletter:number]']);
|
||||
$this->shortcodesObject->setNewsletter($postNotificationHistory);
|
||||
$result = $this->shortcodesObject->process(['[newsletter:number]']);
|
||||
expect($result['0'])->equals(2);
|
||||
}
|
||||
|
||||
public function testSubscriberShortcodesRequireSubscriberObjectOrFalseValue() {
|
||||
// when subscriber is empty, default value is returned
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$this->newsletter,
|
||||
$subscriber = false
|
||||
);
|
||||
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
$this->shortcodesObject->setSubscriber(null);
|
||||
$result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
expect($result[0])->equals('test');
|
||||
// when subscriber is an object, proper value is returned
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$this->newsletter,
|
||||
$this->subscriber
|
||||
);
|
||||
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
expect($result[0])->equals($this->subscriber->first_name);
|
||||
// when subscriber is not empty and not an object, shortcode is returned
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$this->newsletter,
|
||||
$subscriber = []
|
||||
);
|
||||
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
expect($result[0])->equals('[subscriber:firstname | default:test]');
|
||||
$this->shortcodesObject->setSubscriber($this->subscriber);
|
||||
$result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
expect($result[0])->equals($this->subscriber->getFirstName());
|
||||
}
|
||||
|
||||
public function testSubscriberFirstAndLastNameShortcodesReturnDefaultValueWhenDataIsEmpty() {
|
||||
// when subscriber exists but first or last names are empty, default value is returned
|
||||
$subscriber = $this->subscriber;
|
||||
$subscriber->firstName = '';
|
||||
$subscriber->lastName = '';
|
||||
$shortcodesObject = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$this->newsletter,
|
||||
$subscriber
|
||||
);
|
||||
$result = $shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
$subscriber->setFirstName('');
|
||||
$subscriber->setLastName('');
|
||||
$result = $this->shortcodesObject->process(['[subscriber:firstname | default:test]']);
|
||||
expect($result[0])->equals('test');
|
||||
$result = $shortcodesObject->process(['[subscriber:lastname | default:test]']);
|
||||
$result = $this->shortcodesObject->process(['[subscriber:lastname | default:test]']);
|
||||
expect($result[0])->equals('test');
|
||||
}
|
||||
|
||||
@ -202,10 +179,10 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
$shortcodesObject = $this->shortcodesObject;
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:firstname]']);
|
||||
expect($result[0])->equals($this->subscriber->first_name);
|
||||
expect($result[0])->equals($this->subscriber->getFirstName());
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:lastname]']);
|
||||
expect($result[0])->equals($this->subscriber->last_name);
|
||||
expect($result[0])->equals($this->subscriber->getLastName());
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:displayname]']);
|
||||
expect($result[0])->equals($this->wPUser->user_login);
|
||||
@ -215,13 +192,11 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:count]']);
|
||||
expect($result[0])->equals($subscriberCount);
|
||||
$this->subscriber->status = 'unsubscribed';
|
||||
$this->subscriber->save();
|
||||
$this->subscriber->setStatus('unsubscribed');
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:count]']);
|
||||
expect($result[0])->equals($subscriberCount - 1);
|
||||
$this->subscriber->status = 'bounced';
|
||||
$this->subscriber->save();
|
||||
$this->subscriber->setStatus('bounced');
|
||||
$result =
|
||||
$shortcodesObject->process(['[subscriber:count]']);
|
||||
expect($result[0])->equals($subscriberCount - 1);
|
||||
@ -230,23 +205,22 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
public function testItCanProcessSubscriberCustomFieldShortcodes() {
|
||||
$shortcodesObject = $this->shortcodesObject;
|
||||
$subscriber = $this->subscriber;
|
||||
$customField = CustomField::create();
|
||||
$customField->name = 'custom_field_name';
|
||||
$customField->type = 'text';
|
||||
$customField->save();
|
||||
$customField = new CustomFieldEntity();
|
||||
$customField->setName('custom_field_name');
|
||||
$customField->setType('text');
|
||||
$this->entityManager->persist($customField);
|
||||
$this->entityManager->flush();
|
||||
$result = $shortcodesObject->process(
|
||||
['[subscriber:cf_' . $customField->id . ']']
|
||||
['[subscriber:cf_' . $customField->getId() . ']']
|
||||
);
|
||||
expect($result[0])->false();
|
||||
$subscriberCustomField = SubscriberCustomField::create();
|
||||
$subscriberCustomField->subscriberId = $subscriber->id;
|
||||
$subscriberCustomField->customFieldId = (int)$customField->id;
|
||||
$subscriberCustomField->value = 'custom_field_value';
|
||||
$subscriberCustomField->save();
|
||||
$subscriberCustomField = new SubscriberCustomFieldEntity($subscriber, $customField, 'custom_field_value');
|
||||
$this->entityManager->persist($subscriberCustomField);
|
||||
$this->entityManager->flush();
|
||||
$result = $shortcodesObject->process(
|
||||
['[subscriber:cf_' . $customField->id . ']']
|
||||
['[subscriber:cf_' . $customField->getId() . ']']
|
||||
);
|
||||
expect($result[0])->equals($subscriberCustomField->value);
|
||||
expect($result[0])->equals($subscriberCustomField->getValue());
|
||||
}
|
||||
|
||||
public function testItCanProcessLinkShortcodes() {
|
||||
@ -288,7 +262,7 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
'[link:newsletter_view_in_browser_url]',
|
||||
];
|
||||
// tracking function only works during sending, so queue object must not be false
|
||||
$shortcodesObject->queue = true;
|
||||
$shortcodesObject->setQueue($this->_createQueue());
|
||||
$result = $shortcodesObject->process($initialShortcodes);
|
||||
foreach ($result as $index => $transformedShortcode) {
|
||||
// 1. result must not contain a link
|
||||
@ -303,7 +277,7 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
|
||||
public function testItReturnsDefaultLinksWhenPreviewIsEnabled() {
|
||||
$shortcodesObject = $this->shortcodesObject;
|
||||
$shortcodesObject->wpUserPreview = true;
|
||||
$shortcodesObject->setWpUserPreview(true);
|
||||
$shortcodes = [
|
||||
'[link:subscription_unsubscribe_url]',
|
||||
'[link:subscription_instant_unsubscribe_url]',
|
||||
@ -336,7 +310,7 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
expect($result[0])->equals('success');
|
||||
$this->settings->set('tracking.enabled', true);
|
||||
// tracking function only works during sending, so queue object must not be false
|
||||
$shortcodesObject->queue = true;
|
||||
$shortcodesObject->setQueue($this->_createQueue());
|
||||
$result = $shortcodesObject->process([$shortcode]);
|
||||
expect($result[0])->equals($shortcode);
|
||||
}
|
||||
@ -351,54 +325,45 @@ class ShortcodesTest extends \MailPoetTest {
|
||||
}
|
||||
|
||||
public function _createWPUser() {
|
||||
$wPUser = wp_create_user('phoenix_test_user', 'pass', 'phoenix@test.com');
|
||||
wp_create_user('phoenix_test_user', 'pass', 'phoenix@test.com');
|
||||
$wPUser = get_user_by('login', 'phoenix_test_user');
|
||||
return $wPUser;
|
||||
}
|
||||
|
||||
public function _createSubscriber() {
|
||||
$subscriber = Subscriber::create();
|
||||
$subscriber->hydrate(
|
||||
[
|
||||
'first_name' => 'Donald',
|
||||
'last_name' => 'Trump',
|
||||
'email' => 'mister@trump.com',
|
||||
'status' => Subscriber::STATUS_SUBSCRIBED,
|
||||
'WP_user_id' => $this->wPUser->ID,
|
||||
]
|
||||
);
|
||||
$subscriber->save();
|
||||
return Subscriber::findOne($subscriber->id);
|
||||
public function _createSubscriber(): SubscriberEntity {
|
||||
$subscriber = new SubscriberEntity();
|
||||
$subscriber->setFirstName('Donald');
|
||||
$subscriber->setLastName('Trump');
|
||||
$subscriber->setEmail('mister@trump.com');
|
||||
$subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||
$subscriber->setWpUserId($this->wPUser->ID);
|
||||
return $subscriber;
|
||||
}
|
||||
|
||||
public function _createNewsletter($parentId = null, $type = Newsletter::TYPE_NOTIFICATION) {
|
||||
$newsletter = Newsletter::create();
|
||||
$newsletter->hydrate(
|
||||
[
|
||||
'subject' => 'some subject',
|
||||
'type' => $type,
|
||||
'status' => Newsletter::STATUS_SENT,
|
||||
'parent_id' => $parentId,
|
||||
]
|
||||
);
|
||||
$newsletter->save();
|
||||
return Newsletter::findOne($newsletter->id);
|
||||
public function _createNewsletter(NewsletterEntity $parent = null, $type = Newsletter::TYPE_NOTIFICATION): NewsletterEntity {
|
||||
$newsletter = new NewsletterEntity();
|
||||
$newsletter->setSubject('some subject');
|
||||
$newsletter->setType($type);
|
||||
$newsletter->setStatus(NewsletterEntity::STATUS_SENT);
|
||||
if ($parent) {
|
||||
$newsletter->setParent($parent);
|
||||
}
|
||||
return $newsletter;
|
||||
}
|
||||
|
||||
public function _createQueue() {
|
||||
$queue = SendingQueue::create();
|
||||
$queue->newsletterId = $this->newsletter['id'];
|
||||
$queue->status = 'completed';
|
||||
$queue->save();
|
||||
return SendingQueue::findOne($queue->id);
|
||||
/** @return SendingQueueEntity */
|
||||
public function _createQueue(): SendingQueueEntity {
|
||||
$queue = new SendingQueueEntity();
|
||||
$queue->setNewsletter($this->newsletter);
|
||||
return $queue;
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table);
|
||||
$this->truncateEntity(NewsletterEntity::class);
|
||||
$this->truncateEntity(SubscriberEntity::class);
|
||||
$this->truncateEntity(SendingQueueEntity::class);
|
||||
$this->truncateEntity(CustomFieldEntity::class);
|
||||
$this->truncateEntity(SubscriberCustomFieldEntity::class);
|
||||
wp_delete_post($this->wPPost, true);
|
||||
wp_delete_user($this->wPUser->ID);
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\Links\Links;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Router\Router;
|
||||
use MailPoet\Settings\SettingsController;
|
||||
use MailPoet\Tasks\Sending as SendingTask;
|
||||
@ -153,6 +154,7 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
|
||||
$viewInBrowser = new ViewInBrowserRenderer(
|
||||
$emoji,
|
||||
$this->diContainer->get(SettingsController::class),
|
||||
$this->diContainer->get(Shortcodes::class),
|
||||
$this->diContainer->get(Renderer::class)
|
||||
);
|
||||
$renderedBody = $viewInBrowser->render(
|
||||
|
@ -66,7 +66,9 @@ class TrackTest extends \MailPoetTest {
|
||||
'link_hash' => $link->getHash(),
|
||||
'preview' => false,
|
||||
];
|
||||
$queue = SendingTask::createFromQueue(SendingQueue::findOne($queue->getId()));
|
||||
$queue = SendingQueue::findOne($queue->getId());
|
||||
assert($queue instanceof SendingQueue);
|
||||
$queue = SendingTask::createFromQueue($queue);
|
||||
$queue->updateProcessedSubscribers([$subscriberModel->id]);
|
||||
// instantiate class
|
||||
$this->track = $this->diContainer->get(Track::class);
|
||||
|
@ -15,6 +15,7 @@ use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\StatisticsClicks;
|
||||
use MailPoet\Models\StatisticsOpens;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Settings\SettingsController;
|
||||
use MailPoet\Statistics\Track\Clicks;
|
||||
use MailPoet\Subscribers\LinkTokens;
|
||||
@ -75,13 +76,15 @@ class ClicksTest extends \MailPoetTest {
|
||||
'link' => $link,
|
||||
'preview' => false,
|
||||
];
|
||||
$queue = SendingTask::createFromQueue(SendingQueue::findOne($queue->getId()));
|
||||
$queue = SendingQueue::findOne($queue->getId());
|
||||
assert($queue instanceof SendingQueue);
|
||||
$queue = SendingTask::createFromQueue($queue);
|
||||
$queue->updateProcessedSubscribers([$subscriberModel->id]);
|
||||
// instantiate class
|
||||
$this->settingsController = Stub::makeEmpty(SettingsController::class, [
|
||||
'get' => false,
|
||||
], $this);
|
||||
$this->clicks = new Clicks($this->settingsController, new Cookies());
|
||||
$this->clicks = new Clicks($this->settingsController, new Cookies(), $this->diContainer->get(Shortcodes::class));
|
||||
}
|
||||
|
||||
public function testItAbortsWhenTrackDataIsEmptyOrMissingLink() {
|
||||
|
Reference in New Issue
Block a user