Brak opisu

SegmentDependencyValidator.php 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace MailPoet\Segments;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\DynamicSegmentFilterData;
  5. use MailPoet\Entities\DynamicSegmentFilterEntity;
  6. use MailPoet\Entities\SegmentEntity;
  7. use MailPoet\WP\Functions as WPFunctions;
  8. class SegmentDependencyValidator {
  9. private const WOOCOMMERCE_PLUGIN = [
  10. 'id' => 'woocommerce/woocommerce.php',
  11. 'name' => 'WooCommerce',
  12. ];
  13. private const WOOCOMMERCE_SUBSCRIPTIONS_PLUGIN = [
  14. 'id' => 'woocommerce-subscriptions/woocommerce-subscriptions.php',
  15. 'name' => 'WooCommerce Subscriptions',
  16. ];
  17. private const REQUIRED_PLUGINS_BY_TYPE = [
  18. DynamicSegmentFilterData::TYPE_WOOCOMMERCE => [
  19. self::WOOCOMMERCE_PLUGIN,
  20. ],
  21. DynamicSegmentFilterData::TYPE_WOOCOMMERCE_SUBSCRIPTION => [
  22. self::WOOCOMMERCE_SUBSCRIPTIONS_PLUGIN,
  23. self::WOOCOMMERCE_PLUGIN,
  24. ],
  25. ];
  26. /** @var WPFunctions */
  27. private $wp;
  28. public function __construct(
  29. WPFunctions $wp
  30. ) {
  31. $this->wp = $wp;
  32. }
  33. /**
  34. * @return string[]
  35. */
  36. public function getMissingPluginsBySegment(SegmentEntity $segment): array {
  37. $missingPluginNames = [];
  38. foreach ($segment->getDynamicFilters() as $dynamicFilter) {
  39. $missingPlugins = $this->getMissingPluginsByFilter($dynamicFilter);
  40. if (!$missingPlugins) {
  41. continue;
  42. }
  43. foreach ($missingPlugins as $plugin) {
  44. $missingPluginNames[] = $plugin['name'];
  45. }
  46. }
  47. return array_unique($missingPluginNames);
  48. }
  49. public function getMissingPluginsByFilter(DynamicSegmentFilterEntity $dynamicSegmentFilter): array {
  50. $config = $this->getRequiredPluginsConfig($dynamicSegmentFilter->getFilterData()->getFilterType() ?? '');
  51. return $this->getMissingPlugins($config);
  52. }
  53. public function canUseDynamicFilterType(string $type): bool {
  54. $config = $this->getRequiredPluginsConfig($type);
  55. return empty($this->getMissingPlugins($config));
  56. }
  57. private function getRequiredPluginsConfig(string $type): array {
  58. if (isset(self::REQUIRED_PLUGINS_BY_TYPE[$type])) {
  59. return self::REQUIRED_PLUGINS_BY_TYPE[$type];
  60. }
  61. return [];
  62. }
  63. private function getMissingPlugins(array $config): array {
  64. $missingPlugins = [];
  65. foreach ($config as $requiredPlugin) {
  66. if (isset($requiredPlugin['id']) && !$this->wp->isPluginActive($requiredPlugin['id'])) {
  67. $missingPlugins[] = $requiredPlugin;
  68. }
  69. }
  70. return $missingPlugins;
  71. }
  72. }