Create a new form from template

[MAILPOET-2987]
This commit is contained in:
Pavel Dohnal
2020-06-22 15:25:33 +02:00
committed by Veljko V
parent a2ff7a34db
commit 07637c69cf
2 changed files with 141 additions and 127 deletions

View File

@ -20,103 +20,10 @@ use MailPoet\Settings\Pages;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class FormEditor { class FormEditor {
/** @var PageRenderer */ const TEMPLATES = [
private $pageRenderer; 'my-fancy-template1' => [
/** @var CustomFieldsRepository */
private $customFieldsRepository;
/** @var CustomFieldsResponseBuilder */
private $customFieldsResponseBuilder;
/** @var FormRenderer */
private $formRenderer;
/** @var Block\Date */
private $dateBlock;
/** @var WPFunctions */
private $wp;
/** @var FormFactory */
private $formsFactory;
/** @var Localizer */
private $localizer;
/** @var FeaturesController */
private $flagsController;
public function __construct(
PageRenderer $pageRenderer,
CustomFieldsRepository $customFieldsRepository,
CustomFieldsResponseBuilder $customFieldsResponseBuilder,
FormRenderer $formRenderer,
Block\Date $dateBlock,
WPFunctions $wp,
FormFactory $formsFactory,
FeaturesController $flagsController,
Localizer $localizer
) {
$this->pageRenderer = $pageRenderer;
$this->customFieldsRepository = $customFieldsRepository;
$this->customFieldsResponseBuilder = $customFieldsResponseBuilder;
$this->formRenderer = $formRenderer;
$this->dateBlock = $dateBlock;
$this->wp = $wp;
$this->formsFactory = $formsFactory;
$this->localizer = $localizer;
$this->flagsController = $flagsController;
}
public function render() {
if (!isset($_GET['id']) && !isset($_GET['action'])) {
$this->renderTemplateSelection();
return;
}
if ($_GET['action'] === 'create') {
$this->createEmptyForm();
}
$form = Form::findOne((int)$_GET['id']);
if ($form instanceof Form) {
$form = $form->asArray();
}
$form['styles'] = $this->formRenderer->getCustomStyles($form);
$customFields = $this->customFieldsRepository->findAll();
$dateTypes = $this->dateBlock->getDateTypes();
$data = [
'form' => $form,
'form_exports' => [
'php' => Export::get('php', $form),
'iframe' => Export::get('iframe', $form),
'shortcode' => Export::get('shortcode', $form),
],
'pages' => Pages::getAll(),
'segments' => Segment::getSegmentsWithSubscriberCount(),
'styles' => $this->formRenderer->getCustomStyles($form),
'date_types' => array_map(function ($label, $value) {
return [
'label' => $label,
'value' => $value,
];
}, $dateTypes, array_keys($dateTypes)),
'date_formats' => $this->dateBlock->getDateFormats(),
'month_names' => $this->dateBlock->getMonthNames(),
'sub_menu' => 'mailpoet-forms',
'custom_fields' => $this->customFieldsResponseBuilder->buildBatch($customFields),
'preview_page_url' => $this->getPreviewPageUrl(),
'custom_fonts' => CustomFonts::FONTS,
'translations' => $this->getGutenbergScriptsTranslations(),
];
$this->wp->wpEnqueueMedia();
$this->pageRenderer->displayPage('form/editor.html', $data);
}
private function renderTemplateSelection() {
$templates = [
[
'id' => 'my-fancy-template1', 'id' => 'my-fancy-template1',
'name' => 'My First Form', 'name' => 'My Fancy Form',
'body' => [ 'body' => [
[ [
'type' => 'columns', 'type' => 'columns',
@ -188,7 +95,7 @@ class FormEditor {
], ],
], ],
'settings' => [ 'settings' => [
'segments' => ['3'], 'segments' => [],
'on_success' => 'message', 'on_success' => 'message',
'success_message' => 'Check your inbox or spam folder to confirm your subscription.', 'success_message' => 'Check your inbox or spam folder to confirm your subscription.',
'success_page' => '5', 'success_page' => '5',
@ -233,8 +140,103 @@ class FormEditor {
', ',
], ],
]; ];
/** @var PageRenderer */
private $pageRenderer;
/** @var CustomFieldsRepository */
private $customFieldsRepository;
/** @var CustomFieldsResponseBuilder */
private $customFieldsResponseBuilder;
/** @var FormRenderer */
private $formRenderer;
/** @var Block\Date */
private $dateBlock;
/** @var WPFunctions */
private $wp;
/** @var FormFactory */
private $formsFactory;
/** @var Localizer */
private $localizer;
/** @var FeaturesController */
private $flagsController;
public function __construct(
PageRenderer $pageRenderer,
CustomFieldsRepository $customFieldsRepository,
CustomFieldsResponseBuilder $customFieldsResponseBuilder,
FormRenderer $formRenderer,
Block\Date $dateBlock,
WPFunctions $wp,
FormFactory $formsFactory,
FeaturesController $flagsController,
Localizer $localizer
) {
$this->pageRenderer = $pageRenderer;
$this->customFieldsRepository = $customFieldsRepository;
$this->customFieldsResponseBuilder = $customFieldsResponseBuilder;
$this->formRenderer = $formRenderer;
$this->dateBlock = $dateBlock;
$this->wp = $wp;
$this->formsFactory = $formsFactory;
$this->localizer = $localizer;
$this->flagsController = $flagsController;
}
public function render() {
if (!isset($_GET['id']) && !isset($_GET['action'])) {
$this->renderTemplateSelection();
return;
}
if (isset($_GET['action']) && $_GET['action'] === 'create') {
$this->createForm($_GET['template-id']);
}
$form = Form::findOne((int)$_GET['id']);
if ($form instanceof Form) {
$form = $form->asArray();
}
$form['styles'] = $this->formRenderer->getCustomStyles($form);
$customFields = $this->customFieldsRepository->findAll();
$dateTypes = $this->dateBlock->getDateTypes();
$data = [
'form' => $form,
'form_exports' => [
'php' => Export::get('php', $form),
'iframe' => Export::get('iframe', $form),
'shortcode' => Export::get('shortcode', $form),
],
'pages' => Pages::getAll(),
'segments' => Segment::getSegmentsWithSubscriberCount(),
'styles' => $this->formRenderer->getCustomStyles($form),
'date_types' => array_map(function ($label, $value) {
return [
'label' => $label,
'value' => $value,
];
}, $dateTypes, array_keys($dateTypes)),
'date_formats' => $this->dateBlock->getDateFormats(),
'month_names' => $this->dateBlock->getMonthNames(),
'sub_menu' => 'mailpoet-forms',
'custom_fields' => $this->customFieldsResponseBuilder->buildBatch($customFields),
'preview_page_url' => $this->getPreviewPageUrl(),
'custom_fonts' => CustomFonts::FONTS,
'translations' => $this->getGutenbergScriptsTranslations(),
];
$this->wp->wpEnqueueMedia();
$this->pageRenderer->displayPage('form/editor.html', $data);
}
private function renderTemplateSelection() {
$templates = array_values(self::TEMPLATES);
if (empty($templates) || !$this->flagsController->isSupported(FeaturesController::TEMPLATES_SELECTION)) { if (empty($templates) || !$this->flagsController->isSupported(FeaturesController::TEMPLATES_SELECTION)) {
$this->createEmptyForm(); $this->createForm();
} }
$data = [ $data = [
'templates' => $templates, 'templates' => $templates,
@ -242,8 +244,13 @@ class FormEditor {
$this->pageRenderer->displayPage('form/template_selection.html', $data); $this->pageRenderer->displayPage('form/template_selection.html', $data);
} }
private function createEmptyForm() { private function createForm($templateId = null) {
if (!is_null($templateId) && isset(self::TEMPLATES[$templateId])) {
$form = $this->formsFactory->createFormFromTemplate(self::TEMPLATES[$templateId]);
}
if (!isset($form)) {
$form = $this->formsFactory->createEmptyForm(); $form = $this->formsFactory->createEmptyForm();
}
$this->wp->wpSafeRedirect( $this->wp->wpSafeRedirect(
$this->wp->getSiteUrl(null, $this->wp->getSiteUrl(null,

View File

@ -5,6 +5,13 @@ namespace MailPoet\Form;
use MailPoet\Models\Form; use MailPoet\Models\Form;
class FormFactory { class FormFactory {
public function createFormFromTemplate(array $template) {
if (isset($template['id'])) {
unset($template['id']);
}
return Form::createOrUpdate($template);
}
/** @return Form */ /** @return Form */
public function createEmptyForm() { public function createEmptyForm() {
$data = [ $data = [
@ -42,6 +49,6 @@ class FormFactory {
'segments_selected_by' => 'admin', 'segments_selected_by' => 'admin',
], ],
]; ];
return Form::createOrUpdate($data); return $this->createFormFromTemplate($data);
} }
} }