diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 227778b753..8c542b88c7 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -71,6 +71,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true); // Listing $container->autowire(\MailPoet\Listing\BulkActionController::class)->setPublic(true); + $container->autowire(\MailPoet\Listing\BulkActionFactory::class)->setPublic(true); $container->autowire(\MailPoet\Listing\Handler::class)->setPublic(true); // Router $container->autowire(\MailPoet\Router\Endpoints\CronDaemon::class)->setPublic(true); diff --git a/lib/Listing/BulkActionController.php b/lib/Listing/BulkActionController.php index 5391a831d5..6b7166d6d4 100644 --- a/lib/Listing/BulkActionController.php +++ b/lib/Listing/BulkActionController.php @@ -4,10 +4,14 @@ namespace MailPoet\Listing; if (!defined('ABSPATH')) exit; class BulkActionController { + /** @var BulkActionFactory */ + private $factory; + /** @var Handler */ private $handler; - function __construct(Handler $handler) { + function __construct(BulkActionFactory $factory, Handler $handler) { + $this->factory = $factory; $this->handler = $handler; } @@ -15,14 +19,10 @@ class BulkActionController { $bulk_action_method = 'bulk'.ucfirst($data['action']); unset($data['action']); - if (!method_exists($model_class, $bulk_action_method)) { - throw new \Exception( - $model_class. ' has no method "'.$bulk_action_method.'"' - ); - } + $action_class = $this->factory->getActionClass($model_class, $bulk_action_method); return call_user_func_array( - array($model_class, $bulk_action_method), + array($action_class, $bulk_action_method), array($this->handler->getSelection($model_class, $data['listing']), $data) ); } diff --git a/lib/Listing/BulkActionFactory.php b/lib/Listing/BulkActionFactory.php new file mode 100644 index 0000000000..82d94be96d --- /dev/null +++ b/lib/Listing/BulkActionFactory.php @@ -0,0 +1,31 @@ +ensureMethodExists($action_class, $bulk_action_method); + $this->actions[$model_class][$bulk_action_method] = $action_class; + } + + function getActionClass($model_class, $bulk_action_method) { + $resulting_class = $model_class; + if (!empty($this->actions[$model_class][$bulk_action_method])) { + $resulting_class = $this->actions[$model_class][$bulk_action_method]; + } + $this->ensureMethodExists($resulting_class, $bulk_action_method); + return $resulting_class; + } + + private function ensureMethodExists($action_class, $bulk_action_method) { + if (!method_exists($action_class, $bulk_action_method)) { + throw new \Exception( + (is_object($action_class) ? get_class($action_class) : $action_class).' has no method "'.$bulk_action_method.'"' + ); + } + } +} diff --git a/lib/Segments/BulkAction.php b/lib/Segments/BulkAction.php index fe6d01a5d8..9a47f69fb0 100644 --- a/lib/Segments/BulkAction.php +++ b/lib/Segments/BulkAction.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments; +use MailPoet\DI\ContainerWrapper; use MailPoet\Listing\Handler; use MailPoet\Models\Segment; use MailPoet\WP\Functions as WPFunctions; @@ -41,7 +42,10 @@ class BulkAction { if (!$segment || in_array($segment['type'], [Segment::TYPE_DEFAULT, Segment::TYPE_WP_USERS, Segment::TYPE_WC_USERS], true) ) { - $bulk_action = new \MailPoet\Listing\BulkActionController(new Handler()); + $bulk_action = new \MailPoet\Listing\BulkActionController( + ContainerWrapper::getInstance()->get(\MailPoet\Listing\BulkActionFactory::class), + new Handler() + ); return $bulk_action->apply('\MailPoet\Models\Subscriber', $this->data); } else { $handlers = $this->wp->applyFilters('mailpoet_subscribers_in_segment_apply_bulk_action_handlers', array());