Refactor Widget to use Doctrine
[MAILPOET-3644]
This commit is contained in:
@@ -26,8 +26,8 @@ class Styles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function renderFormSettingsStyles(FormEntity $form, string $selector, string $displayType): string {
|
public function renderFormSettingsStyles(FormEntity $form, string $selector, string $displayType): string {
|
||||||
if (!isset($form['settings']) || !is_array($form['settings'])) return '';
|
if (!is_array($form->getSettings())) return '';
|
||||||
$formSettings = $form['settings'];
|
$formSettings = $form->getSettings();
|
||||||
// Wrapper styles
|
// Wrapper styles
|
||||||
$styles = [];
|
$styles = [];
|
||||||
|
|
||||||
|
@@ -7,7 +7,6 @@ use MailPoet\Config\Renderer as ConfigRenderer;
|
|||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
use MailPoet\Entities\FormEntity;
|
use MailPoet\Entities\FormEntity;
|
||||||
use MailPoet\Form\Renderer as FormRenderer;
|
use MailPoet\Form\Renderer as FormRenderer;
|
||||||
use MailPoet\Models\Form;
|
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Util\Security;
|
use MailPoet\Util\Security;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
@@ -22,6 +21,9 @@ class Widget extends \WP_Widget {
|
|||||||
/** @var FormRenderer */
|
/** @var FormRenderer */
|
||||||
private $formRenderer;
|
private $formRenderer;
|
||||||
|
|
||||||
|
/** @var FormsRepository */
|
||||||
|
private $formsRepository;
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
parent::__construct(
|
parent::__construct(
|
||||||
'mailpoet_form',
|
'mailpoet_form',
|
||||||
@@ -32,6 +34,7 @@ class Widget extends \WP_Widget {
|
|||||||
$this->renderer = new \MailPoet\Config\Renderer(!WP_DEBUG, !WP_DEBUG);
|
$this->renderer = new \MailPoet\Config\Renderer(!WP_DEBUG, !WP_DEBUG);
|
||||||
$this->assetsController = new AssetsController($this->wp, $this->renderer, SettingsController::getInstance());
|
$this->assetsController = new AssetsController($this->wp, $this->renderer, SettingsController::getInstance());
|
||||||
$this->formRenderer = ContainerWrapper::getInstance()->get(FormRenderer::class);
|
$this->formRenderer = ContainerWrapper::getInstance()->get(FormRenderer::class);
|
||||||
|
$this->formsRepository = ContainerWrapper::getInstance()->get(FormsRepository::class);
|
||||||
if (!is_admin()) {
|
if (!is_admin()) {
|
||||||
$this->setupIframe();
|
$this->setupIframe();
|
||||||
} else {
|
} else {
|
||||||
@@ -44,7 +47,7 @@ class Widget extends \WP_Widget {
|
|||||||
|
|
||||||
public function setupIframe() {
|
public function setupIframe() {
|
||||||
$formId = (isset($_GET['mailpoet_form_iframe']) ? (int)$_GET['mailpoet_form_iframe'] : 0);
|
$formId = (isset($_GET['mailpoet_form_iframe']) ? (int)$_GET['mailpoet_form_iframe'] : 0);
|
||||||
if (!$formId || !Form::findOne($formId)) return;
|
if (!$formId || !$this->formsRepository->findOneById($formId)) return;
|
||||||
|
|
||||||
$formHtml = $this->widget(
|
$formHtml = $this->widget(
|
||||||
[
|
[
|
||||||
@@ -120,7 +123,7 @@ class Widget extends \WP_Widget {
|
|||||||
$selectedForm = isset($instance['form']) ? (int)($instance['form']) : 0;
|
$selectedForm = isset($instance['form']) ? (int)($instance['form']) : 0;
|
||||||
|
|
||||||
// get forms list
|
// get forms list
|
||||||
$forms = Form::getPublished()->orderByAsc('name')->findArray();
|
$forms = $this->formsRepository->findBy(['deletedAt' => null], ['name' => 'asc']);
|
||||||
?><p>
|
?><p>
|
||||||
<label for="<?php $this->get_field_id( 'title' ) ?>"><?php WPFunctions::get()->_e('Title:', 'mailpoet'); ?></label>
|
<label for="<?php $this->get_field_id( 'title' ) ?>"><?php WPFunctions::get()->_e('Title:', 'mailpoet'); ?></label>
|
||||||
<input
|
<input
|
||||||
@@ -135,10 +138,10 @@ class Widget extends \WP_Widget {
|
|||||||
<select class="widefat" id="<?php echo $this->get_field_id('form') ?>" name="<?php echo $this->get_field_name('form'); ?>">
|
<select class="widefat" id="<?php echo $this->get_field_id('form') ?>" name="<?php echo $this->get_field_name('form'); ?>">
|
||||||
<?php
|
<?php
|
||||||
foreach ($forms as $form) {
|
foreach ($forms as $form) {
|
||||||
$isSelected = ($selectedForm === (int)$form['id']) ? 'selected="selected"' : '';
|
$isSelected = ($selectedForm === $form->getId()) ? 'selected="selected"' : '';
|
||||||
$formName = $form['name'] ? $this->wp->escHtml($form['name']) : "({$this->wp->_x('no name', 'fallback for forms without a name in a form list')})"
|
$formName = $form->getName() ? $this->wp->escHtml($form->getName()) : "({$this->wp->_x('no name', 'fallback for forms without a name in a form list')})"
|
||||||
?>
|
?>
|
||||||
<option value="<?php echo (int)$form['id']; ?>" <?php echo $isSelected; ?>><?php echo $formName; ?></option>
|
<option value="<?php echo $form->getId(); ?>" <?php echo $isSelected; ?>><?php echo $formName; ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</p>
|
</p>
|
||||||
@@ -194,11 +197,11 @@ class Widget extends \WP_Widget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// get form
|
// get form
|
||||||
$form = Form::getPublished()->findOne($instance['form']);
|
$form = $this->formsRepository->findOneById($instance['form']);
|
||||||
if (!$form) return '';
|
if (!$form) return '';
|
||||||
if ($form->status !== FormEntity::STATUS_ENABLED) return '';
|
if ($form->getDeletedAt()) return '';
|
||||||
|
if ($form->getStatus() !== FormEntity::STATUS_ENABLED) return '';
|
||||||
|
|
||||||
$form = $form->asArray();
|
|
||||||
$formType = 'widget';
|
$formType = 'widget';
|
||||||
if (isset($instance['form_type']) && in_array(
|
if (isset($instance['form_type']) && in_array(
|
||||||
$instance['form_type'],
|
$instance['form_type'],
|
||||||
@@ -212,16 +215,17 @@ class Widget extends \WP_Widget {
|
|||||||
$formType = $instance['form_type'];
|
$formType = $instance['form_type'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$body = (isset($form['body']) ? $form['body'] : []);
|
$body = (!empty($form->getBody()) ? $form->getBody() : []);
|
||||||
$output = '';
|
$output = '';
|
||||||
|
$settings = $form->getSettings();
|
||||||
|
|
||||||
if (!empty($body) && isset($form['settings']) && is_array($form['settings'])) {
|
if (!empty($body) && is_array($settings)) {
|
||||||
$formId = $this->id_base . '_' . $form['id']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
$formId = $this->id_base . '_' . $form->getId(); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
|
||||||
$data = [
|
$data = [
|
||||||
'form_html_id' => $formId,
|
'form_html_id' => $formId,
|
||||||
'form_id' => $form['id'],
|
'form_id' => $form->getId(),
|
||||||
'form_type' => $formType,
|
'form_type' => $formType,
|
||||||
'form_success_message' => $form['settings']['success_message'],
|
'form_success_message' => $settings['success_message'],
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
'styles' => $this->formRenderer->renderStyles($form, '#' . $formId, FormEntity::DISPLAY_TYPE_OTHERS),
|
'styles' => $this->formRenderer->renderStyles($form, '#' . $formId, FormEntity::DISPLAY_TYPE_OTHERS),
|
||||||
'html' => $this->formRenderer->renderHTML($form),
|
'html' => $this->formRenderer->renderHTML($form),
|
||||||
@@ -235,12 +239,12 @@ class Widget extends \WP_Widget {
|
|||||||
$data['success'] = (
|
$data['success'] = (
|
||||||
(isset($_GET['mailpoet_success']))
|
(isset($_GET['mailpoet_success']))
|
||||||
&&
|
&&
|
||||||
((int)$_GET['mailpoet_success'] === (int)$form['id'])
|
((int)$_GET['mailpoet_success'] === $form->getId())
|
||||||
);
|
);
|
||||||
$data['error'] = (
|
$data['error'] = (
|
||||||
(isset($_GET['mailpoet_error']))
|
(isset($_GET['mailpoet_error']))
|
||||||
&&
|
&&
|
||||||
((int)$_GET['mailpoet_error'] === (int)$form['id'])
|
((int)$_GET['mailpoet_error'] === $form->getId())
|
||||||
);
|
);
|
||||||
|
|
||||||
// generate security token
|
// generate security token
|
||||||
|
@@ -7,8 +7,8 @@ use MailPoet\API\JSON\API;
|
|||||||
use MailPoet\API\JSON\ErrorResponse;
|
use MailPoet\API\JSON\ErrorResponse;
|
||||||
use MailPoet\API\JSON\Response;
|
use MailPoet\API\JSON\Response;
|
||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
|
use MailPoet\Entities\FormEntity;
|
||||||
use MailPoet\Form\Util\FieldNameObfuscator;
|
use MailPoet\Form\Util\FieldNameObfuscator;
|
||||||
use MailPoet\Models\Form as FormModel;
|
|
||||||
use MailPoet\Models\Segment as SegmentModel;
|
use MailPoet\Models\Segment as SegmentModel;
|
||||||
use MailPoet\Models\Subscriber as SubscriberModel;
|
use MailPoet\Models\Subscriber as SubscriberModel;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
@@ -42,26 +42,24 @@ class FormTest extends \MailPoetTest {
|
|||||||
'name' => 'Test segment',
|
'name' => 'Test segment',
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
$this->form = FormModel::createOrUpdate(
|
$this->form = new FormEntity('Test form');
|
||||||
|
$this->form->setBody([
|
||||||
[
|
[
|
||||||
'name' => 'Test form',
|
'type' => 'text',
|
||||||
'body' => [
|
'id' => 'email',
|
||||||
[
|
],
|
||||||
'type' => 'text',
|
]);
|
||||||
'id' => 'email',
|
$this->form->setSettings([
|
||||||
],
|
'segments' => [$this->segment->id],
|
||||||
],
|
]);
|
||||||
'settings' => [
|
$this->entityManager->persist($this->form);
|
||||||
'segments' => [$this->segment->id],
|
$this->entityManager->flush();
|
||||||
],
|
|
||||||
]
|
|
||||||
);
|
|
||||||
$obfuscator = new FieldNameObfuscator(WPFunctions::get());
|
$obfuscator = new FieldNameObfuscator(WPFunctions::get());
|
||||||
$obfuscatedEmail = $obfuscator->obfuscate('email');
|
$obfuscatedEmail = $obfuscator->obfuscate('email');
|
||||||
$this->requestData = [
|
$this->requestData = [
|
||||||
'action' => 'mailpoet_subscription_form',
|
'action' => 'mailpoet_subscription_form',
|
||||||
'data' => [
|
'data' => [
|
||||||
'form_id' => $this->form->id,
|
'form_id' => $this->form->getId(),
|
||||||
$obfuscatedEmail => $this->testEmail,
|
$obfuscatedEmail => $this->testEmail,
|
||||||
],
|
],
|
||||||
'token' => Security::generateToken(),
|
'token' => Security::generateToken(),
|
||||||
@@ -88,18 +86,18 @@ class FormTest extends \MailPoetTest {
|
|||||||
$formController = new Form(ContainerWrapper::getInstance()->get(API::class), $urlHelper);
|
$formController = new Form(ContainerWrapper::getInstance()->get(API::class), $urlHelper);
|
||||||
$result = $formController->onSubmit($this->requestData);
|
$result = $formController->onSubmit($this->requestData);
|
||||||
expect(SubscriberModel::findOne($this->testEmail))->notEmpty();
|
expect(SubscriberModel::findOne($this->testEmail))->notEmpty();
|
||||||
expect($result['mailpoet_success'])->equals($this->form->id);
|
expect($result['mailpoet_success'])->equals($this->form->getId());
|
||||||
expect($result['mailpoet_error'])->null();
|
expect($result['mailpoet_error'])->null();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItSubscribesAndRedirectsToCustomUrlWithSuccessResponse() {
|
public function testItSubscribesAndRedirectsToCustomUrlWithSuccessResponse() {
|
||||||
// update form with a redirect setting
|
// update form with a redirect setting
|
||||||
$form = $this->form;
|
$form = $this->form;
|
||||||
$formSettings = unserialize($form->settings);
|
$formSettings = $form->getSettings();
|
||||||
$formSettings['on_success'] = 'page';
|
$formSettings['on_success'] = 'page';
|
||||||
$formSettings['success_page'] = $this->post;
|
$formSettings['success_page'] = $this->post;
|
||||||
$form->settings = serialize($formSettings);
|
$form->setSettings($formSettings);
|
||||||
$form->save();
|
$this->entityManager->flush();
|
||||||
$urlHelper = Stub::make(UrlHelper::class, [
|
$urlHelper = Stub::make(UrlHelper::class, [
|
||||||
'redirectTo' => function($params) {
|
'redirectTo' => function($params) {
|
||||||
return $params;
|
return $params;
|
||||||
@@ -126,7 +124,7 @@ class FormTest extends \MailPoetTest {
|
|||||||
$formController = new Form(ContainerWrapper::getInstance()->get(API::class), $urlHelper);
|
$formController = new Form(ContainerWrapper::getInstance()->get(API::class), $urlHelper);
|
||||||
$result = $formController->onSubmit($requestData);
|
$result = $formController->onSubmit($requestData);
|
||||||
expect(SubscriberModel::findMany())->isEmpty();
|
expect(SubscriberModel::findMany())->isEmpty();
|
||||||
expect($result['mailpoet_error'])->equals($this->form->id);
|
expect($result['mailpoet_error'])->equals($this->form->getId());
|
||||||
expect($result['mailpoet_success'])->null();
|
expect($result['mailpoet_success'])->null();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,7 +148,7 @@ class FormTest extends \MailPoetTest {
|
|||||||
public function _after() {
|
public function _after() {
|
||||||
wp_delete_post($this->post);
|
wp_delete_post($this->post);
|
||||||
ORM::raw_execute('TRUNCATE ' . SegmentModel::$_table);
|
ORM::raw_execute('TRUNCATE ' . SegmentModel::$_table);
|
||||||
ORM::raw_execute('TRUNCATE ' . FormModel::$_table);
|
$this->truncateEntity(FormEntity::class);
|
||||||
ORM::raw_execute('TRUNCATE ' . SubscriberModel::$_table);
|
ORM::raw_execute('TRUNCATE ' . SubscriberModel::$_table);
|
||||||
$this->diContainer->get(SettingsRepository::class)->truncate();
|
$this->diContainer->get(SettingsRepository::class)->truncate();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user