diff --git a/typo3/sysext/core/Classes/Mail/FluidEmail.php b/typo3/sysext/core/Classes/Mail/FluidEmail.php index 9c0b51bd632ef27c8f0dbf71318d2d92706d61f5..cd698b67b7000e3c171adabb3bc02cba090b2191 100644 --- a/typo3/sysext/core/Classes/Mail/FluidEmail.php +++ b/typo3/sysext/core/Classes/Mail/FluidEmail.php @@ -26,6 +26,7 @@ use TYPO3\CMS\Core\Information\Typo3Information; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; use TYPO3\CMS\Fluid\View\TemplatePaths; +use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperVariableContainer; /** * Send out templated HTML/plain text emails with Fluid. @@ -143,6 +144,15 @@ class FluidEmail extends Email return parent::getBody(); } + /** + * @return ViewHelperVariableContainer + * @internal Only used for ext:form, not part of TYPO3 Core API. + */ + public function getViewHelperVariableContainer(): ViewHelperVariableContainer + { + return $this->view->getRenderingContext()->getViewHelperVariableContainer(); + } + protected function generateTemplatedBody(): void { if (in_array(static::FORMAT_HTML, $this->format, true)) { diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-90728-AddFluidEmailOptionToEXTformEmailFinisher.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-90728-AddFluidEmailOptionToEXTformEmailFinisher.rst new file mode 100644 index 0000000000000000000000000000000000000000..f55f862e918bfad294061c8db938754b2ebfb073 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-90728-AddFluidEmailOptionToEXTformEmailFinisher.rst @@ -0,0 +1,67 @@ +.. include:: ../../Includes.txt + +================================================================= +Feature: #90728 - Add FluidEmail option to EXT:form EmailFinisher +================================================================= + +See :issue:`90728` + +Description +=========== + +After the introduction of FluidEmail in v10 the option to send mails in a +standardized way is now also added to the EmailFinisher of the system extension +EXT:from. + +To use FluidEmail a new option `useFluidEmail` is added to both the EmailToReceiver +and EmailToSender finisher. It defaults to :php:`FALSE` so extension authors are +able to smoothly test and upgrade their forms. Furthermore a new option `title` +is available which can be used to add an E-Mail title to the default FluidEmail +template. This option is capable of rendering form element variables using the +known bracket syntax and can be overwritten in the FlexForm configuration of the +form plugin. + +To customize the templates beeing used following options can be set: + +* `templateName`: The template name (for both HTML and plaintext) without the extension +* `templateRootPaths`: The paths to the templates +* `partialRootPaths`: The paths to the partials +* `layoutRootPaths`: The paths to the layouts + +For FluidEmail, the field `templatePathAndFilename` is not evaluated anymore. + +A finisher configuration could look like this: + +.. code-block:: yaml + + identifier: contact + type: Form + prototypeName: standard + finishers: + - + identifier: EmailToSender + options: + subject: 'Your Message: {message}' + title: 'Hello {name}, your confirmation' + templateName: ContactForm + templateRootPaths: + 100: 'EXT:sitepackage/Resources/Private/Templates/Email/' + partialRootPaths: + 100: 'EXT:sitepackage/Resources/Private/Partials/Email/' + addHtmlPart: true + useFluidEmail: true + +Please note that the old template name syntax `{@format}.html` does not work for +FluidEmail as each format needs a different template with the corresponing file +extension. In the example above the following files must exist in the specified +template path: + +* `ContactForm.html` +* `ContactForm.txt` + +Impact +====== + +It's now possible to use FluidEmail for sending mails in EXT:form. + +.. index:: Fluid, Frontend, ext:form diff --git a/typo3/sysext/form/Classes/Domain/Finishers/EmailFinisher.php b/typo3/sysext/form/Classes/Domain/Finishers/EmailFinisher.php index 709a7162c0e65acb701f9e46648163c3fd0b46c0..eeee910f488cff0128dea1aae39aaac15339f6b5 100644 --- a/typo3/sysext/form/Classes/Domain/Finishers/EmailFinisher.php +++ b/typo3/sysext/form/Classes/Domain/Finishers/EmailFinisher.php @@ -18,10 +18,13 @@ declare(strict_types=1); namespace TYPO3\CMS\Form\Domain\Finishers; use Symfony\Component\Mime\Address; +use TYPO3\CMS\Core\Mail\FluidEmail; +use TYPO3\CMS\Core\Mail\Mailer; use TYPO3\CMS\Core\Mail\MailMessage; -use TYPO3\CMS\Core\Utility\MathUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Domain\Model\FileReference; use TYPO3\CMS\Fluid\View\StandaloneView; +use TYPO3\CMS\Fluid\View\TemplatePaths; use TYPO3\CMS\Form\Domain\Finishers\Exception\FinisherException; use TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload; use TYPO3\CMS\Form\Domain\Runtime\FormRuntime; @@ -33,9 +36,11 @@ use TYPO3\CMS\Form\ViewHelpers\RenderRenderableViewHelper; * * Options: * - * - templatePathAndFilename (mandatory): Template path and filename for the mail body - * - layoutRootPath: root path for the layouts - * - partialRootPath: root path for the partials + * - templatePathAndFilename (mandatory for Mail): Template path and filename for the mail body + * - templateName (mandatory for FluidEmail): Template name for the mail body + * - templateRootPaths: root paths for the templates + * - layoutRootPaths: root paths for the layouts + * - partialRootPaths: root paths for the partials * - variables: associative array of variables which are available inside the Fluid template * * The following options control the mail sending. In all of them, placeholders in the form @@ -49,7 +54,6 @@ use TYPO3\CMS\Form\ViewHelpers\RenderRenderableViewHelper; * - replyToRecipients: Email addresses and human-readable names of the reply-to recipients * - carbonCopyRecipients: Email addresses and human-readable names of the copy recipients * - blindCarbonCopyRecipients: Email addresses and human-readable names of the blind copy recipients - * - format: Format of the email (one of the FORMAT_* constants). By default mails are sent as HTML. * * Scope: frontend */ @@ -87,16 +91,19 @@ class EmailFinisher extends AbstractFinisher } $subject = $this->parseOption('subject'); - $recipients = $this->getRecipients('recipients', 'recipientAddress', 'recipientName'); + $recipients = $this->getRecipients('recipients'); $senderAddress = $this->parseOption('senderAddress'); $senderAddress = is_string($senderAddress) ? $senderAddress : ''; $senderName = $this->parseOption('senderName'); $senderName = is_string($senderName) ? $senderName : ''; - $replyToRecipients = $this->getRecipients('replyToRecipients', 'replyToAddress'); - $carbonCopyRecipients = $this->getRecipients('carbonCopyRecipients', 'carbonCopyAddress'); - $blindCarbonCopyRecipients = $this->getRecipients('blindCarbonCopyRecipients', 'blindCarbonCopyAddress'); - $addHtmlPart = $this->isHtmlPartAdded(); + $replyToRecipients = $this->getRecipients('replyToRecipients'); + $carbonCopyRecipients = $this->getRecipients('carbonCopyRecipients'); + $blindCarbonCopyRecipients = $this->getRecipients('blindCarbonCopyRecipients'); + $addHtmlPart = $this->parseOption('addHtmlPart') ? true : false; $attachUploads = $this->parseOption('attachUploads'); + $useFluidEmail = $this->parseOption('useFluidEmail'); + $title = $this->parseOption('title'); + $title = is_string($title) && $title !== '' ? $title : $subject; if (empty($subject)) { throw new FinisherException('The option "subject" must be set for the EmailFinisher.', 1327060320); @@ -108,9 +115,23 @@ class EmailFinisher extends AbstractFinisher throw new FinisherException('The option "senderAddress" must be set for the EmailFinisher.', 1327060210); } - $mail = $this->objectManager->get(MailMessage::class); + $formRuntime = $this->finisherContext->getFormRuntime(); - $mail->from(new Address($senderAddress, $senderName)) + $translationService = TranslationService::getInstance(); + if (is_string($this->options['translation']['language'] ?? null) && $this->options['translation']['language'] !== '') { + $languageBackup = $translationService->getLanguage(); + $translationService->setLanguage($this->options['translation']['language']); + } + + $mail = $useFluidEmail + ? $this + ->initializeFluidEmail($formRuntime) + ->format($addHtmlPart ? FluidEmail::FORMAT_BOTH : FluidEmail::FORMAT_PLAIN) + ->assign('title', $title) + : GeneralUtility::makeInstance(MailMessage::class); + + $mail + ->from(new Address($senderAddress, $senderName)) ->to(...$recipients) ->subject($subject); @@ -126,36 +147,30 @@ class EmailFinisher extends AbstractFinisher $mail->bcc(...$blindCarbonCopyRecipients); } - $formRuntime = $this->finisherContext->getFormRuntime(); - - $translationService = TranslationService::getInstance(); - if (isset($this->options['translation']['language']) && !empty($this->options['translation']['language'])) { - $languageBackup = $translationService->getLanguage(); - $translationService->setLanguage($this->options['translation']['language']); - } - - $parts = [ - [ - 'format' => 'Plaintext', - 'contentType' => 'text/plain', - ], - ]; - - if ($addHtmlPart) { - $parts[] = [ - 'format' => 'Html', - 'contentType' => 'text/html', + if (!$useFluidEmail) { + $parts = [ + [ + 'format' => 'Plaintext', + 'contentType' => 'text/plain', + ], ]; - } - foreach ($parts as $i => $part) { - $standaloneView = $this->initializeStandaloneView($formRuntime, $part['format']); - $message = $standaloneView->render(); + if ($addHtmlPart) { + $parts[] = [ + 'format' => 'Html', + 'contentType' => 'text/html', + ]; + } + + foreach ($parts as $i => $part) { + $standaloneView = $this->initializeStandaloneView($formRuntime, $part['format']); + $message = $standaloneView->render(); - if ($part['contentType'] === 'text/plain') { - $mail->text($message); - } else { - $mail->html($message); + if ($part['contentType'] === 'text/plain') { + $mail->text($message); + } else { + $mail->html($message); + } } } @@ -163,10 +178,8 @@ class EmailFinisher extends AbstractFinisher $translationService->setLanguage($languageBackup); } - $elements = $formRuntime->getFormDefinition()->getRenderablesRecursively(); - if ($attachUploads) { - foreach ($elements as $element) { + foreach ($formRuntime->getFormDefinition()->getRenderablesRecursively() as $element) { if (!$element instanceof FileUpload) { continue; } @@ -175,13 +188,12 @@ class EmailFinisher extends AbstractFinisher if ($file instanceof FileReference) { $file = $file->getOriginalResource(); } - $mail->attach($file->getContents(), $file->getName(), $file->getMimeType()); } } } - $mail->send(); + $useFluidEmail ? GeneralUtility::makeInstance(Mailer::class)->send($mail) : $mail->send(); } /** @@ -192,7 +204,7 @@ class EmailFinisher extends AbstractFinisher */ protected function initializeStandaloneView(FormRuntime $formRuntime, string $format): StandaloneView { - $standaloneView = $this->objectManager->get(StandaloneView::class); + $standaloneView = GeneralUtility::makeInstance(StandaloneView::class); if (isset($this->options['templatePathAndFilename'])) { $this->options['templatePathAndFilename'] = strtr($this->options['templatePathAndFilename'], [ @@ -225,97 +237,95 @@ class EmailFinisher extends AbstractFinisher $standaloneView->setLayoutRootPaths($this->options['layoutRootPaths']); } - if (isset($this->options['variables'])) { + if (is_array($this->options['variables'] ?? null)) { $standaloneView->assignMultiple($this->options['variables']); } $standaloneView->assign('form', $formRuntime); $standaloneView->getRenderingContext() + ->getViewHelperVariableContainer() + ->addOrUpdate(RenderRenderableViewHelper::class, 'formRuntime', $formRuntime); + + return $standaloneView; + } + + protected function initializeFluidEmail(FormRuntime $formRuntime): FluidEmail + { + $templateConfiguration = $GLOBALS['TYPO3_CONF_VARS']['MAIL']; + + if (is_array($this->options['templateRootPaths'] ?? null)) { + $templateConfiguration['templateRootPaths'] = array_replace_recursive( + $templateConfiguration['templateRootPaths'], + $this->options['templateRootPaths'] + ); + ksort($templateConfiguration['templateRootPaths']); + } + + if (is_array($this->options['partialRootPaths'] ?? null)) { + $templateConfiguration['partialRootPaths'] = array_replace_recursive( + $templateConfiguration['partialRootPaths'], + $this->options['partialRootPaths'] + ); + ksort($templateConfiguration['partialRootPaths']); + } + + if (is_array($this->options['layoutRootPaths'] ?? null)) { + $templateConfiguration['layoutRootPaths'] = array_replace_recursive( + $templateConfiguration['layoutRootPaths'], + $this->options['layoutRootPaths'] + ); + ksort($templateConfiguration['layoutRootPaths']); + } + + $fluidEmail = GeneralUtility::makeInstance( + FluidEmail::class, + GeneralUtility::makeInstance(TemplatePaths::class, $templateConfiguration) + ); + + if (!isset($this->options['templateName']) || $this->options['templateName'] === '') { + throw new FinisherException('The option "templateName" must be set to use FluidEmail.', 1599834020); + } + + // Migrate old template name to default FluidEmail name + if ($this->options['templateName'] === '{@format}.html') { + $this->options['templateName'] = 'Default'; + } + + $fluidEmail + ->setTemplate($this->options['templateName']) + ->assignMultiple([ + 'finisherVariableProvider' => $this->finisherContext->getFinisherVariableProvider(), + 'form' => $formRuntime + ]); + + if (is_array($this->options['variables'] ?? null)) { + $fluidEmail->assignMultiple($this->options['variables']); + } + + $fluidEmail ->getViewHelperVariableContainer() ->addOrUpdate(RenderRenderableViewHelper::class, 'formRuntime', $formRuntime); - return $standaloneView; + return $fluidEmail; } /** * Get mail recipients * * @param string $listOption List option name - * @param string $singleAddressOption Single address option - * @param string|null $singleAddressNameOption Single address name * @return array - * - * @deprecated since TYPO3 v10.0, will be removed in TYPO3 v11.0. */ - protected function getRecipients( - string $listOption, - string $singleAddressOption, - string $singleAddressNameOption = null - ): array { - $recipients = $this->parseOption($listOption); - $singleAddress = $this->parseOption($singleAddressOption); - $singleAddressName = ''; - - $recipients = $recipients ?? []; - - if (!empty($singleAddress)) { - trigger_error(sprintf( - 'EmailFinisher option "%s" is deprecated and will be removed in TYPO3 v11.0. Use "%s" instead.', - $singleAddressOption, - $listOption - ), E_USER_DEPRECATED); - - if (!empty($singleAddressNameOption)) { - trigger_error(sprintf( - 'EmailFinisher option "%s" is deprecated and will be removed in TYPO3 v11.0. Use "%s" instead.', - $singleAddressNameOption, - $listOption - ), E_USER_DEPRECATED); - $singleAddressName = $this->parseOption($singleAddressNameOption); - } - - $recipients[$singleAddress] = $singleAddressName ?: ''; - } - + protected function getRecipients(string $listOption): array + { + $recipients = $this->parseOption($listOption) ?? []; $addresses = []; foreach ($recipients as $address => $name) { - if (MathUtility::canBeInterpretedAsInteger($address)) { - $address = $name; - $name = ''; - } - // Drop entries without mail address - if (empty($address)) { + if (!GeneralUtility::validEmail($address)) { + // Drop entries without valid address continue; } $addresses[] = new Address($address, $name); } return $addresses; } - - /** - * Get plaintext preference - * - * @return bool - * - * @deprecated since TYPO3 v10.0, will be removed in TYPO3 v11.0. - */ - protected function isHtmlPartAdded(): bool - { - $format = $this->parseOption('format'); - - if ($format !== null) { - trigger_error( - 'Usage of format option in form email finisher is deprecated - use addHtmlPart instead.', - E_USER_DEPRECATED - ); - } - - // FORMAT_HTML was the default value for "format", so - // FORMAT_PLAINTEXT must have been set intentionally - if ($format === self::FORMAT_PLAINTEXT) { - return false; - } - - return $this->parseOption('addHtmlPart') ? true : false; - } } diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml index 4c7f6181b841a9229deb22561ae63b7439beb409..158f9187767f84a043b8b52d02294bf5b09dc938 100644 --- a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml +++ b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml @@ -26,6 +26,8 @@ TYPO3: attachUploads: true translation: language: '' + useFluidEmail: false + title: '' FormEngine: label: tt_content.finishersDefinition.EmailToReceiver.label elements: @@ -149,3 +151,7 @@ TYPO3: 10: - tt_content.finishersDefinition.EmailToReceiver.language.1 - default + title: + label: tt_content.finishersDefinition.EmailToReceiver.title.label + config: + type: input diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml index 9d1ecb7ea20eeec53f7852f3184d093c7a11bdd5..1a9281d3f4e0689f094a7430cec6fb8c27d8ca2c 100644 --- a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml +++ b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml @@ -24,6 +24,8 @@ TYPO3: blindCarbonCopyRecipients: { } addHtmlPart: true attachUploads: true + useFluidEmail: false + title: '' FormEngine: label: tt_content.finishersDefinition.EmailToSender.label elements: @@ -147,3 +149,7 @@ TYPO3: 10: - tt_content.finishersDefinition.EmailToSender.language.1 - default + title: + label: tt_content.finishersDefinition.EmailToSender.title.label + config: + type: input diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml index aad73c94e65011b5252713ba4e819787736e089d..50908f837020862fa9272114f2c7b0a0bef4f44c 100644 --- a/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml +++ b/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml @@ -193,6 +193,21 @@ TYPO3: 10: value: default label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + 1300: + identifier: useFluidEmail + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label + propertyPath: options.useFluidEmail + fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.title.fieldExplanationText + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive 9999: identifier: removeButton templateName: Inspector-RemoveElementEditor @@ -319,6 +334,21 @@ TYPO3: 10: value: default label: formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1 + 1300: + identifier: useFluidEmail + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.label + propertyPath: options.useFluidEmail + fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.fieldExplanationText + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label + propertyPath: options.title + fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.fieldExplanationText + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive 9999: identifier: removeButton templateName: Inspector-RemoveElementEditor diff --git a/typo3/sysext/form/Configuration/Yaml/Legacy/mixins.yaml b/typo3/sysext/form/Configuration/Yaml/Legacy/mixins.yaml index 8fab3baa25a3c350f0e50218561ed65459a3e875..e74f2fceaf2c42c0728a55c800f1c012b64894f9 100644 --- a/typo3/sysext/form/Configuration/Yaml/Legacy/mixins.yaml +++ b/typo3/sysext/form/Configuration/Yaml/Legacy/mixins.yaml @@ -963,6 +963,21 @@ TYPO3: 10: value: default label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + 1300: + identifier: useFluidEmail + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label + propertyPath: options.useFluidEmail + fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.title.fieldExplanationText 9999: identifier: removeButton templateName: Inspector-RemoveElementEditor diff --git a/typo3/sysext/form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml b/typo3/sysext/form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml index 578342030a8cc76ff7f1e6686277c43da2f45c65..46eb3618acf77cb140832a25c326b1ddf48261e9 100644 --- a/typo3/sysext/form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml +++ b/typo3/sysext/form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml @@ -18,6 +18,8 @@ finishers: attachUploads: 'true' translation: language: '' + useFluidEmail: 'true' + title: 'Confirmation of your message' renderables: - diff --git a/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.html b/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.html new file mode 100644 index 0000000000000000000000000000000000000000..08360418dda5c391c853523ddc03cd951c52c948 --- /dev/null +++ b/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.html @@ -0,0 +1,45 @@ +<f:layout name="SystemEmail" /> +<f:section name="Title">{title}</f:section> +<f:section name="Main"> + <table> + <formvh:renderAllFormValues renderable="{form.formDefinition}" as="formValue"> + <tr> + <f:if condition="{formValue.isSection}"> + <f:then> + <td colspan="2"><b>{formvh:translateElementProperty(element: formValue.element, property: 'label')}</b></td> + </f:then> + <f:else> + <td valign="top" align="left">{formvh:translateElementProperty(element: formValue.element, property: 'label')}</td> + <td valign="top" align="left"> + <f:if condition="{formValue.value}"> + <f:then> + <f:if condition="{formValue.isMultiValue}"> + <f:then> + <table cellspacing="0" border="0"> + <f:for each="{formValue.processedValue}" as="value"> + <tr> + <td>{value}</td> + </tr> + </f:for> + </table> + </f:then> + <f:else> + <table cellspacing="0" border="0"> + <tr> + <td><f:format.nl2br>{formValue.processedValue}</f:format.nl2br></td> + </tr> + </table> + </f:else> + </f:if> + </f:then> + <f:else> + - + </f:else> + </f:if> + </td> + </f:else> + </f:if> + </tr> + </formvh:renderAllFormValues> + </table> +</f:section> diff --git a/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.txt b/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.txt new file mode 100644 index 0000000000000000000000000000000000000000..f3109f985af24a16ffa8fb1f8866dd9cb8c407d9 --- /dev/null +++ b/typo3/sysext/form/Resources/Private/Frontend/Templates/Finishers/Email/Default.txt @@ -0,0 +1,16 @@ +<f:layout name="SystemEmail" /> +<f:section name="Title">{title}</f:section> +<f:section name="Main"> +<formvh:renderAllFormValues renderable="{form.formDefinition}" as="formValue"><f:spaceless> + <f:if condition="{formValue.isMultiValue}"> + <f:then> + <f:if condition="{formValue.isSection}"><f:then>*** <formvh:translateElementProperty element="{formValue.element}" property="label" /> ***</f:then><f:else><formvh:translateElementProperty element="{formValue.element}" property="label" />: <f:for each="{formValue.processedValue}" as="singleValue">- {singleValue} + </f:for></f:else></f:if> + </f:then> + <f:else> + <f:if condition="{formValue.isSection}"><f:then>*** <formvh:translateElementProperty element="{formValue.element}" property="label" /> ***</f:then><f:else><formvh:translateElementProperty element="{formValue.element}" property="label" />: <f:if condition="{formValue.processedValue}"><f:then>{formValue.processedValue -> f:format.raw()}</f:then><f:else>-</f:else></f:if></f:else></f:if> + </f:else> + </f:if> +</f:spaceless> +</formvh:renderAllFormValues> +</f:section> diff --git a/typo3/sysext/form/Resources/Private/Language/Database.xlf b/typo3/sysext/form/Resources/Private/Language/Database.xlf index 99d2e05eea3526f576a5bda573582287855bd56a..2ea5929f02ed45a27255cd8b05b66717598da0ab 100644 --- a/typo3/sysext/form/Resources/Private/Language/Database.xlf +++ b/typo3/sysext/form/Resources/Private/Language/Database.xlf @@ -113,6 +113,9 @@ <trans-unit id="tt_content.finishersDefinition.EmailToSender.language.1" resname="tt_content.finishersDefinition.EmailToSender.language.1" xml:space="preserve"> <source>Default</source> </trans-unit> + <trans-unit id="tt_content.finishersDefinition.EmailToSender.title.label" resname="tt_content.finishersDefinition.EmailToSender.title.label" xml:space="preserve"> + <source>Title</source> + </trans-unit> <trans-unit id="tt_content.finishersDefinition.EmailToReceiver.label" resname="tt_content.finishersDefinition.EmailToReceiver.label" xml:space="preserve"> <source>Email to receiver (you)</source> @@ -147,6 +150,9 @@ <trans-unit id="tt_content.finishersDefinition.EmailToReceiver.language.1" resname="tt_content.finishersDefinition.EmailToReceiver.language.1" xml:space="preserve"> <source>Default</source> </trans-unit> + <trans-unit id="tt_content.finishersDefinition.EmailToReceiver.title.label" resname="tt_content.finishersDefinition.EmailToReceiver.title.label" xml:space="preserve"> + <source>Title</source> + </trans-unit> <trans-unit id="tt_content.finishersDefinition.Redirect.label" resname="tt_content.finishersDefinition.Redirect.label" xml:space="preserve"> <source>Redirect</source> @@ -656,6 +662,18 @@ <trans-unit id="formEditor.elements.Form.finisher.EmailToSender.editor.language.1" resname="formEditor.elements.Form.finisher.EmailToSender.editor.language.1" xml:space="preserve"> <source>EN</source> </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label" xml:space="preserve"> + <source>Use FluidEmail</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText" xml:space="preserve"> + <source>If enabled, the email will be sent using the new FluidEmail rendering.</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToSender.editor.title.label" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label" xml:space="preserve"> + <source>Title</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToSender.editor.title.fieldExplanationText" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText" xml:space="preserve"> + <source>Only used if FluidEmail is enabled.</source> + </trans-unit> <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label" resname="formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label" xml:space="preserve"> <source>Email to receiver (you)</source> @@ -705,6 +723,18 @@ <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1" resname="formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1" xml:space="preserve"> <source>EN</source> </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.label" resname="formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.label" xml:space="preserve"> + <source>Use FluidEmail</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.fieldExplanationText" resname="formEditor.elements.Form.finisher.EmailToReceiver.editor.useFluidEmail.fieldExplanationText" xml:space="preserve"> + <source>If enabled, the email will be sent using the new FluidEmail rendering.</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.label" xml:space="preserve"> + <source>Title</source> + </trans-unit> + <trans-unit id="formEditor.elements.Form.finisher.EmailToReceiver.editor.title.fieldExplanationText" resname="formEditor.elements.Form.finisher.EmailToSender.editor.useFluidEmail.fieldExplanationText" xml:space="preserve"> + <source>Only used if FluidEmail is enabled.</source> + </trans-unit> <trans-unit id="formEditor.elements.Form.finisher.Redirect.editor.header.label" resname="formEditor.elements.Form.finisher.Redirect.editor.header.label" xml:space="preserve"> <source>Redirect to a page</source>