Create a new form for the user

[MAILPOET-1798]
This commit is contained in:
Pavel Dohnal
2020-02-10 11:02:37 +01:00
committed by Jack Kitterhing
parent 3443f082ef
commit 0fd954184d
7 changed files with 82 additions and 40 deletions

View File

@ -7,7 +7,6 @@
@import '../../../node_modules/@wordpress/block-library/build-style/editor'; @import '../../../node_modules/@wordpress/block-library/build-style/editor';
@import '../../../node_modules/codemirror/lib/codemirror'; @import '../../../node_modules/codemirror/lib/codemirror';
@import '../../../node_modules/codemirror/theme/neo'; @import '../../../node_modules/codemirror/theme/neo';
@import './components/formEditor/components/form_title'; @import './components/formEditor/components/form_title';
@import './components/formEditor/components/sidebar'; @import './components/formEditor/components/sidebar';
@import './components/formEditor/components/block_editor'; @import './components/formEditor/components/block_editor';

View File

@ -46,7 +46,7 @@ function Edit({ attributes, setAttributes }) {
return ( return (
<div className="mailpoet-block-create-new-content"> <div className="mailpoet-block-create-new-content">
<a <a
href="admin.php?page=mailpoet-forms" href="admin.php?page=mailpoet-form-editor&action=create"
target="_blank" target="_blank"
className="mailpoet-block-create-new-link" className="mailpoet-block-create-new-link"
> >

View File

@ -6,6 +6,7 @@ use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Form\DisplayFormInWPContent; use MailPoet\Form\DisplayFormInWPContent;
use MailPoet\Form\FormFactory;
use MailPoet\Form\Renderer as FormRenderer; use MailPoet\Form\Renderer as FormRenderer;
use MailPoet\Form\Util; use MailPoet\Form\Util;
use MailPoet\Listing; use MailPoet\Listing;
@ -31,6 +32,9 @@ class Forms extends APIEndpoint {
/** @var FormRenderer */ /** @var FormRenderer */
private $formRenderer; private $formRenderer;
/** @var FormFactory */
private $formFactory;
public $permissions = [ public $permissions = [
'global' => AccessControl::PERMISSION_MANAGE_FORMS, 'global' => AccessControl::PERMISSION_MANAGE_FORMS,
]; ];
@ -40,13 +44,15 @@ class Forms extends APIEndpoint {
Listing\Handler $listingHandler, Listing\Handler $listingHandler,
Util\Styles $formStylesUtils, Util\Styles $formStylesUtils,
UserFlagsController $userFlags, UserFlagsController $userFlags,
FormRenderer $formRenderer FormRenderer $formRenderer,
FormFactory $formFactory
) { ) {
$this->bulkAction = $bulkAction; $this->bulkAction = $bulkAction;
$this->listingHandler = $listingHandler; $this->listingHandler = $listingHandler;
$this->formStylesUtils = $formStylesUtils; $this->formStylesUtils = $formStylesUtils;
$this->userFlags = $userFlags; $this->userFlags = $userFlags;
$this->formRenderer = $formRenderer; $this->formRenderer = $formRenderer;
$this->formFactory = $formFactory;
} }
public function get($data = []) { public function get($data = []) {
@ -86,43 +92,10 @@ class Forms extends APIEndpoint {
} }
public function create() { public function create() {
// create new form return $this->save($this->formFactory->createEmptyForm());
$formData = [
'name' => '',
'body' => [
[
'id' => 'email',
'name' => WPFunctions::get()->__('Email', 'mailpoet'),
'type' => 'text',
'static' => true,
'params' => [
'label' => WPFunctions::get()->__('Email', 'mailpoet'),
'required' => true,
'label_within' => true,
],
],
[
'id' => 'submit',
'name' => WPFunctions::get()->__('Submit', 'mailpoet'),
'type' => 'submit',
'static' => true,
'params' => [
'label' => WPFunctions::get()->__('Subscribe!', 'mailpoet'),
],
],
],
'settings' => [
'on_success' => 'message',
'success_message' => Form::getDefaultSuccessMessage(),
'segments' => null,
'segments_selected_by' => 'admin',
],
];
return $this->save($formData);
} }
public function save($data = []) { public function save(Form $form) {
$form = Form::createOrUpdate($data);
$errors = $form->getErrors(); $errors = $form->getErrors();
if (empty($errors)) { if (empty($errors)) {

View File

@ -6,11 +6,13 @@ use MailPoet\AdminPages\PageRenderer;
use MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder;
use MailPoet\CustomFields\CustomFieldsRepository; use MailPoet\CustomFields\CustomFieldsRepository;
use MailPoet\Form\Block; use MailPoet\Form\Block;
use MailPoet\Form\FormFactory;
use MailPoet\Form\Renderer as FormRenderer; use MailPoet\Form\Renderer as FormRenderer;
use MailPoet\Form\Util\Export; use MailPoet\Form\Util\Export;
use MailPoet\Models\Form; use MailPoet\Models\Form;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Settings\Pages; use MailPoet\Settings\Pages;
use MailPoet\WP\Functions as WPFunctions;
class FormEditor { class FormEditor {
/** @var PageRenderer */ /** @var PageRenderer */
@ -28,22 +30,44 @@ class FormEditor {
/** @var Block\Date */ /** @var Block\Date */
private $dateBlock; private $dateBlock;
/** @var WPFunctions */
private $wp;
/**
* @var FormFactory
*/
private $formsFactory;
public function __construct( public function __construct(
PageRenderer $pageRenderer, PageRenderer $pageRenderer,
CustomFieldsRepository $customFieldsRepository, CustomFieldsRepository $customFieldsRepository,
CustomFieldsResponseBuilder $customFieldsResponseBuilder, CustomFieldsResponseBuilder $customFieldsResponseBuilder,
FormRenderer $formRenderer, FormRenderer $formRenderer,
Block\Date $dateBlock Block\Date $dateBlock,
WPFunctions $wp,
FormFactory $formsFactory
) { ) {
$this->pageRenderer = $pageRenderer; $this->pageRenderer = $pageRenderer;
$this->customFieldsRepository = $customFieldsRepository; $this->customFieldsRepository = $customFieldsRepository;
$this->customFieldsResponseBuilder = $customFieldsResponseBuilder; $this->customFieldsResponseBuilder = $customFieldsResponseBuilder;
$this->formRenderer = $formRenderer; $this->formRenderer = $formRenderer;
$this->dateBlock = $dateBlock; $this->dateBlock = $dateBlock;
$this->wp = $wp;
$this->formsFactory = $formsFactory;
} }
public function render() { public function render() {
$id = (isset($_GET['id']) ? (int)$_GET['id'] : 0); $id = (isset($_GET['id']) ? (int)$_GET['id'] : 0);
if (isset($_GET['action']) && $_GET['action'] === 'create') {
$form = $this->formsFactory->createEmptyForm();
$this->wp->wpSafeRedirect(
$this->wp->getSiteUrl(null,
'/wp-admin/admin.php?page=mailpoet-form-editor&id=' . $form->id()
)
);
exit;
}
$form = Form::findOne($id); $form = Form::findOne($id);
if ($form instanceof Form) { if ($form instanceof Form) {
$form = $form->asArray(); $form = $form->asArray();

View File

@ -185,6 +185,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Form\Block\Submit::class); $container->autowire(\MailPoet\Form\Block\Submit::class);
$container->autowire(\MailPoet\Form\Block\Text::class); $container->autowire(\MailPoet\Form\Block\Text::class);
$container->autowire(\MailPoet\Form\Block\Textarea::class); $container->autowire(\MailPoet\Form\Block\Textarea::class);
$container->autowire(\MailPoet\Form\FormFactory::class);
$container->autowire(\MailPoet\Form\Util\Styles::class); $container->autowire(\MailPoet\Form\Util\Styles::class);
// Helpscout // Helpscout
$container->autowire(\MailPoet\Helpscout\Beacon::class); $container->autowire(\MailPoet\Helpscout\Beacon::class);

45
lib/Form/FormFactory.php Normal file
View File

@ -0,0 +1,45 @@
<?php
namespace MailPoet\Form;
use MailPoet\Models\Form;
class FormFactory {
/** @return Form */
public function createEmptyForm() {
$data = [
'name' => '',
'body' => [
[
'id' => 'email',
'name' => __('Email', 'mailpoet'),
'type' => 'text',
'static' => true,
'params' => [
'label' => __('Email', 'mailpoet'),
'required' => true,
'label_within' => true,
],
],
[
'id' => 'submit',
'name' => __('Submit', 'mailpoet'),
'type' => 'submit',
'static' => true,
'params' => [
'label' => __('Subscribe!', 'mailpoet'),
],
],
],
'settings' => [
'on_success' => 'message',
'success_message' => Form::getDefaultSuccessMessage(),
'segments' => null,
'segments_selected_by' => 'admin',
],
];
return Form::createOrUpdate($data);
}
}

View File

@ -71,7 +71,7 @@ class FormsTest extends \MailPoetTest {
'name' => 'My First Form', 'name' => 'My First Form',
]; ];
$response = $this->endpoint->save($formData); $response = $this->endpoint->save(Form::createOrUpdate($formData));
expect($response->status)->equals(APIResponse::STATUS_OK); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals( expect($response->data)->equals(
Form::where('name', 'My First Form')->findOne()->asArray() Form::where('name', 'My First Form')->findOne()->asArray()