diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php
index fa76e72e19..02016d71e0 100644
--- a/lib/Config/Initializer.php
+++ b/lib/Config/Initializer.php
@@ -5,6 +5,7 @@ use MailPoet\Models;
use MailPoet\Cron\Supervisor;
use MailPoet\Router;
use MailPoet\Models\Setting;
+use MailPoet\Settings\Pages;
if(!defined('ABSPATH')) exit;
@@ -31,6 +32,7 @@ class Initializer {
$this->runQueueSupervisor();
$this->setupShortcodes();
$this->setupHooks();
+ $this->setupPages();
$this->setupImages();
}
@@ -127,6 +129,11 @@ class Initializer {
$changelog->init();
}
+ function setupPages() {
+ $pages = new Pages();
+ $pages->init();
+ }
+
function setupShortcodes() {
$shortcodes = new Shortcodes();
$shortcodes->init();
diff --git a/lib/Config/Populator.php b/lib/Config/Populator.php
index 5c0da793d4..d1518e7287 100644
--- a/lib/Config/Populator.php
+++ b/lib/Config/Populator.php
@@ -8,6 +8,7 @@ use MailPoet\Config\PopulatorData\Templates\PostNotificationsBlankTemplate;
use \MailPoet\Models\Segment;
use \MailPoet\Segments\WP;
use \MailPoet\Models\Setting;
+use \MailPoet\Settings\Pages;
if (!defined('ABSPATH')) exit;
@@ -48,6 +49,29 @@ class Populator {
$this->createDefaultSegments();
$this->createDefaultSettings();
+ $this->createMailPoetPage();
+ }
+
+ private function createMailPoetPage() {
+ $pages = get_posts(array(
+ 'posts_per_page' => 1,
+ 'orderby' => 'date',
+ 'order' => 'DESC',
+ 'post_type' => 'mailpoet_page'
+ ));
+
+ $page = null;
+ if(!empty($pages)) {
+ $page = array_shift($pages);
+ if(strpos($page->post_content, '[mailpoet_page]') === false) {
+ $page = null;
+ }
+ }
+
+ if($page === null) {
+ $mailpoet_page_id = Pages::createMailPoetPage();
+ Setting::setValue('subscription.page', $mailpoet_page_id);
+ }
}
private function createDefaultSettings() {
@@ -74,9 +98,7 @@ class Populator {
));
// enable signup confirmation by default
- Setting::setValue('signup_confirmation', array(
- 'enabled' => true
- ));
+ Setting::setValue('signup_confirmation.enabled', true);
}
private function createDefaultSegments() {
diff --git a/lib/Config/Shortcodes.php b/lib/Config/Shortcodes.php
index b7e2716eb4..f498db58f2 100644
--- a/lib/Config/Shortcodes.php
+++ b/lib/Config/Shortcodes.php
@@ -1,5 +1,8 @@
count();
+ } else {
+ return SubscriberSegment::whereIn('segment_id', $segment_ids)
+ ->select('subscriber_id')->distinct()
+ ->filter('subscribed')
+ ->findResultSet()->count();
+ }
+ }
+
+ function getArchive($params) {
+ if(!empty($params['segments'])) {
+ $segment_ids = array_map(function($segment_id) {
+ return (int)trim($segment_id);
+ }, explode(',', $params['segments']));
+ }
+
+ $newsletters = array();
+ $html = '';
+
+ // TODO: needs more advanced newsletters in order to finish
+ $newsletters = Newsletter::limit(10)->orderByDesc('created_at')->findMany();
+
+ if(empty($newsletters)) {
+ return apply_filters(
+ 'mailpoet_archive_no_newsletters',
+ __('Oops! There are no newsletters to display.')
+ );
+ } else {
+ $title = apply_filters('mailpoet_archive_title', '');
+ if(!empty($title)) {
+ $html .= '
'.$title.'
';
+ }
+
+ $html .= '';
+ foreach($newsletters as $newsletter) {
+ $html .= '- '.
+ ''.
+ apply_filters('mailpoet_archive_date', $newsletter).
+ '
+ '.
+ apply_filters('mailpoet_archive_subject', $newsletter).
+ '
+
';
+ }
+ $html .= '
';
+ }
+ return $html;
+ }
+
+ function renderArchiveDate($newsletter) {
+ return date_i18n(
+ get_option('date_format'),
+ strtotime($newsletter->created_at)
+ );
+ }
+
+ function renderArchiveSubject($newsletter) {
+ return ''
+ .esc_attr($newsletter->subject).
+ '';
+ }
+
}
\ No newline at end of file
diff --git a/lib/Config/Widget.php b/lib/Config/Widget.php
index eeb17ddf29..cb24a7980d 100644
--- a/lib/Config/Widget.php
+++ b/lib/Config/Widget.php
@@ -1,6 +1,5 @@
count();
}
function setupDependencies() {
diff --git a/lib/Form/Widget.php b/lib/Form/Widget.php
index f670e03aac..18f97be8ab 100644
--- a/lib/Form/Widget.php
+++ b/lib/Form/Widget.php
@@ -194,96 +194,4 @@ class Widget extends \WP_Widget {
}
}
}
-}
-
-// set the content filter to replace the shortcode
-if(isset($_GET['mailpoet_page']) && strlen(trim($_GET['mailpoet_page'])) > 0) {
- switch($_GET['mailpoet_page']) {
-
- case 'mailpoet_form_iframe':
- $id = (isset($_GET['mailpoet_form']) && (int)$_GET['mailpoet_form'] > 0) ? (int)$_GET['mailpoet_form'] : null;
- $form = Form::findOne($id);
-
- if($form !== false) {
- // render form
- $output = Util\Export::get('html', $form->asArray());
- // $output = do_shortcode($output);
- print $output;
- exit;
- }
- break;
-
- default:
- // add_filter('wp_title', 'mailpoet_meta_page_title'));
- add_filter('the_title', 'mailpoet_page_title', 10, 2);
- add_filter('the_content', 'mailpoet_page_content', 98, 1);
- break;
- }
-}
-
-function mailpoet_page_title($title = '', $id = null) {
- // get signup confirmation page id
- $signup_confirmation = Setting::getValue('signup_confirmation');
- $page_id = $signup_confirmation['page'];
-
- // check if we're on the signup confirmation page
- if((int)$page_id === (int)$id) {
- global $post;
-
- // disable comments
- $post->comment_status = 'close';
- // disable password
- $post->post_password = '';
-
- $subscriber = null;
-
- // get subscriber key from url
- $subscriber_digest = (isset($_GET['mailpoet_key']) && strlen(trim($_GET['mailpoet_key'])) === 32) ? trim($_GET['mailpoet_key']) : null;
-
- if($subscriber_digest !== null) {
- // get subscriber
- // TODO: change select() to selectOne() once it's implemented
- $subscribers = $mailpoet->subscribers()->select(array(
- 'filter' => array(
- 'subscriber_digest' => $subscriber_digest
- ),
- 'limit' => 1
- ));
-
- if(!empty($subscribers)) {
- $subscriber = array_shift($subscribers);
- }
- }
-
- // check if we have a subscriber record
- if($subscriber === null) {
- return __('Your confirmation link expired, please subscribe again.');
- } else {
- // we have a subscriber, let's check its state
- switch($subscriber['subscriber_state']) {
- case MailPoetSubscribers::STATE_UNCONFIRMED:
- case MailPoetSubscribers::STATE_UNSUBSCRIBED:
- // set subscriber state as confirmed
- $mailpoet->subscribers()->update(array(
- 'subscriber' => $subscriber['subscriber'],
- 'subscriber_state' => MailPoetSubscribers::STATE_SUBSCRIBED,
- 'subscriber_confirmed_at' => time()
- ));
- return __("You've subscribed");
- break;
- case MailPoetSubscribers::STATE_SUBSCRIBED:
- return __("You've already subscribed");
- break;
- }
- }
- } else {
- return $title;
- }
-}
-
-function mailpoet_page_content($content = '') {
- if(strpos($content, '[mailpoet_page]') !== FALSE) {
- $content = str_replace('[mailpoet_page]', '', $content);
- }
- return $content;
}
\ No newline at end of file
diff --git a/lib/Models/Setting.php b/lib/Models/Setting.php
index 36cc8cddd5..8b5e6e7e88 100644
--- a/lib/Models/Setting.php
+++ b/lib/Models/Setting.php
@@ -48,14 +48,41 @@ class Setting extends Model {
}
public static function setValue($key, $value) {
- if(is_array($value)) {
- $value = serialize($value);
- }
+ $keys = explode('.', $key);
- return Setting::createOrUpdate(array(
- 'name' => $key,
- 'value' => $value
- ));
+ if(count($keys) === 1) {
+ if(is_array($value)) {
+ $value = serialize($value);
+ }
+
+ return Setting::createOrUpdate(array(
+ 'name' => $key,
+ 'value' => $value
+ ));
+ } else {
+ $main_key = array_shift($keys);
+
+ $setting_value = static::getValue($main_key, array());
+ $current_value = &$setting_value;
+ $last_key = array_pop($keys);
+
+ foreach($keys as $key) {
+ if(!is_array($current_value)) {
+ $current_value = array();
+ }
+
+ if(!array_key_exists($key, $current_value)) {
+ $current_value = array($key => array());
+ }
+ $current_value =& $current_value[$key];
+ }
+ if(is_scalar($current_value)) {
+ $current_value = array();
+ }
+ $current_value[$last_key] = $value;
+
+ return static::setValue($main_key, $setting_value);
+ }
}
public static function getAll() {
diff --git a/lib/Models/SubscriberSegment.php b/lib/Models/SubscriberSegment.php
index 7f2a435239..c538c23602 100644
--- a/lib/Models/SubscriberSegment.php
+++ b/lib/Models/SubscriberSegment.php
@@ -33,6 +33,10 @@ class SubscriberSegment extends Model {
return $orm;
}
+ static function subscribed($orm) {
+ return $orm->where('status', 'subscribed');
+ }
+
static function createMultiple($segmnets, $subscribers) {
$values = Helpers::flattenArray(
array_map(function ($segment) use ($subscribers) {
diff --git a/lib/Settings/Pages.php b/lib/Settings/Pages.php
index e55eec6a01..9497b5a685 100644
--- a/lib/Settings/Pages.php
+++ b/lib/Settings/Pages.php
@@ -2,22 +2,71 @@
namespace MailPoet\Settings;
class Pages {
+ function __construct() {
+ }
- static function getAll() {
- $mailpoet_pages = \get_posts(array(
+ function init() {
+ register_post_type('mailpoet_page', array(
+ 'labels' => array(
+ 'name' => __('MailPoet Page'),
+ 'singular_name' => __('MailPoet Page')
+ ),
+ 'public' => true,
+ 'has_archive' => false,
+ 'show_ui' => true,
+ 'show_in_menu' => false,
+ 'rewrite' => false,
+ 'show_in_nav_menus'=>false,
+ 'can_export'=>false,
+ 'publicly_queryable'=>true,
+ 'exclude_from_search'=>true
+ ));
+ }
+
+ static function createMailPoetPage() {
+ remove_all_actions('pre_post_update');
+ remove_all_actions('save_post');
+ remove_all_actions('wp_insert_post');
+
+ $id = wp_insert_post(array(
+ 'post_status' => 'publish',
+ 'post_type' => 'mailpoet_page',
+ 'post_author' => 1,
+ 'post_content' => '[mailpoet_page]',
+ 'post_title' => __('MailPoet Page'),
+ 'post_name' => 'subscriptions'
+ ));
+ flush_rewrite_rules();
+
+ return ((int)$id > 0) ? (int)$id : false;
+ }
+
+ static function getMailPoetPages() {
+ return get_posts(array(
'post_type' => 'mailpoet_page'
));
+ }
+
+ static function getAll() {
+ $all_pages = array_merge(
+ static::getMailPoetPages(),
+ get_pages()
+ );
$pages = array();
- foreach(array_merge($mailpoet_pages, \get_pages()) as $page) {
- $pages[] = array(
- 'id' => $page->ID,
- 'title' => $page->post_title,
- 'preview_url' => \get_permalink($page->ID),
- 'edit_url' => \get_edit_post_link($page->ID)
- );
+ foreach($all_pages as $page) {
+ $pages[] = static::getPageData($page);
}
return $pages;
}
+
+ static function getPageData($page) {
+ return array(
+ 'id' => $page->ID,
+ 'title' => $page->post_title,
+ 'preview_url' => get_permalink($page->ID),
+ 'edit_url' => get_edit_post_link($page->ID)
+ );
+ }
}
\ No newline at end of file
diff --git a/tests/unit/Models/SettingCest.php b/tests/unit/Models/SettingCest.php
index 39778e7b1f..1ece7a95b2 100644
--- a/tests/unit/Models/SettingCest.php
+++ b/tests/unit/Models/SettingCest.php
@@ -79,6 +79,31 @@ class SettingCest {
expect($record->value)->equals('new data');
}
+ function itCanGetAndSetValue() {
+ expect(Setting::setValue('test', '123'))->true();
+ expect(Setting::getValue('test'))->equals('123');
+ }
+
+ function itCanGetAndSetNestedValue() {
+ expect(Setting::setValue('test.key', '123'))->true();
+ expect(Setting::getValue('test.key'))->equals('123');
+
+ expect(Setting::setValue('test.key.subkey', '123'))->true();
+ expect(Setting::setValue('test.key.subkey2', '456'))->true();
+
+ expect(Setting::getValue('test.key'))->notEmpty();
+ expect(Setting::getValue('test.key.subkey'))->equals('123');
+ expect(Setting::getValue('test.key.subkey2'))->equals('456');
+ }
+
+ function itCanSetValueToNull() {
+ expect(Setting::setValue('test.key', true))->true();
+ expect(Setting::getValue('test.key'))->equals(true);
+
+ expect(Setting::setValue('test.key', null))->true();
+ expect(Setting::getValue('test.key'))->null();
+ }
+
function _after() {
ORM::forTable(Setting::$_table)
->deleteMany();
diff --git a/views/settings/basics.html b/views/settings/basics.html
index e40d98b35f..5b3dfdb5a9 100644
--- a/views/settings/basics.html
+++ b/views/settings/basics.html
@@ -347,7 +347,7 @@
values = $(this).val() || [];
if (values.length > 0) {
- shortcode += ' list_id="';
+ shortcode += ' segments="';
shortcode += values.join(',');
shortcode += '"';
}