From 01bd13a831ed7f1d39e07c0d19b71676631221cf Mon Sep 17 00:00:00 2001 From: Paul Ilea <paul@sgalinski.de> Date: Thu, 29 Nov 2018 18:20:12 +0200 Subject: [PATCH] [TASK] Form template registration fix --- Classes/Finisher/Forms/FormsFinisher.php | 7 +-- Classes/Service/RegisterService.php | 10 +++ Classes/XClass/Form/FormEditorController.php | 65 ++++++++------------ 3 files changed, 39 insertions(+), 43 deletions(-) diff --git a/Classes/Finisher/Forms/FormsFinisher.php b/Classes/Finisher/Forms/FormsFinisher.php index f30c90b9..d6dd4344 100644 --- a/Classes/Finisher/Forms/FormsFinisher.php +++ b/Classes/Finisher/Forms/FormsFinisher.php @@ -28,6 +28,7 @@ namespace SGalinski\SgMail\Finisher\Forms; ***************************************************************/ use SGalinski\SgMail\Service\MailTemplateService; +use SGalinski\SgMail\Service\RegisterService; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher; @@ -87,10 +88,8 @@ class FormsFinisher extends AbstractFinisher { } else { $markerName = $identifier; } - $markerName = preg_replace('/[^a-zA-Z0-9]/', '', $markerName); - if (!isset($markers[$markerName])) { - $markers[$markerName] = $value; - } + $markerName = RegisterService::normalizeFormFieldMarkerName($markerName); + $markers[$markerName] = $value; } $templateName = trim((string) $this->parseOption('template')); diff --git a/Classes/Service/RegisterService.php b/Classes/Service/RegisterService.php index 8bed2d1e..350cd022 100644 --- a/Classes/Service/RegisterService.php +++ b/Classes/Service/RegisterService.php @@ -284,4 +284,14 @@ class RegisterService implements \TYPO3\CMS\Core\SingletonInterface { return $registerFile; } + + /** + * Trims non-allowed characters from the form field marker name + * + * @param string $markerName + * @return string + */ + public static function normalizeFormFieldMarkerName($markerName = '') { + return \preg_replace('/[^a-z0-9\-_]/i', '', $markerName); + } } diff --git a/Classes/XClass/Form/FormEditorController.php b/Classes/XClass/Form/FormEditorController.php index 1309f549..b2c3261a 100644 --- a/Classes/XClass/Form/FormEditorController.php +++ b/Classes/XClass/Form/FormEditorController.php @@ -46,7 +46,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll * @var array */ const IGNORE_FIELDS = [ - 'StaticText', 'Hidden', 'GridRow' + 'StaticText', 'Hidden', 'GridRow', 'Fieldset', 'Page' ]; /** @@ -121,27 +121,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll $parsedYaml = Yaml::parse(file_get_contents($absoluteFilePath)); - $renderables = []; - foreach ($parsedYaml['renderables'] as $formPage) { - if (\is_array($formPage['renderables'])) { - foreach ($formPage['renderables'] as $row) { - if (!\is_array($row) || !$row['type']) { - continue; - } - - if ($row['type'] === 'GridRow') { - foreach ($row['renderables'] as $renderableInsideGridrow) { - $renderables[] = $renderableInsideGridrow; - } - - } elseif (!\in_array($row['type'], self::IGNORE_FIELDS, TRUE)) { - $renderables[] = $row; - } - } - } else { - return; - } - } + $renderables = self::getFormFieldsRecursive([0 => $parsedYaml]); // write the new Register.php file and add it to the registrationFiles array in the RegisterService $this->writeRegisterFile($renderables, $extensionKey, $templateKey); @@ -166,27 +146,34 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll // if markerName is explicitly set, override the registered identifier $markerName = $element['identifier']; if (isset($element['properties']['markerName']) && $element['properties']['markerName'] !== '') { - $markerName = $element['properties']['markerName']; - } - $markerName = preg_replace('/[^a-zA-Z0-9]/', '', $markerName); - $duplicateMarker = FALSE; - foreach ($markers as $marker) { - if ($marker['identifier'] === $markerName) { - $duplicateMarker = TRUE; - break; - } - } - if (!$duplicateMarker) { - $markers[] = [ - 'identifier' => $markerName, - 'type' => MailTemplateService::MARKER_TYPE_STRING, - 'value' => $element['label'], - 'description' => $element['label'] - ]; + $markerName = trim($element['properties']['markerName']); } + $markerName = RegisterService::normalizeFormFieldMarkerName($markerName); + $markers[$markerName] = [ + 'identifier' => $markerName, + 'type' => MailTemplateService::MARKER_TYPE_STRING, + 'value' => $element['label'], + 'description' => $element['label'] + ]; } $registrationService = $this->objectManager->get(RegisterService::class); return $registrationService->writeRegisterFile($templateKey, $extensionKey, $markers, $templateKey); } + + /** + * @param array $formData + * @return array + */ + private static function getFormFieldsRecursive($formData = []) { + $out = []; + foreach ($formData as $formElement) { + if (isset($formElement['renderables'])) { + $out = \array_merge($out, self::getFormFieldsRecursive($formElement['renderables'])); + } elseif (!\in_array($formElement['type'], self::IGNORE_FIELDS, TRUE)) { + $out[] = $formElement; + } + } + return $out; + } } -- GitLab