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