Require Premium plugin for multi-condition segments
[MAILPOET-3929]
This commit is contained in:
@@ -437,6 +437,10 @@ a.mailpoet-listing-error {
|
||||
}
|
||||
}
|
||||
|
||||
a.mailpoet-listing-link-important {
|
||||
color: $color-secondary !important;
|
||||
}
|
||||
|
||||
@include respond-to(small-screen) {
|
||||
.mailpoet-listing {
|
||||
padding: 0;
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import React from 'react';
|
||||
import { Link, withRouter } from 'react-router-dom';
|
||||
import MailPoet from 'mailpoet';
|
||||
import ReactStringReplace from 'react-string-replace';
|
||||
import Listing from 'listing/listing.jsx';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
@@ -144,7 +145,24 @@ function renderItem(item, actions) {
|
||||
{ item.is_plugin_missing
|
||||
? (
|
||||
<td colSpan="2" className="column mailpoet-hide-on-mobile" data-colname={MailPoet.I18n.t('missingPluginMessageColumn')}>
|
||||
{ item.missing_plugin_message
|
||||
&& item.missing_plugin_message.message && item.missing_plugin_message.link
|
||||
? (
|
||||
<>
|
||||
{ ReactStringReplace(
|
||||
item.missing_plugin_message.message,
|
||||
/\[link](.*?)\[\/link]/g,
|
||||
(match) => (
|
||||
<a className="mailpoet-listing-link-important" key="missingPluginMessageLink" href={item.missing_plugin_message.link} target="_blank" rel="noopener noreferrer">{match}</a>
|
||||
)
|
||||
) }
|
||||
</>
|
||||
)
|
||||
: (
|
||||
<>
|
||||
{ item.missing_plugin_message }
|
||||
</>
|
||||
)}
|
||||
</td>
|
||||
)
|
||||
: (
|
||||
|
@@ -93,7 +93,9 @@ class DynamicSegmentsResponseBuilder {
|
||||
if ($missingPlugins) {
|
||||
$missingPlugin = reset($missingPlugins);
|
||||
$data['is_plugin_missing'] = true;
|
||||
$data['missing_plugin_message'] = sprintf(
|
||||
$data['missing_plugin_message'] = $this->segmentDependencyValidator->getCustomErrorMessage($missingPlugin)
|
||||
?:
|
||||
sprintf(
|
||||
__('Activate the %s plugin to see the number of subscribers and enable the editing of this segment.', 'mailpoet'),
|
||||
$missingPlugin
|
||||
);
|
||||
|
@@ -34,6 +34,7 @@ class FilterHandler {
|
||||
$filters = $segment->getDynamicFilters();
|
||||
$filterSelects = [];
|
||||
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
|
||||
$pluginsForAllFiltersMissing = $this->segmentDependencyValidator->getMissingPluginsByAllFilters($filters);
|
||||
foreach ($filters as $filter) {
|
||||
$subscribersIdsQuery = $this->entityManager
|
||||
->getConnection()
|
||||
@@ -41,7 +42,7 @@ class FilterHandler {
|
||||
->select("DISTINCT $subscribersTable.id as inner_subscriber_id")
|
||||
->from($subscribersTable);
|
||||
// When a required plugin is missing we want to return empty result
|
||||
if ($this->segmentDependencyValidator->getMissingPluginsByFilter($filter)) {
|
||||
if ($pluginsForAllFiltersMissing || $this->segmentDependencyValidator->getMissingPluginsByFilter($filter)) {
|
||||
$subscribersIdsQuery->andWhere('1 = 0');
|
||||
} else {
|
||||
$this->filterFactory->getFilterForFilterEntity($filter)->apply($subscribersIdsQuery, $filter);
|
||||
|
@@ -5,9 +5,16 @@ namespace MailPoet\Segments;
|
||||
use MailPoet\Entities\DynamicSegmentFilterData;
|
||||
use MailPoet\Entities\DynamicSegmentFilterEntity;
|
||||
use MailPoet\Entities\SegmentEntity;
|
||||
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
use MailPoetVendor\Doctrine\Common\Collections\Collection;
|
||||
|
||||
class SegmentDependencyValidator {
|
||||
private const MAILPOET_PREMIUM_PLUGIN = [
|
||||
'id' => 'mailpoet-premium/mailpoet-premium.php',
|
||||
'name' => 'MailPoet Premium',
|
||||
];
|
||||
|
||||
private const WOOCOMMERCE_PLUGIN = [
|
||||
'id' => 'woocommerce/woocommerce.php',
|
||||
'name' => 'WooCommerce',
|
||||
@@ -28,12 +35,17 @@ class SegmentDependencyValidator {
|
||||
],
|
||||
];
|
||||
|
||||
/** @var SubscribersFeature */
|
||||
private $subscribersFeature;
|
||||
|
||||
/** @var WPFunctions */
|
||||
private $wp;
|
||||
|
||||
public function __construct(
|
||||
SubscribersFeature $subscribersFeature,
|
||||
WPFunctions $wp
|
||||
) {
|
||||
$this->subscribersFeature = $subscribersFeature;
|
||||
$this->wp = $wp;
|
||||
}
|
||||
|
||||
@@ -41,8 +53,9 @@ class SegmentDependencyValidator {
|
||||
* @return string[]
|
||||
*/
|
||||
public function getMissingPluginsBySegment(SegmentEntity $segment): array {
|
||||
$missingPluginNames = [];
|
||||
foreach ($segment->getDynamicFilters() as $dynamicFilter) {
|
||||
$dynamicFilters = $segment->getDynamicFilters();
|
||||
$missingPluginNames = $this->getMissingPluginsByAllFilters($dynamicFilters);
|
||||
foreach ($dynamicFilters as $dynamicFilter) {
|
||||
$missingPlugins = $this->getMissingPluginsByFilter($dynamicFilter);
|
||||
if (!$missingPlugins) {
|
||||
continue;
|
||||
@@ -54,6 +67,21 @@ class SegmentDependencyValidator {
|
||||
return array_unique($missingPluginNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Collection<int, DynamicSegmentFilterEntity> $dynamicFilters
|
||||
*/
|
||||
public function getMissingPluginsByAllFilters(Collection $dynamicFilters): array {
|
||||
$missingPluginNames = [];
|
||||
if (count($dynamicFilters) > 1
|
||||
&& (!$this->wp->isPluginActive(self::MAILPOET_PREMIUM_PLUGIN['id'])
|
||||
|| !$this->subscribersFeature->hasValidPremiumKey()
|
||||
|| $this->subscribersFeature->check())
|
||||
) {
|
||||
$missingPluginNames[] = self::MAILPOET_PREMIUM_PLUGIN['name'];
|
||||
}
|
||||
return $missingPluginNames;
|
||||
}
|
||||
|
||||
public function getMissingPluginsByFilter(DynamicSegmentFilterEntity $dynamicSegmentFilter): array {
|
||||
$config = $this->getRequiredPluginsConfig($dynamicSegmentFilter->getFilterData()->getFilterType() ?? '');
|
||||
return $this->getMissingPlugins($config);
|
||||
@@ -80,4 +108,17 @@ class SegmentDependencyValidator {
|
||||
}
|
||||
return $missingPlugins;
|
||||
}
|
||||
|
||||
public function getCustomErrorMessage($missingPlugin) {
|
||||
if ($missingPlugin === self::MAILPOET_PREMIUM_PLUGIN['name']
|
||||
&& $this->wp->isPluginActive(self::MAILPOET_PREMIUM_PLUGIN['id'])
|
||||
&& (!$this->subscribersFeature->hasValidPremiumKey() || $this->subscribersFeature->check())
|
||||
) {
|
||||
return [
|
||||
'message' => $this->wp->__('Your current MailPoet plan does not support advanced segments. Please [link]upgrade to a MailPoet Premium plan[/link] to reactivate this segment.', 'mailpoet'),
|
||||
'link' => 'https://account.mailpoet.com',
|
||||
];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@@ -79,7 +79,7 @@ class Subscribers {
|
||||
return $this->hasValidMssKey() && $this->settings->get(self::MSS_SUPPORT_SETTING_KEY) === 'premium';
|
||||
}
|
||||
|
||||
private function hasValidPremiumKey() {
|
||||
public function hasValidPremiumKey() {
|
||||
$state = $this->settings->get(self::PREMIUM_KEY_STATE);
|
||||
return $state === Bridge::KEY_VALID || $state === Bridge::KEY_EXPIRING;
|
||||
}
|
||||
|
Reference in New Issue
Block a user