Refactor Widget to use Doctrine

[MAILPOET-3644]
This commit is contained in:
Pavel Dohnal
2021-09-15 13:09:06 +02:00
committed by Veljko V
parent 19b99b4ff1
commit ca88c96470
3 changed files with 41 additions and 39 deletions

View File

@@ -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 = [];

View File

@@ -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

View File

@@ -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();
} }