Add dynamic segments page from Premium plugin

[MAILPOET-2382]
This commit is contained in:
Jan Jakeš
2019-10-03 10:41:27 +02:00
committed by Jack Kitterhing
parent 771f4b9d63
commit 80f335fee3
4 changed files with 189 additions and 1 deletions

View File

@@ -0,0 +1,75 @@
<?php
namespace MailPoet\AdminPages\Pages;
use MailPoet\AdminPages\PageRenderer;
use MailPoet\Listing\PageLimit;
use MailPoet\Models\Newsletter;
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
use MailPoet\WP\Functions as WPFunctions;
class DynamicSegments {
/** @var PageRenderer */
private $page_renderer;
/** @var PageLimit */
private $listing_page_limit;
/** @var WPFunctions */
private $wp;
/** @var WooCommerceHelper */
private $woocommerce_helper;
function __construct(
PageRenderer $page_renderer,
PageLimit $listing_page_limit,
WPFunctions $wp,
WooCommerceHelper $woocommerce_helper
) {
$this->page_renderer = $page_renderer;
$this->listing_page_limit = $listing_page_limit;
$this->wp = $wp;
$this->woocommerce_helper = $woocommerce_helper;
}
function render() {
$data = [];
$data['items_per_page'] = $this->listing_page_limit->getLimitPerPage('dynamic_segments');
$wp_roles = $this->wp->getEditableRoles();
$data['wordpress_editable_roles_list'] = array_map(function($role_id, $role) {
return [
'role_id' => $role_id,
'role_name' => $role['name'],
];
}, array_keys($wp_roles), $wp_roles);
$data['newsletters_list'] = Newsletter::select(['id', 'subject', 'sent_at'])
->whereNull('deleted_at')
->where('type', Newsletter::TYPE_STANDARD)
->orderByExpr('ISNULL(sent_at) DESC, sent_at DESC')->findArray();
$data['product_categories'] = $this->wp->getCategories(['taxonomy' => 'product_cat']);
usort($data['product_categories'], function ($a, $b) {
return strcmp($a->cat_name, $b->cat_name);
});
$data['products'] = $this->getProducts();
$data['is_woocommerce_active'] = $this->woocommerce_helper->isWooCommerceActive();
$this->page_renderer->displayPage('dynamicSegments.html', $data);
}
private function getProducts() {
$args = ['post_type' => 'product', 'orderby' => 'title', 'order' => 'ASC', 'numberposts' => -1];
$products = $this->wp->getPosts($args);
return array_map(function ($product) {
return [
'title' => $product->post_title,
'ID' => $product->ID,
];
}, $products);
}
}

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Config;
use MailPoet\AdminPages\Pages\DynamicSegments;
use MailPoet\AdminPages\Pages\ExperimentalFeatures;
use MailPoet\AdminPages\Pages\FormEditor;
use MailPoet\AdminPages\Pages\Forms;
@@ -265,7 +266,26 @@ class Menu {
]);
});
$this->wp->doAction('mailpoet_menu_after_lists');
// Dynamic segments page
$dynamic_segments_page = $this->wp->addSubmenuPage(
self::MAIN_PAGE_SLUG,
$this->setPageTitle(__('Segments', 'mailpoet')),
$this->wp->__('Segments', 'mailpoet'),
AccessControl::PERMISSION_MANAGE_SEGMENTS,
'mailpoet-dynamic-segments',
[
$this,
'dynamicSegments',
]
);
// add limit per page to screen options
$this->wp->addAction('load-' . $dynamic_segments_page, function() {
$this->wp->addScreenOption('per_page', [
'label' => WPFunctions::get()->_x('Number of segments per page', 'segments per page (screen options)', 'mailpoet'),
'option' => 'mailpoet_dynamic_segments_per_page',
]);
});
// Settings page
$this->wp->addSubmenuPage(
@@ -432,6 +452,10 @@ class Menu {
$this->container->get(Segments::class)->render();
}
function dynamicSegments() {
$this->container->get(DynamicSegments::class)->render();
}
function forms() {
if ($this->subscribers_over_limit) return $this->displaySubscriberLimitExceeded();
$this->container->get(Forms::class)->render();

View File

@@ -35,6 +35,7 @@ class ContainerConfigurator implements IContainerConfigurator {
]);
// AdminPages
$container->autowire(\MailPoet\AdminPages\PageRenderer::class)->setPublic(true);
$container->autowire(\MailPoet\AdminPages\Pages\DynamicSegments::class)->setPublic(true);
$container->autowire(\MailPoet\AdminPages\Pages\ExperimentalFeatures::class)->setPublic(true);
$container->autowire(\MailPoet\AdminPages\Pages\FormEditor::class)->setPublic(true);
$container->autowire(\MailPoet\AdminPages\Pages\Forms::class)->setPublic(true);

View File

@@ -0,0 +1,88 @@
<% extends 'layout.html' %>
<% block content %>
<div id="dynamic_segments_container"></div>
<script type="text/javascript">
var mailpoet_listing_per_page = <%= items_per_page %>;
var wordpress_editable_roles_list = <%= json_encode(wordpress_editable_roles_list) %>;
var mailpoet_newsletters_list = <%= json_encode(newsletters_list) %>;
var mailpoet_product_categories = <%= json_encode(product_categories) %>;
mailpoet_product_categories = mailpoet_product_categories.map(function(category) {
category.id = category.cat_ID;
return category;
});
var mailpoet_products = <%= json_encode(products) %>;
mailpoet_products = mailpoet_products.map(function(product) {
product.id = product.ID;
return product;
});
var is_woocommerce_active = <%= json_encode(is_woocommerce_active) %>;
var mailpoet_beacon_articles = ['5a574bd92c7d3a194368233e'];
</script>
<% endblock %>
<% block translations %>
<%= localize({
'pageTitle': __('Segments'),
'formPageTitle': __('Segment'),
'formSegmentTitle': __('Segment'),
'new': __('Add New'),
'backToList': __('Back'),
'name': __('Name'),
'description': __('Description'),
'descriptionTip': __('This text box is for your own use and is never shown to your subscribers.'),
'segmentUpdated': __('Segment successfully updated!'),
'segmentAdded': __('Segment successfully added!'),
'save': __('Save'),
'segmentType': __('Type'),
'wpUserRole': __('WordPress user roles'),
'email': __('Email'),
'nameColumn': __('Name'),
'subscribersCountColumn': __('Number of subscribers'),
'updatedAtColumn': __('Modified on'),
'loadingDynamicSegmentItems': __('Loading data…'),
'noDynamicSegmentItemsFound': __('No segments found'),
'numberOfItemsSingular': __('1 item'),
'numberOfItemsMultiple': __('%$1d items'),
'previousPage': __('Previous page'),
'firstPage': __('First page'),
'nextPage': __('Next page'),
'lastPage': __('Last page'),
'currentPage': __('Current page'),
'pageOutOf': _x('of', 'Page X of Y'),
'edit': __('Edit'),
'viewSubscribers': __('View Subscribers'),
'notSentYet': __('Not sent yet'),
'selectLinkPlaceholder': __('Select link'),
'selectNewsletterPlaceholder': __('Select email'),
'selectActionPlaceholder': __('Select action'),
'selectUserRolePlaceholder': __('Select user role'),
'emailActionOpened': _x('opened', 'Dynamic segment creation: when newsletter was opened'),
'emailActionNotOpened': _x('not opened', 'Dynamic segment creation: when newsletter was not opened'),
'emailActionClicked': _x('clicked', 'Dynamic segment creation: when a newsletter link was clicked'),
'emailActionNotClicked': _x('not clicked', 'Dynamic segment creation: when a newsletter link was not clicked'),
'searchLabel': __('Search'),
'segmentsTip': _x('Tip', 'A note about dynamic segments usage'),
'segmentsTipText': __('segments allow you to group your subscribers by other criteria, such as events and actions.'),
'segmentsTipLink': __('Read more.'),
'oneSegmentTrashed': __('1 segment was moved to the trash.'),
'multipleSegmentsTrashed': __('%$1d segments were moved to the trash.'),
'oneSegmentRestored': __('1 segment has been restored from the Trash.'),
'multipleSegmentsRestored': __('%$1d segments have been restored from the Trash.'),
'trash': __('Trash'),
'moveToTrash': __('Move to trash'),
'emptyTrash': __('Empty Trash'),
'restore': __('Restore'),
'deletePermanently': __('Delete permanently'),
'oneSegmentDeleted': __('1 segment was permanently deleted.'),
'multipleSegmentsDeleted': __('%$1d segments were permanently deleted.'),
'permanentlyDeleted': __('%d segments were permanently deleted.'),
'wooPurchasedCategory': __('Customers who have purchased in this category…'),
'wooPurchasedProduct': __('Customers who have purchased this product…'),
'selectWooPurchasedCategory': __('Search category'),
'selectWooPurchasedProduct': __('Search products'),
'woocommerce': _x('WooCommerce', 'Dynamic segment creation: User selects this to use any woocommerce filters'),
}) %>
<% endblock %>