Add dynamic segments page from Premium plugin
[MAILPOET-2382]
This commit is contained in:
committed by
Jack Kitterhing
parent
771f4b9d63
commit
80f335fee3
75
lib/AdminPages/Pages/DynamicSegments.php
Normal file
75
lib/AdminPages/Pages/DynamicSegments.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace MailPoet\Config;
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
|
use MailPoet\AdminPages\Pages\DynamicSegments;
|
||||||
use MailPoet\AdminPages\Pages\ExperimentalFeatures;
|
use MailPoet\AdminPages\Pages\ExperimentalFeatures;
|
||||||
use MailPoet\AdminPages\Pages\FormEditor;
|
use MailPoet\AdminPages\Pages\FormEditor;
|
||||||
use MailPoet\AdminPages\Pages\Forms;
|
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
|
// Settings page
|
||||||
$this->wp->addSubmenuPage(
|
$this->wp->addSubmenuPage(
|
||||||
@@ -432,6 +452,10 @@ class Menu {
|
|||||||
$this->container->get(Segments::class)->render();
|
$this->container->get(Segments::class)->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function dynamicSegments() {
|
||||||
|
$this->container->get(DynamicSegments::class)->render();
|
||||||
|
}
|
||||||
|
|
||||||
function forms() {
|
function forms() {
|
||||||
if ($this->subscribers_over_limit) return $this->displaySubscriberLimitExceeded();
|
if ($this->subscribers_over_limit) return $this->displaySubscriberLimitExceeded();
|
||||||
$this->container->get(Forms::class)->render();
|
$this->container->get(Forms::class)->render();
|
||||||
|
@@ -35,6 +35,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
]);
|
]);
|
||||||
// AdminPages
|
// AdminPages
|
||||||
$container->autowire(\MailPoet\AdminPages\PageRenderer::class)->setPublic(true);
|
$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\ExperimentalFeatures::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\AdminPages\Pages\FormEditor::class)->setPublic(true);
|
$container->autowire(\MailPoet\AdminPages\Pages\FormEditor::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\AdminPages\Pages\Forms::class)->setPublic(true);
|
$container->autowire(\MailPoet\AdminPages\Pages\Forms::class)->setPublic(true);
|
||||||
|
88
views/dynamicSegments.html
Normal file
88
views/dynamicSegments.html
Normal 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 %>
|
Reference in New Issue
Block a user