Skip to content
Snippets Groups Projects
Commit 01bd13a8 authored by Paul Ilea's avatar Paul Ilea
Browse files

[TASK] Form template registration fix

parent 20337e91
No related branches found
Tags 4.7.4
No related merge requests found
...@@ -28,6 +28,7 @@ namespace SGalinski\SgMail\Finisher\Forms; ...@@ -28,6 +28,7 @@ namespace SGalinski\SgMail\Finisher\Forms;
***************************************************************/ ***************************************************************/
use SGalinski\SgMail\Service\MailTemplateService; use SGalinski\SgMail\Service\MailTemplateService;
use SGalinski\SgMail\Service\RegisterService;
use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher; use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher;
...@@ -87,10 +88,8 @@ class FormsFinisher extends AbstractFinisher { ...@@ -87,10 +88,8 @@ class FormsFinisher extends AbstractFinisher {
} else { } else {
$markerName = $identifier; $markerName = $identifier;
} }
$markerName = preg_replace('/[^a-zA-Z0-9]/', '', $markerName); $markerName = RegisterService::normalizeFormFieldMarkerName($markerName);
if (!isset($markers[$markerName])) { $markers[$markerName] = $value;
$markers[$markerName] = $value;
}
} }
$templateName = trim((string) $this->parseOption('template')); $templateName = trim((string) $this->parseOption('template'));
......
...@@ -284,4 +284,14 @@ class RegisterService implements \TYPO3\CMS\Core\SingletonInterface { ...@@ -284,4 +284,14 @@ class RegisterService implements \TYPO3\CMS\Core\SingletonInterface {
return $registerFile; 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);
}
} }
...@@ -46,7 +46,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll ...@@ -46,7 +46,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll
* @var array * @var array
*/ */
const IGNORE_FIELDS = [ const IGNORE_FIELDS = [
'StaticText', 'Hidden', 'GridRow' 'StaticText', 'Hidden', 'GridRow', 'Fieldset', 'Page'
]; ];
/** /**
...@@ -121,27 +121,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll ...@@ -121,27 +121,7 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll
$parsedYaml = Yaml::parse(file_get_contents($absoluteFilePath)); $parsedYaml = Yaml::parse(file_get_contents($absoluteFilePath));
$renderables = []; $renderables = self::getFormFieldsRecursive([0 => $parsedYaml]);
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;
}
}
// write the new Register.php file and add it to the registrationFiles array in the RegisterService // write the new Register.php file and add it to the registrationFiles array in the RegisterService
$this->writeRegisterFile($renderables, $extensionKey, $templateKey); $this->writeRegisterFile($renderables, $extensionKey, $templateKey);
...@@ -166,27 +146,34 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll ...@@ -166,27 +146,34 @@ class FormEditorController extends \TYPO3\CMS\Form\Controller\FormEditorControll
// if markerName is explicitly set, override the registered identifier // if markerName is explicitly set, override the registered identifier
$markerName = $element['identifier']; $markerName = $element['identifier'];
if (isset($element['properties']['markerName']) && $element['properties']['markerName'] !== '') { if (isset($element['properties']['markerName']) && $element['properties']['markerName'] !== '') {
$markerName = $element['properties']['markerName']; $markerName = trim($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 = RegisterService::normalizeFormFieldMarkerName($markerName);
$markers[$markerName] = [
'identifier' => $markerName,
'type' => MailTemplateService::MARKER_TYPE_STRING,
'value' => $element['label'],
'description' => $element['label']
];
} }
$registrationService = $this->objectManager->get(RegisterService::class); $registrationService = $this->objectManager->get(RegisterService::class);
return $registrationService->writeRegisterFile($templateKey, $extensionKey, $markers, $templateKey); 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;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment