diff --git a/assets/js/src/newsletters/listings/notification_history.jsx b/assets/js/src/newsletters/listings/notification_history.jsx index 6b1d1bd4d2..75284c1605 100644 --- a/assets/js/src/newsletters/listings/notification_history.jsx +++ b/assets/js/src/newsletters/listings/notification_history.jsx @@ -68,7 +68,7 @@ const NewsletterListNotificationHistory = React.createClass({ { newsletter.subject } + >{ newsletter.queue.newsletter_rendered_subject } { actions } diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 4024e90096..e886c9cac2 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -25,8 +25,7 @@ class Newsletter { if(!$newsletter) { return false; } - // if the newsletter was previously rendered, return it - // otherwise, process/render it + // return the newsletter if it was previously rendered if(!is_null($queue->getNewsletterRenderedBody())) { return $newsletter; } @@ -34,7 +33,7 @@ class Newsletter { if($this->tracking_enabled) { // hook to the newsletter post-processing filter and add tracking image $this->tracking_image_inserted = OpenTracking::addTrackingImage(); - // render newsletter and save its + // render newsletter $rendered_newsletter = $newsletter->render(); // hash and save all links $rendered_newsletter = LinksTask::process($rendered_newsletter, $newsletter, $queue); diff --git a/lib/Newsletter/Shortcodes/Categories/Date.php b/lib/Newsletter/Shortcodes/Categories/Date.php index 0a1e72beb9..8bea0a15d6 100644 --- a/lib/Newsletter/Shortcodes/Categories/Date.php +++ b/lib/Newsletter/Shortcodes/Categories/Date.php @@ -14,4 +14,4 @@ class Date { ); return (isset($actions[$action])) ? $actions[$action] : false; } -} +} \ No newline at end of file diff --git a/lib/Newsletter/Shortcodes/Categories/Link.php b/lib/Newsletter/Shortcodes/Categories/Link.php index 8968fe27c3..e63f4f1ed2 100644 --- a/lib/Newsletter/Shortcodes/Categories/Link.php +++ b/lib/Newsletter/Shortcodes/Categories/Link.php @@ -125,4 +125,4 @@ class Link { private static function getShortcode($action) { return sprintf('[link:%s]', $action); } -} +} \ No newline at end of file diff --git a/lib/Newsletter/Shortcodes/Categories/Newsletter.php b/lib/Newsletter/Shortcodes/Categories/Newsletter.php index 8ab4aa6742..785ca33c94 100644 --- a/lib/Newsletter/Shortcodes/Categories/Newsletter.php +++ b/lib/Newsletter/Shortcodes/Categories/Newsletter.php @@ -1,10 +1,10 @@ subject : false; case 'total': return substr_count($content, 'data-post-id'); @@ -28,10 +28,10 @@ class Newsletter { return ($latest_post) ? $latest_post['post_title'] : false; case 'number': - if($newsletter['type'] !== 'notification') return false; + if($newsletter->type !== NewsletterModel::TYPE_NOTIFICATION_HISTORY) return false; $sent_newsletters = - SendingQueue::where('newsletter_id', $newsletter['id']) - ->where('status', 'completed') + NewsletterModel::where('parent_id', $newsletter->parent_id) + ->where('status', NewsletterModel::STATUS_SENT) ->count(); return ++$sent_newsletters; diff --git a/lib/Newsletter/Shortcodes/Categories/Subscriber.php b/lib/Newsletter/Shortcodes/Categories/Subscriber.php index 12cd250c32..f69911dd09 100644 --- a/lib/Newsletter/Shortcodes/Categories/Subscriber.php +++ b/lib/Newsletter/Shortcodes/Categories/Subscriber.php @@ -1,5 +1,6 @@ first_name : $default_value; case 'lastname': - return ($subscriber) ? $subscriber['last_name'] : $default_value; + return ($subscriber) ? $subscriber->last_name : $default_value; case 'email': - return ($subscriber) ? $subscriber['email'] : false; + return ($subscriber) ? $subscriber->email : false; case 'displayname': - if($subscriber && $subscriber['wp_user_id']) { - $wp_user = get_userdata($subscriber['wp_user_id']); + if($subscriber && $subscriber->wp_user_id) { + $wp_user = get_userdata($subscriber->wp_user_id); return $wp_user->user_login; } return $default_value; @@ -31,10 +32,10 @@ class Subscriber { ->count(); default: if(preg_match('/cf_(\d+)/', $action, $custom_field) && - !empty($subscriber['id']) + !empty($subscriber->id) ) { $custom_field = SubscriberCustomField - ::where('subscriber_id', $subscriber['id']) + ::where('subscriber_id', $subscriber->id) ->where('custom_field_id', $custom_field[1]) ->findOne(); return ($custom_field) ? $custom_field->value : false; diff --git a/lib/Newsletter/Shortcodes/Shortcodes.php b/lib/Newsletter/Shortcodes/Shortcodes.php index e123c14960..53009386cd 100644 --- a/lib/Newsletter/Shortcodes/Shortcodes.php +++ b/lib/Newsletter/Shortcodes/Shortcodes.php @@ -12,15 +12,9 @@ class Shortcodes { $subscriber = false, $queue = false ) { - $this->newsletter = (is_object($newsletter)) ? - $newsletter->asArray() : - $newsletter; - $this->subscriber = (is_object($subscriber)) ? - $subscriber->asArray() : - $subscriber; - $this->queue = (is_object($queue)) ? - $queue->asArray() : - $queue; + $this->newsletter = $newsletter; + $this->subscriber = $subscriber; + $this->queue = $queue; } function extract($content, $categories = false) { diff --git a/tests/unit/Cron/Workers/SendingQueue/Tasks/ShortcodesTest.php b/tests/unit/Cron/Workers/SendingQueue/Tasks/ShortcodesTest.php index 9dbfc229b1..ac09b59577 100644 --- a/tests/unit/Cron/Workers/SendingQueue/Tasks/ShortcodesTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/Tasks/ShortcodesTest.php @@ -7,11 +7,10 @@ if(!defined('ABSPATH')) exit; class ShortcodesTaskTest extends MailPoetTest { function testItCanReplaceShortcodes() { - $queue = $newsletter = array( + $queue = $newsletter = (object)array( 'id' => 1 - ); - $subscriber = array( + $subscriber = (object)array( 'email' => 'test@xample. com', 'first_name' => 'John', 'last_name' => 'Doe' diff --git a/tests/unit/Newsletter/ShortcodesTest.php b/tests/unit/Newsletter/ShortcodesTest.php index 690e4961d9..4b19a42881 100644 --- a/tests/unit/Newsletter/ShortcodesTest.php +++ b/tests/unit/Newsletter/ShortcodesTest.php @@ -2,6 +2,7 @@ use MailPoet\Config\Populator; use MailPoet\Models\CustomField; +use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue; use MailPoet\Models\Setting; use MailPoet\Models\Subscriber; @@ -22,11 +23,7 @@ class ShortcodesTest extends MailPoetTest { $this->WP_user = $this->_createWPUser(); $this->WP_post = $this->_createWPPost(); $this->subscriber = $this->_createSubscriber(); - $this->newsletter = array( - 'subject' => 'some subject', - 'type' => 'notification', - 'id' => 2 - ); + $this->newsletter = $this->_createNewsletter(); $this->shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes( $this->newsletter, $this->subscriber @@ -72,7 +69,7 @@ class ShortcodesTest extends MailPoetTest { $shortcode = array('[some:shortcode]'); $result = $shortcodes_object->process($shortcode); expect($result[0])->false(); - add_filter('mailpoet_newsletter_shortcode', function ( + add_filter('mailpoet_newsletter_shortcode', function( $shortcode, $newsletter, $subscriber, $queue, $content) { if($shortcode === '[some:shortcode]') return 'success'; }, 10, 5); @@ -98,7 +95,7 @@ class ShortcodesTest extends MailPoetTest { 'not post'; $result = $shortcodes_object->process(array('[newsletter:subject]')); - expect($result[0])->equals($this->newsletter['subject']); + expect($result[0])->equals($this->newsletter->subject); $result = $shortcodes_object->process(array('[newsletter:total]'), $content); expect($result[0])->equals(2); @@ -106,12 +103,32 @@ class ShortcodesTest extends MailPoetTest { $shortcodes_object->process(array('[newsletter:post_title]')); $wp_post = get_post($this->WP_post); expect($result['0'])->equals($wp_post->post_title); - $result = - $shortcodes_object->process(array('[newsletter:number]')); + } + + + function itCanProcessPostNotificationNewsletterNumberShortcode() { + // create first post notification + $post_notification_history = $this->_createNewsletter( + $parent_id = $this->newsletter_id, + $type = Newsletter::TYPE_NOTIFICATION_HISTORY + ); + $shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes( + $post_notification_history, + $this->subscriber + ); + $result = $shortcodes_object->process(array('[newsletter:number]')); expect($result['0'])->equals(1); - $queue = $this->_createQueue(); - $result = - $shortcodes_object->process(array('[newsletter:number]')); + + // create another post notification + $post_notification_history = $this->_createNewsletter( + $parent_id = $this->newsletter_id, + $type = Newsletter::TYPE_NOTIFICATION_HISTORY + ); + $shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes( + $post_notification_history, + $this->subscriber + ); + $result = $shortcodes_object->process(array('[newsletter:number]')); expect($result['0'])->equals(2); } @@ -228,7 +245,7 @@ class ShortcodesTest extends MailPoetTest { $shortcode = '[link:shortcode]'; $result = $shortcodes_object->process(array($shortcode)); expect($result[0])->false(); - add_filter('mailpoet_newsletter_shortcode_link', function ( + add_filter('mailpoet_newsletter_shortcode_link', function( $shortcode, $newsletter, $subscriber, $queue) { if($shortcode === '[link:shortcode]') return 'success'; }, 10, 4); @@ -271,15 +288,30 @@ class ShortcodesTest extends MailPoetTest { return Subscriber::findOne($subscriber->id); } + function _createNewsletter($parent_id = null, $type = Newsletter::TYPE_NOTIFICATION) { + $newsletter = Newsletter::create(); + $newsletter->hydrate( + array( + 'subject' => 'some subject', + 'type' => $type, + 'status' => Newsletter::STATUS_SENT, + 'parent_id' => $parent_id, + ) + ); + $newsletter->save(); + return Newsletter::findOne($newsletter->id); + } + function _createQueue() { $queue = SendingQueue::create(); $queue->newsletter_id = $this->newsletter['id']; $queue->status = 'completed'; $queue->save(); - return $queue; + return SendingQueue::findOne($queue->id); } 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);