diff --git a/mailpoet/lib/Form/Block/BlockRendererHelper.php b/mailpoet/lib/Form/Block/BlockRendererHelper.php
index 14d608b9e6..0ec509ecee 100644
--- a/mailpoet/lib/Form/Block/BlockRendererHelper.php
+++ b/mailpoet/lib/Form/Block/BlockRendererHelper.php
@@ -27,7 +27,9 @@ class BlockRendererHelper {
}
public function getInputValidation(array $block, array $extraRules = [], ?int $formId = null): string {
- $rules = [];
+ $rules = [
+ 'errors-container' => '.' . $this->getErrorsContainerClass($block, $formId),
+ ];
$blockId = $this->wp->escAttr($block['id']);
if ($blockId === 'email') {
@@ -52,13 +54,11 @@ class BlockRendererHelper {
$rules['required'] = true;
$rules['mincheck'] = 1;
$rules['group'] = $blockId;
- $rules['errors-container'] = '.mailpoet_error_' . $blockId . '_' . $formId;
$rules['required-message'] = __('Please select a list.', 'mailpoet');
}
if (!empty($block['params']['required'])) {
$rules['required'] = true;
- $rules['errors-container'] = '.mailpoet_error_' . $blockId . '_' . $formId;
$rules['required-message'] = __('This field is required.', 'mailpoet');
}
@@ -74,13 +74,11 @@ class BlockRendererHelper {
if (in_array($block['type'], ['radio', 'checkbox'])) {
$rules['group'] = 'custom_field_' . $blockId;
- $rules['errors-container'] = '.mailpoet_error_' . $blockId . ($formId ? '_' . $formId : '');
$rules['required-message'] = __('This field is required.', 'mailpoet');
}
if ($block['type'] === 'date') {
$rules['group'] = 'custom_field_' . $blockId;
- $rules['errors-container'] = '.mailpoet_error_' . $blockId . ($formId ? '_' . $formId : '');
}
$validation = [];
@@ -267,6 +265,22 @@ class BlockRendererHelper {
}, $value);
}
+ public function renderErrorsContainer(array $block = [], ?int $formId = null): string {
+ $errorContainerClass = $this->getErrorsContainerClass($block, $formId);
+ return '';
+ }
+
+ private function getErrorsContainerClass(array $block = [], ?int $formId = null): string {
+ $validationId = $block['validation_id'] ?? null;
+ if (!$validationId) {
+ $validationId = $this->wp->escAttr($block['id']);
+ if ($formId) {
+ $validationId .= '_' . $formId;
+ }
+ }
+ return 'mailpoet_error_' . $validationId;
+ }
+
private function translateValidationErrorMessage(string $validate): string {
switch ($validate) {
case 'email':
diff --git a/mailpoet/lib/Form/Block/Checkbox.php b/mailpoet/lib/Form/Block/Checkbox.php
index 7e9764983c..25dd3fd290 100644
--- a/mailpoet/lib/Form/Block/Checkbox.php
+++ b/mailpoet/lib/Form/Block/Checkbox.php
@@ -74,7 +74,7 @@ class Checkbox {
$html .= '';
- $html .= '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
return $this->wrapper->render($block, $html);
}
diff --git a/mailpoet/lib/Form/Block/Date.php b/mailpoet/lib/Form/Block/Date.php
index 2c0a09aada..a8119603e3 100644
--- a/mailpoet/lib/Form/Block/Date.php
+++ b/mailpoet/lib/Form/Block/Date.php
@@ -92,7 +92,7 @@ class Date {
}
}
- $html .= '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
return $html;
}
diff --git a/mailpoet/lib/Form/Block/Radio.php b/mailpoet/lib/Form/Block/Radio.php
index 768afb6920..dc96619398 100644
--- a/mailpoet/lib/Form/Block/Radio.php
+++ b/mailpoet/lib/Form/Block/Radio.php
@@ -76,7 +76,7 @@ class Radio {
$html .= '';
- $html .= '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
return $this->wrapper->render($block, $html);
}
diff --git a/mailpoet/lib/Form/Block/Segment.php b/mailpoet/lib/Form/Block/Segment.php
index e0aa18f73f..dc76648710 100644
--- a/mailpoet/lib/Form/Block/Segment.php
+++ b/mailpoet/lib/Form/Block/Segment.php
@@ -69,7 +69,7 @@ class Segment {
$html .= '';
}
- $html .= '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
// End fieldset around checkboxes
$html .= '';
diff --git a/mailpoet/lib/Form/Block/Select.php b/mailpoet/lib/Form/Block/Select.php
index e7539900f7..8c06a25218 100644
--- a/mailpoet/lib/Form/Block/Select.php
+++ b/mailpoet/lib/Form/Block/Select.php
@@ -32,7 +32,7 @@ class Select {
$this->blockStylesRenderer = $blockStylesRenderer;
}
- public function render(array $block, array $formSettings): string {
+ public function render(array $block, array $formSettings, ?int $formId = null): string {
$html = '';
$fieldName = 'data[' . $this->rendererHelper->getFieldName($block) . ']';
@@ -94,6 +94,8 @@ class Select {
}
$html .= '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
+
return $this->wrapper->render($block, $html);
}
}
diff --git a/mailpoet/lib/Form/Block/Text.php b/mailpoet/lib/Form/Block/Text.php
index 2bdf5092e3..1b1528acec 100644
--- a/mailpoet/lib/Form/Block/Text.php
+++ b/mailpoet/lib/Form/Block/Text.php
@@ -31,7 +31,7 @@ class Text {
$this->wp = $wp;
}
- public function render(array $block, array $formSettings): string {
+ public function render(array $block, array $formSettings, ?int $formId = null): string {
$type = 'text';
$automationId = ' ';
$id = '';
@@ -86,6 +86,8 @@ class Text {
$html .= '/>';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
+
return $this->wrapper->render($block, $html);
}
}
diff --git a/mailpoet/lib/Form/Block/Textarea.php b/mailpoet/lib/Form/Block/Textarea.php
index c8be5205ef..2b4c7ccddc 100644
--- a/mailpoet/lib/Form/Block/Textarea.php
+++ b/mailpoet/lib/Form/Block/Textarea.php
@@ -31,7 +31,7 @@ class Textarea {
$this->wp = $wp;
}
- public function render(array $block, array $formSettings): string {
+ public function render(array $block, array $formSettings, ?int $formId = null): string {
$html = '';
$name = $this->rendererHelper->getFieldName($block);
$styles = $this->inputStylesRenderer->renderForTextInput($block['styles'] ?? [], $formSettings);
@@ -57,6 +57,8 @@ class Textarea {
$html .= '>' . $this->rendererHelper->escapeShortCodes($this->rendererHelper->getFieldValue($block)) . '';
+ $html .= $this->rendererHelper->renderErrorsContainer($block, $formId);
+
return $this->wrapper->render($block, $html);
}
}
diff --git a/mailpoet/lib/Form/BlocksRenderer.php b/mailpoet/lib/Form/BlocksRenderer.php
index b3603b045e..ad32084ae7 100644
--- a/mailpoet/lib/Form/BlocksRenderer.php
+++ b/mailpoet/lib/Form/BlocksRenderer.php
@@ -18,6 +18,7 @@ use MailPoet\Form\Block\Select;
use MailPoet\Form\Block\Submit;
use MailPoet\Form\Block\Text;
use MailPoet\Form\Block\Textarea;
+use MailPoet\Util\Security;
class BlocksRenderer {
/** @var Checkbox */
@@ -104,6 +105,9 @@ class BlocksRenderer {
if ($formId) {
$formSettings['id'] = $formId;
}
+ // This is used to properly show validation message when
+ // the same form is rendered on a page multiple times
+ $block['validation_id'] = Security::generateRandomString();
switch ($block['type']) {
case FormEntity::HTML_BLOCK_TYPE:
$html .= $this->html->render($block, $formSettings);
@@ -142,15 +146,15 @@ class BlocksRenderer {
break;
case FormEntity::SELECT_BLOCK_TYPE:
- $html .= $this->select->render($block, $formSettings);
+ $html .= $this->select->render($block, $formSettings, $formId);
break;
case FormEntity::TEXT_BLOCK_TYPE:
- $html .= $this->text->render($block, $formSettings);
+ $html .= $this->text->render($block, $formSettings, $formId);
break;
case FormEntity::TEXTAREA_BLOCK_TYPE:
- $html .= $this->textarea->render($block, $formSettings);
+ $html .= $this->textarea->render($block, $formSettings, $formId);
break;
case FormEntity::SUBMIT_BLOCK_TYPE: