Refactor subscription form processing

[MAILPOET-1689]
This commit is contained in:
Rostislav Wolny
2018-12-12 11:00:08 +01:00
parent 5190c23274
commit ece5e9a9d1
7 changed files with 48 additions and 15 deletions

View File

@ -3,9 +3,17 @@
namespace MailPoet\Config;
use MailPoet\Models\Setting;
use MailPoet\WP\Posts as WPPosts;
use MailPoetVendor\Psr\Container\ContainerInterface;
class Hooks {
/** @var ContainerInterface */
private $container;
function __construct(ContainerInterface $container) {
$this->container = $container;
}
function init() {
$this->setupWPUsers();
$this->setupImageSize();
@ -93,11 +101,11 @@ class Hooks {
// Subscription form
add_action(
'admin_post_mailpoet_subscription_form',
'\MailPoet\Subscription\Form::onSubmit'
[$this, 'subscriptionFormOnSubmit']
);
add_action(
'admin_post_nopriv_mailpoet_subscription_form',
'\MailPoet\Subscription\Form::onSubmit'
[$this, 'subscriptionFormOnSubmit']
);
}
@ -173,4 +181,9 @@ class Hooks {
10, 3
);
}
// Callbacks
function subscriptionFormOnSubmit($data = false) {
$this->container->get(\MailPoet\Subscription\Form::class)->onSubmit($data);
}
}

View File

@ -282,8 +282,7 @@ class Initializer {
}
function setupHooks() {
$hooks = new Hooks();
$hooks->init();
$this->container->get(\MailPoet\Config\Hooks::class)->init();
}
function setupPrivacyPolicy() {

View File

@ -50,6 +50,10 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true);
// Config
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
$container->autowire(\MailPoet\Config\Hooks::class)
->addArgument(new Reference(ContainerWrapper::class))
->setPublic(true);
// Cron
$container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true);
$container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true);
@ -62,6 +66,8 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true);
$container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::class)->setPublic(true);
$container->autowire(\MailPoet\Subscribers\RequiredCustomFieldValidator::class)->setPublic(true);
// Subscription
$container->autowire(\MailPoet\Subscription\Form::class)->setPublic(true);
// Newsletter
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
return $container;

View File

@ -2,17 +2,24 @@
namespace MailPoet\Subscription;
use MailPoet\API\API as API;
use MailPoet\API\JSON\API;
use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\Util\Url as UrlHelper;
class Form {
static function onSubmit($request_data = false) {
/** @var API */
private $api;
function __construct(API $api) {
$this->api = $api;
}
function onSubmit($request_data = false) {
$request_data = ($request_data) ? $request_data : $_REQUEST;
$api = API::JSON();
$api->setRequestData($request_data);
$this->api->setRequestData($request_data);
$form_id = (!empty($request_data['data']['form_id'])) ? (int)$request_data['data']['form_id'] : false;
$response = $api->processRoute();
$response = $this->api->processRoute();
if($response->status !== APIResponse::STATUS_OK) {
return UrlHelper::redirectBack(
array(

View File

@ -2,11 +2,12 @@
namespace MailPoet\Test\Config;
use MailPoet\Config\Hooks;
use MailPoet\DI\ContainerWrapper;
use MailPoet\WP\Posts as WPPosts;
class HooksTest extends \MailPoetTest {
function testItHooksSchedulerToMultiplePostTypes() {
$hooks = new Hooks();
$hooks = new Hooks(ContainerWrapper::getInstance());
$hooks->setupPostNotifications();
expect(has_filter('transition_post_status', '\MailPoet\Newsletter\Scheduler\Scheduler::transitionHook'))->notEmpty();
}

View File

@ -4,6 +4,7 @@ namespace MailPoet\Test\Newsletter\Scheduler;
use Carbon\Carbon;
use Codeception\Util\Fixtures;
use Mailpoet\Config\Hooks;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField;
@ -696,7 +697,7 @@ class SchedulerTest extends \MailPoetTest {
}
function testUnsearchablePostTypeDoesNotSchedulePostNotification() {
$hook = new Hooks;
$hook = new Hooks(ContainerWrapper::getInstance());
$newsletter = $this->_createNewsletter(Newsletter::TYPE_NOTIFICATION);

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\Subscription;
use AspectMock\Test as Mock;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Form\Util\FieldNameObfuscator;
use MailPoet\Models\Form as FormModel;
use MailPoet\Models\Segment as SegmentModel;
@ -12,6 +13,10 @@ use MailPoet\Subscription\Form;
use MailPoet\Util\Security;
class FormTest extends \MailPoetTest {
/** @var Form */
private $form_controller;
function _before() {
Setting::setValue('sender', array(
'name' => 'John Doe',
@ -58,6 +63,7 @@ class FormTest extends \MailPoetTest {
)
);
SettingModel::setValue('signup_confirmation.enabled', false);
$this->form_controller = ContainerWrapper::getInstance()->get(Form::class);
}
function testItSubscribesAndRedirectsBackWithSuccessResponse() {
@ -66,7 +72,7 @@ class FormTest extends \MailPoetTest {
return $params;
}
]);
$result = Form::onSubmit($this->request_data);
$result = $this->form_controller->onSubmit($this->request_data);
expect(SubscriberModel::findOne($this->testEmail))->notEmpty();
$mock->verifyInvoked('redirectBack');
expect($result['mailpoet_success'])->equals($this->form->id);
@ -89,7 +95,7 @@ class FormTest extends \MailPoetTest {
return $params;
}
]);
$result = Form::onSubmit($this->request_data);
$result = $this->form_controller->onSubmit($this->request_data);
expect(SubscriberModel::findOne($this->testEmail))->notEmpty();
$mock->verifyInvoked('redirectTo');
expect($result)->regExp('/http.*?sample-post/i');
@ -104,7 +110,7 @@ class FormTest extends \MailPoetTest {
return $params;
}
]);
$result = Form::onSubmit($request_data);
$result = $this->form_controller->onSubmit($request_data);
expect(SubscriberModel::findMany())->isEmpty();
$mock->verifyInvoked('redirectBack');
expect($result['mailpoet_error'])->equals($this->form->id);