├── .crowdin.yaml
├── .ddev
├── commands
│ ├── host
│ │ └── initialize
│ └── web
│ │ └── typo3
├── config.yaml
├── docker-compose.browser.yaml
└── docker-compose.typo3.yaml
├── .editorconfig
├── .github
└── workflows
│ ├── ter-release.yml
│ └── testing.yaml
├── Classes
├── Command
│ ├── AbstractCleanupCommand.php
│ ├── CleanupExportsCommand.php
│ ├── CleanupUnusedUploadsCommand.php
│ ├── CleanupUploadsCommand.php
│ ├── ExportCommand.php
│ ├── FakeRequestTrait.php
│ └── ResetMarkersCommand.php
├── Condition
│ ├── PowermailConditionFunctionsProvider.php
│ └── PowermailTypoScriptConditionProvider.php
├── Controller
│ ├── AbstractController.php
│ ├── FormController.php
│ ├── ModuleController.php
│ └── OutputController.php
├── DataProcessor
│ ├── AbstractDataProcessor.php
│ ├── DataProcessorInterface.php
│ ├── DataProcessorRunner.php
│ ├── SessionDataProcessor.php
│ └── UploadDataProcessor.php
├── Database
│ └── QueryGenerator.php
├── Domain
│ ├── Factory
│ │ ├── FileFactory.php
│ │ └── MailFactory.php
│ ├── Model
│ │ ├── Answer.php
│ │ ├── BackendUser.php
│ │ ├── BackendUserGroup.php
│ │ ├── Field.php
│ │ ├── File.php
│ │ ├── Form.php
│ │ ├── Mail.php
│ │ ├── Page.php
│ │ ├── User.php
│ │ └── UserGroup.php
│ ├── Repository
│ │ ├── AbstractRepository.php
│ │ ├── AnswerRepository.php
│ │ ├── BackendUserGroupRepository.php
│ │ ├── BackendUserRepository.php
│ │ ├── FieldRepository.php
│ │ ├── FormRepository.php
│ │ ├── MailRepository.php
│ │ ├── PageRepository.php
│ │ ├── UserGroupRepository.php
│ │ └── UserRepository.php
│ ├── Service
│ │ ├── CalculatingCaptchaService.php
│ │ ├── ConfigurationService.php
│ │ ├── CountriesFromStaticInfoTablesService.php
│ │ ├── ExportService.php
│ │ ├── GetNewMarkerNamesForFormService.php
│ │ ├── Mail
│ │ │ ├── PlaintextService.php
│ │ │ ├── ReceiverMailReceiverPropertiesService.php
│ │ │ ├── ReceiverMailSenderPropertiesService.php
│ │ │ ├── SendDisclaimedMailPreflight.php
│ │ │ ├── SendMailService.php
│ │ │ ├── SendOptinConfirmationMailPreflight.php
│ │ │ ├── SendReceiverMailPreflight.php
│ │ │ ├── SendSenderMailPreflight.php
│ │ │ └── SenderMailPropertiesService.php
│ │ ├── RedirectUriService.php
│ │ ├── SaveToAnyTableService.php
│ │ ├── SlidingWindowPagination.php
│ │ └── UploadService.php
│ └── Validator
│ │ ├── AbstractValidator.php
│ │ ├── CaptchaValidator.php
│ │ ├── CustomValidator.php
│ │ ├── ForeignValidator.php
│ │ ├── InputValidator.php
│ │ ├── PasswordValidator.php
│ │ ├── SpamShield
│ │ ├── AbstractMethod.php
│ │ ├── Breaker
│ │ │ ├── AbstractBreaker.php
│ │ │ ├── BreakerInterface.php
│ │ │ ├── BreakerRunner.php
│ │ │ ├── IpBreaker.php
│ │ │ └── ValueBreaker.php
│ │ ├── HoneyPodMethod.php
│ │ ├── IpBlacklistMethod.php
│ │ ├── LinkMethod.php
│ │ ├── MethodInterface.php
│ │ ├── NameMethod.php
│ │ ├── SessionMethod.php
│ │ ├── UniqueMethod.php
│ │ └── ValueBlacklistMethod.php
│ │ ├── SpamShieldValidator.php
│ │ ├── StringValidator.php
│ │ ├── UniqueValidator.php
│ │ ├── UploadValidator.php
│ │ └── ValidatorInterface.php
├── Eid
│ └── GetLocationEid.php
├── EventListener
│ └── FlexFormParsingModifyEventListener.php
├── Events
│ ├── BackendPageModulePreviewContentEvent.php
│ ├── CheckIfMailIsAllowedToSaveEvent.php
│ ├── CustomValidatorEvent.php
│ ├── FormControllerConfirmationActionEvent.php
│ ├── FormControllerCreateActionAfterMailDbSavedEvent.php
│ ├── FormControllerCreateActionAfterSubmitViewEvent.php
│ ├── FormControllerCreateActionBeforeRenderViewEvent.php
│ ├── FormControllerDisclaimerActionBeforeRenderViewEvent.php
│ ├── FormControllerFormActionEvent.php
│ ├── FormControllerInitializeObjectEvent.php
│ ├── FormControllerOptinConfirmActionAfterPersistEvent.php
│ ├── FormControllerOptinConfirmActionBeforeRenderViewEvent.php
│ ├── GetNewPathAndFilenameEvent.php
│ ├── MailFactoryBeforePasswordIsHashedEvent.php
│ ├── MailRepositoryGetVariablesWithMarkersFromMailEvent.php
│ ├── PrefillFieldViewHelperEvent.php
│ ├── PrefillMultiFieldViewHelperEvent.php
│ ├── ReceiverMailReceiverPropertiesServiceGetReceiverNameEvent.php
│ ├── ReceiverMailReceiverPropertiesServiceSetReceiverEmailsEvent.php
│ ├── ReceiverMailSenderPropertiesGetSenderEmailEvent.php
│ ├── ReceiverMailSenderPropertiesGetSenderNameEvent.php
│ ├── SendMailServiceCreateEmailBodyEvent.php
│ ├── SendMailServicePrepareAndSendEvent.php
│ ├── SenderMailPropertiesGetSenderEmailEvent.php
│ ├── SenderMailPropertiesGetSenderNameEvent.php
│ ├── UploadServiceGetFilesEvent.php
│ ├── UploadServicePreflightEvent.php
│ └── ValidationDataAttributeViewHelperEvent.php
├── Exception
│ ├── ClassDoesNotExistException.php
│ ├── ConfigurationIsMissingException.php
│ ├── DatabaseFieldMissingException.php
│ ├── DeprecatedException.php
│ ├── ElementNotFoundException.php
│ ├── FileCannotBeCreatedException.php
│ ├── FileNotFoundException.php
│ ├── InterfaceNotImplementedException.php
│ ├── OutdatedTypo3Exception.php
│ ├── PropertiesMissingException.php
│ └── SoftwareIsMissingException.php
├── Finisher
│ ├── AbstractFinisher.php
│ ├── FinisherInterface.php
│ ├── FinisherRunner.php
│ ├── RedirectFinisher.php
│ ├── SaveToAnyTableFinisher.php
│ └── SendParametersFinisher.php
├── Hook
│ ├── CreateMarker.php
│ └── PluginPreviewRenderer.php
├── Tca
│ ├── AddOptionsToSelection.php
│ ├── EvaluateEmail.php
│ ├── FieldSelectorUserFunc.php
│ ├── FormSelectorUserFunc.php
│ ├── Marker.php
│ ├── ShowFormNoteEditForm.php
│ └── ShowFormNoteIfNoEmailOrNameSelected.php
├── Update
│ ├── PowermailLanguageUpdateWizard.php
│ ├── PowermailPermissionSubmoduleUpdater.php
│ ├── PowermailPermissionUpdater.php
│ ├── PowermailPluginUpdater.php
│ └── PowermailRelationUpdateWizard.php
├── UserFunc
│ ├── DateConverter.php
│ └── TestForFeature.php
├── Utility
│ ├── ArrayUtility.php
│ ├── BackendUtility.php
│ ├── BasicFileUtility.php
│ ├── ConfigurationUtility.php
│ ├── CsvUtility.php
│ ├── DatabaseUtility.php
│ ├── FrontendUtility.php
│ ├── HashUtility.php
│ ├── LocalizationUtility.php
│ ├── MailUtility.php
│ ├── MathematicUtility.php
│ ├── ObjectUtility.php
│ ├── ReportingUtility.php
│ ├── SessionUtility.php
│ ├── StringUtility.php
│ ├── TemplateUtility.php
│ └── TypoScriptUtility.php
└── ViewHelpers
│ ├── Be
│ ├── CheckWrongLocalizedFormsViewHelper.php
│ ├── CheckWrongLocalizedPagesViewHelper.php
│ ├── EditLinkViewHelper.php
│ ├── ExtMngConfigViewHelper.php
│ ├── GetClassNameOnActionViewHelper.php
│ ├── IsAdminViewHelper.php
│ ├── LastUpdateExtensionRepositoryViewHelper.php
│ ├── PowermailVersionNoteViewHelper.php
│ ├── PowermailVersionViewHelper.php
│ ├── SessionViewHelper.php
│ ├── T3VersionViewHelper.php
│ └── UploadsFolderViewHelper.php
│ ├── Condition
│ ├── FileExistsViewHelper.php
│ ├── IsAllowedToEditViewHelper.php
│ ├── IsArrayViewHelper.php
│ ├── IsBackendUserAllowedToViewFieldViewHelper.php
│ ├── IsComposerModeViewHelper.php
│ ├── IsDateTimeVariableInVariableViewHelper.php
│ ├── IsDevelopmentContextViewHelper.php
│ ├── IsImageViewHelper.php
│ ├── IsIpInformationEnabledGloballyViewHelper.php
│ ├── IsMarketingInformationActiveViewHelper.php
│ ├── IsMarketingInformationEnabledGloballyViewHelper.php
│ ├── IsNotEmptyViewHelper.php
│ ├── IsNotExcludedFromPowermailAllViewHelper.php
│ ├── IsNumberViewHelper.php
│ ├── IsStringInStringViewHelper.php
│ ├── IsThereAMailWithStartingLetterViewHelper.php
│ └── OrViewHelper.php
│ ├── Form
│ ├── AdvancedSelectViewHelper.php
│ ├── CountriesViewHelper.php
│ ├── MultiUploadViewHelper.php
│ └── SelectFieldViewHelper.php
│ ├── Getter
│ ├── GetDevelopmentContextEmailViewHelper.php
│ ├── GetFieldLabelFromUidViewHelper.php
│ ├── GetFieldMarkerFromUidViewHelper.php
│ ├── GetFieldPropertyFromMarkerAndFormViewHelper.php
│ ├── GetFieldsFromFormViewHelper.php
│ ├── GetPageNameFromUidViewHelper.php
│ ├── GetPagesWithContentRelatedToFormViewHelper.php
│ └── GetPiVarAnswerFieldViewHelper.php
│ ├── Misc
│ ├── BackendEditLinkViewHelper.php
│ ├── CheckForTypoScriptViewHelper.php
│ ├── ContentElementViewHelper.php
│ ├── CreateRowTagsViewHelper.php
│ ├── GetFileWithPathViewHelper.php
│ ├── LinkViewHelper.php
│ ├── ManipulateValueWithTypoScriptViewHelper.php
│ ├── MorestepClassViewHelper.php
│ ├── PrefillFieldViewHelper.php
│ ├── PrefillMultiFieldViewHelper.php
│ ├── VariableInVariableViewHelper.php
│ └── VariablesViewHelper.php
│ ├── Reporting
│ ├── GetLabelsForChartsViewHelper.php
│ └── GetValuesForChartsViewHelper.php
│ ├── String
│ ├── EncodeViewHelper.php
│ ├── EscapeLabelsViewHelper.php
│ ├── ExplodeViewHelper.php
│ ├── ImplodeFieldViewHelper.php
│ ├── RemoveQuoteViewHelper.php
│ ├── SanitizeCsvCellViewHelper.php
│ ├── TrimViewHelper.php
│ ├── UnderscoredToLowerCamelCaseViewHelper.php
│ ├── UpperViewHelper.php
│ └── Utf8ToUtf16ViewHelper.php
│ └── Validation
│ ├── AbstractValidationViewHelper.php
│ ├── CaptchaDataAttributeViewHelper.php
│ ├── CaptchaViewHelper.php
│ ├── DatepickerDataAttributeViewHelper.php
│ ├── EnableJavascriptValidationAndAjaxViewHelper.php
│ ├── ErrorClassViewHelper.php
│ ├── FieldTypeFromValidationViewHelper.php
│ ├── IsHonepodEnabledViewHelper.php
│ ├── PasswordValidationDataAttributeViewHelper.php
│ ├── UploadAttributesViewHelper.php
│ └── ValidationDataAttributeViewHelper.php
├── Configuration
├── Backend
│ ├── Modules.php
│ └── Routes.php
├── Commands.php
├── ExpressionLanguage.php
├── Extbase
│ └── Persistence
│ │ └── Classes.php
├── FlexForms
│ ├── FlexformPi1.xml
│ └── FlexformPi2.xml
├── Icons.php
├── Services.yaml
├── TCA
│ ├── Overrides
│ │ ├── sys_template.php
│ │ └── tt_content.php
│ ├── tx_powermail_domain_model_answer.php
│ ├── tx_powermail_domain_model_field.php
│ ├── tx_powermail_domain_model_form.php
│ ├── tx_powermail_domain_model_mail.php
│ └── tx_powermail_domain_model_page.php
├── TSConfig
│ ├── ContentElementWizard.typoscript
│ └── WebList.typoscript
└── TypoScript
│ ├── BootstrapClassesAndLayout
│ ├── constants.typoscript
│ └── setup.typoscript
│ ├── Main
│ ├── Configuration
│ │ ├── 01_Extension.typoscript
│ │ ├── 02_Settings.typoscript
│ │ ├── 03_MailReceiver.typoscript
│ │ ├── 04_MailSender.typoscript
│ │ ├── 05_ThxPage.typoscript
│ │ ├── 06_Database.typoscript
│ │ ├── 07_DoubleOptin.typoscript
│ │ ├── 08_Disclaimer.typoscript
│ │ ├── 09_Styles.typoscript
│ │ ├── 10_Validation.typoscript
│ │ ├── 11_Captcha.typoscript
│ │ ├── 12_Spamshield.typoscript
│ │ ├── 20_Prefill.typoscript
│ │ ├── 21_ExcludeFromPowermailAllMarker.typoscript
│ │ ├── 22_ManipulateVariablesInPowermailAllMarker.typoscript
│ │ ├── 23_SaveSession.typoscript
│ │ ├── 24_Marketing.typoscript
│ │ ├── 30_Finisher.typoscript
│ │ ├── 31_DataProcessors.typoscript
│ │ ├── 32_DatabaseEntry.typoscript
│ │ ├── 33_Debug.typoscript
│ │ └── 40_Includes.typoscript
│ ├── constants.typoscript
│ └── setup.typoscript
│ ├── Marketing
│ └── setup.typoscript
│ └── Powermail_Frontend
│ ├── constants.typoscript
│ └── setup.typoscript
├── Documentation
├── Changelog
│ ├── Index.md
│ └── UpgradeInstructions.md
├── DevelopmentModel.md
├── FAQ
│ └── Index.md
├── ForAdministrators
│ ├── BackendUserRights.md
│ ├── BestPractice.md
│ ├── BestPractice
│ │ ├── AjaxSubmit.md
│ │ ├── ChangingLabels.md
│ │ ├── DateConverterUserFunc.md
│ │ ├── Debug.md
│ │ ├── DevelopmentContext.md
│ │ ├── DynamicReceiver.md
│ │ ├── FilterFormSelection.md
│ │ ├── MainTypoScript.md
│ │ ├── ManipulateValuesFromPowermailAll.md
│ │ ├── PasswordField.md
│ │ ├── PrefillField.md
│ │ ├── PreventDuplicates.md
│ │ ├── RemoveValuesFromPowermailAll.md
│ │ ├── SaveSession.md
│ │ ├── SavingValuesToThirdPartyTables.md
│ │ ├── SendAttachments.md
│ │ ├── SendingValuesToThirdPartySoftware.md
│ │ ├── SetPidForNewForms.md
│ │ ├── SpamPrevention.md
│ │ ├── Templates.md
│ │ ├── TypoScriptConditions.md
│ │ └── UniqueValues.md
│ ├── Index.md
│ ├── Installation.md
│ ├── PowermailFrontend.md
│ ├── Privacy.md
│ ├── SchedulerTasks.md
│ └── Upgrade.md
├── ForContributors
│ └── Index.md
├── ForDevelopers
│ ├── AddDataProcessors.md
│ ├── AddFinisherClasses.md
│ ├── AddNewFieldProperties.md
│ ├── AddNewFields.md
│ ├── AddNewFlexFormProperties.md
│ ├── AddSpamshieldMethods.md
│ ├── DatabaseModel.md
│ ├── DisableSpamshield.md
│ ├── EventDispatcher.md
│ ├── Index.md
│ ├── LocalDevelopment.md
│ ├── UserfuncsWithCobject.md
│ └── WriteOwnValidators.md
├── ForEditors
│ ├── AddNewForms.md
│ ├── AddNewPlugins.md
│ ├── BackendModule.md
│ ├── FieldCaptcha.md
│ ├── FieldCheck.md
│ ├── FieldContentElement.md
│ ├── FieldCountry.md
│ ├── FieldDate.md
│ ├── FieldFile.md
│ ├── FieldHidden.md
│ ├── FieldHtml.md
│ ├── FieldInput.md
│ ├── FieldLocation.md
│ ├── FieldPassword.md
│ ├── FieldRadio.md
│ ├── FieldReset.md
│ ├── FieldSelect.md
│ ├── FieldSubmit.md
│ ├── FieldText.md
│ ├── FieldTextarea.md
│ ├── FieldTypoScript.md
│ └── Index.md
├── Images
│ ├── backend1.png
│ ├── backend2.png
│ ├── backend_module_export.png
│ ├── backend_module_filter.png
│ ├── backend_module_formoverview.png
│ ├── backend_module_functioncheck.png
│ ├── backend_module_list.png
│ ├── backend_module_menu.png
│ ├── backend_module_menu2.png
│ ├── backend_module_reportingform.png
│ ├── backend_module_reportingmarketing.png
│ ├── bestpractice_ajax.png
│ ├── bestpractice_developmentcontext1.png
│ ├── bestpractice_developmentcontext2.png
│ ├── bestpractice_filterformselection1.png
│ ├── bestpractice_filterformselection2.png
│ ├── bestpractice_predefinedreceivers1.png
│ ├── bestpractice_predefinedreceivers2.png
│ ├── bestpractice_setpidfornewforms.png
│ ├── bestpractice_spamshield1.png
│ ├── bestpractice_spamshield2.jpg
│ ├── developer_cobject.png
│ ├── developer_database_model.jpg
│ ├── developer_new_fieldproperties1.png
│ ├── developer_new_fieldproperties2.png
│ ├── developer_new_fields1.png
│ ├── developer_new_fields2.png
│ ├── developer_new_flexformfield.png
│ ├── developer_new_validation1.png
│ ├── developer_new_validation2.png
│ ├── developer_new_validationtype1.png
│ ├── developer_new_validationtype2.png
│ ├── example_field_captcha.png
│ ├── example_field_checkbox.png
│ ├── example_field_content.png
│ ├── example_field_country.png
│ ├── example_field_date.png
│ ├── example_field_file.png
│ ├── example_field_html.png
│ ├── example_field_input.png
│ ├── example_field_label.png
│ ├── example_field_location.png
│ ├── example_field_password.png
│ ├── example_field_radio.png
│ ├── example_field_reset.png
│ ├── example_field_select.png
│ ├── example_field_select_multi.png
│ ├── example_field_submit.png
│ ├── example_field_textarea.png
│ ├── example_field_typoscript.png
│ ├── extension_manager.png
│ ├── extension_manager2.png
│ ├── extension_manager3.png
│ ├── faq_style.png
│ ├── frontend1.png
│ ├── frontend2.png
│ ├── frontend_pi2.png
│ ├── plugin1.png
│ ├── plugin2.png
│ ├── pluginInformation.png
│ ├── plugin_pi2_tab1.png
│ ├── plugin_tab1.png
│ ├── plugin_tab2.png
│ ├── plugin_tab3.png
│ ├── plugin_tab4.png
│ ├── powermail_icon.png
│ ├── powermail_records.png
│ ├── prefill_frontend_output.png
│ ├── prefill_select_typoscript1.png
│ ├── prefill_select_typoscript2.png
│ ├── record_field_captcha_tab1.png
│ ├── record_field_captcha_tab2.png
│ ├── record_field_check_tab1.png
│ ├── record_field_check_tab2.png
│ ├── record_field_content_tab1.png
│ ├── record_field_content_tab2.png
│ ├── record_field_country_tab1.png
│ ├── record_field_country_tab2.png
│ ├── record_field_date_tab1.png
│ ├── record_field_date_tab2.png
│ ├── record_field_file_tab1.png
│ ├── record_field_file_tab2.png
│ ├── record_field_hidden_tab1.png
│ ├── record_field_hidden_tab2.png
│ ├── record_field_html_tab1.png
│ ├── record_field_html_tab2.png
│ ├── record_field_input_tab1.png
│ ├── record_field_input_tab2.png
│ ├── record_field_location_tab1.png
│ ├── record_field_location_tab2.png
│ ├── record_field_password_tab1.png
│ ├── record_field_password_tab2.png
│ ├── record_field_radio_tab1.png
│ ├── record_field_radio_tab2.png
│ ├── record_field_reset_tab1.png
│ ├── record_field_reset_tab2.png
│ ├── record_field_select_tab1.png
│ ├── record_field_select_tab2.png
│ ├── record_field_submit_tab1.png
│ ├── record_field_submit_tab2.png
│ ├── record_field_text_tab1.png
│ ├── record_field_text_tab2.png
│ ├── record_field_textarea_tab1.png
│ ├── record_field_textarea_tab2.png
│ ├── record_field_typoscript_tab1.png
│ ├── record_field_typoscript_tab2.png
│ ├── record_form_detail1.png
│ ├── record_page_detail1.png
│ ├── scheduler_cleanexportfiles.png
│ ├── scheduler_cleanunusedfiles.png
│ ├── scheduler_cleanupload.png
│ ├── scheduler_export1.png
│ ├── scheduler_export2.png
│ ├── scheduler_export3.png
│ ├── scheduler_garbage_collector.png
│ ├── scheduler_resetmarkers1.png
│ ├── scheduler_resetmarkers2.png
│ ├── static_templates.png
│ ├── upgrade_wizard.png
│ ├── userrights_flexform.png
│ ├── userrights_plugin.png
│ └── userrights_plugin_failure.png
├── Index.md
├── Links
│ └── Index.md
├── Support
│ └── Index.md
└── guides.xml
├── Readme.md
├── Resources
├── Private
│ ├── .htaccess
│ ├── Build
│ │ ├── .babelrc
│ │ ├── .nvmrc
│ │ ├── JavaScript
│ │ │ ├── Backend.js
│ │ │ ├── Form.js
│ │ │ ├── FormValidation.js
│ │ │ ├── Marketing.js
│ │ │ ├── MoreStepForm.js
│ │ │ └── Utility.js
│ │ ├── Sass
│ │ │ ├── Backend.scss
│ │ │ ├── Basic.scss
│ │ │ ├── Bootstrap.scss
│ │ │ ├── _BootstrapExpanded.scss
│ │ │ ├── _Message.scss
│ │ │ ├── _Pi1.scss
│ │ │ └── _Settings.scss
│ │ ├── gulpfile.js
│ │ ├── package.json
│ │ ├── readme.md
│ │ └── rollup.config.js
│ ├── Fonts
│ │ ├── Segment16.txt
│ │ └── Segment16cBold.ttf
│ ├── Image
│ │ └── captcha_bg.png
│ ├── Language
│ │ ├── locallang.xlf
│ │ ├── locallang_csh_tx_powermail_domain_model_answers.xlf
│ │ ├── locallang_csh_tx_powermail_domain_model_fields.xlf
│ │ ├── locallang_csh_tx_powermail_domain_model_forms.xlf
│ │ ├── locallang_csh_tx_powermail_domain_model_mails.xlf
│ │ ├── locallang_csh_tx_powermail_domain_model_pages.xlf
│ │ ├── locallang_db.xlf
│ │ └── locallang_mod.xlf
│ ├── Layouts
│ │ ├── ContentElements
│ │ │ └── Export
│ │ │ │ └── Default.html
│ │ ├── Default.html
│ │ ├── Export.html
│ │ ├── Mail.html
│ │ └── PowermailAll.html
│ ├── Partials
│ │ ├── Form
│ │ │ ├── Field
│ │ │ │ ├── Captcha.html
│ │ │ │ ├── Check.html
│ │ │ │ ├── Content.html
│ │ │ │ ├── Country.html
│ │ │ │ ├── Date.html
│ │ │ │ ├── File.html
│ │ │ │ ├── Hidden.html
│ │ │ │ ├── Html.html
│ │ │ │ ├── Input.html
│ │ │ │ ├── Location.html
│ │ │ │ ├── Password.html
│ │ │ │ ├── Radio.html
│ │ │ │ ├── Reset.html
│ │ │ │ ├── Select.html
│ │ │ │ ├── Submit.html
│ │ │ │ ├── Text.html
│ │ │ │ ├── Textarea.html
│ │ │ │ └── Typoscript.html
│ │ │ ├── FieldLabel.html
│ │ │ └── Page.html
│ │ ├── Mail
│ │ │ └── DisclaimerLink.html
│ │ ├── Misc
│ │ │ ├── FlashMessages.html
│ │ │ ├── FormError.html
│ │ │ ├── GoogleAdwordsConversion.html
│ │ │ ├── HoneyPod.html
│ │ │ └── MarketingInformation.html
│ │ ├── Module
│ │ │ ├── CheckBe
│ │ │ │ ├── CheckWrongLocalizedForms.html
│ │ │ │ ├── CheckWrongLocalizedPages.html
│ │ │ │ ├── DevelopmentContext.html
│ │ │ │ ├── Email.html
│ │ │ │ ├── ExtMngConfig.html
│ │ │ │ ├── Mode.html
│ │ │ │ ├── PowermailVersionNote.html
│ │ │ │ ├── Session.html
│ │ │ │ ├── StaticTemplate.html
│ │ │ │ ├── T3Version.html
│ │ │ │ └── UploadsFolder.html
│ │ │ ├── Export.html
│ │ │ ├── Filter.html
│ │ │ ├── JsAndCssImport.html
│ │ │ ├── List.html
│ │ │ ├── OverviewBe.html
│ │ │ ├── Pagination.html
│ │ │ ├── Search.html
│ │ │ ├── SearchButtons.html
│ │ │ └── SelectedLineMessage.html
│ │ ├── Output
│ │ │ ├── Abc.html
│ │ │ ├── EditHidden.html
│ │ │ └── Search.html
│ │ └── PowermailAll
│ │ │ ├── Mail.html
│ │ │ └── Web.html
│ └── Templates
│ │ ├── Form
│ │ ├── Confirmation.html
│ │ ├── Create.html
│ │ ├── Disclaimer.html
│ │ ├── Form.html
│ │ ├── OptinConfirm.html
│ │ ├── PowermailAll.html
│ │ └── ValidateAjax.html
│ │ ├── Hook
│ │ └── PluginPreview.html
│ │ ├── Log
│ │ └── SpamNotification.html
│ │ ├── Mail
│ │ ├── DisclaimedNotificationMail.html
│ │ ├── OptinMail.html
│ │ ├── ReceiverMail.html
│ │ ├── SenderMail.html
│ │ └── SpamNotification.html
│ │ ├── Module
│ │ ├── CheckBe.html
│ │ ├── ExportCsv.html
│ │ ├── ExportTaskMail.html
│ │ ├── ExportXls.html
│ │ ├── List.html
│ │ ├── OverviewBe.html
│ │ ├── ReportingFormBe.html
│ │ └── ReportingMarketingBe.html
│ │ ├── Output
│ │ ├── Delete.html
│ │ ├── Edit.html
│ │ ├── List.html
│ │ └── Show.html
│ │ └── Tca
│ │ ├── ShowFormNoteEditForm.html
│ │ └── ShowFormNoteIfNoEmailOrNameSelected.html
└── Public
│ ├── Css
│ ├── Backend.css
│ ├── Basic.css
│ └── Bootstrap.css
│ ├── Demo
│ └── Flot
│ │ └── FlotJs.html
│ ├── Icons
│ ├── Extension.svg
│ ├── powermail.svg
│ ├── relation.gif
│ ├── tx_powermail_domain_model_answer.gif
│ ├── tx_powermail_domain_model_field.gif
│ ├── tx_powermail_domain_model_field__h.gif
│ ├── tx_powermail_domain_model_field__ht.gif
│ ├── tx_powermail_domain_model_field__t.gif
│ ├── tx_powermail_domain_model_form.gif
│ ├── tx_powermail_domain_model_form__h.gif
│ ├── tx_powermail_domain_model_form__ht.gif
│ ├── tx_powermail_domain_model_form__t.gif
│ ├── tx_powermail_domain_model_mail.gif
│ ├── tx_powermail_domain_model_mail__h.gif
│ ├── tx_powermail_domain_model_mail__t.gif
│ ├── tx_powermail_domain_model_page.gif
│ ├── tx_powermail_domain_model_page__h.gif
│ ├── tx_powermail_domain_model_page__ht.gif
│ └── tx_powermail_domain_model_page__t.gif
│ ├── Image
│ ├── chart_form.png
│ ├── chart_form_overview.png
│ ├── chart_function_check.png
│ ├── chart_marketing.png
│ ├── icon-check.png
│ ├── icon-notchecked.png
│ ├── icon_calendar.png
│ ├── icon_csv.gif
│ ├── icon_error.png
│ ├── icon_loading.gif
│ ├── icon_ok.png
│ ├── icon_rss.gif
│ ├── icon_sorting_asc.png
│ ├── icon_sorting_desc.png
│ ├── icon_xls.gif
│ ├── reportingGraphics.bmml
│ └── upload_bg.png
│ └── JavaScript
│ ├── Libraries
│ ├── bootstrap.min.js
│ ├── jquery-ui.min.js
│ ├── jquery.flot.min.js
│ └── jquery.flot.pie.min.js
│ └── Powermail
│ ├── Backend.min.js
│ ├── Form.min.js
│ └── Marketing.min.js
├── composer.json
├── crowdin.yaml
├── ext_conf_template.txt
├── ext_emconf.php
├── ext_localconf.php
├── ext_tables.php
├── ext_tables.sql
├── phpunit.xml.dist
└── rector.php
/.crowdin.yaml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /Resources/Private/Language/
3 | translation: /%original_path%/%two_letters_code%.%original_file_name%
4 |
--------------------------------------------------------------------------------
/.ddev/commands/web/typo3:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # This assumes that the typo3 command will be in the $PATH; if in vendor/bin/ it will be
4 |
5 | ## Description: Run TYPO3 CLI (typo3) command inside the web container
6 | ## Usage: typo3 [args]
7 | ## Example: "ddev typo3 site:list" or "ddev typo3 list" or "ddev typo3 extension:list"
8 | ## ProjectTypes: typo3
9 |
10 | .build/vendor/bin/typo3 "$@"
11 |
--------------------------------------------------------------------------------
/.ddev/docker-compose.browser.yaml:
--------------------------------------------------------------------------------
1 | services:
2 | chrome:
3 | container_name: ddev-${DDEV_SITENAME}-chromedriver
4 | image: seleniarm/standalone-chromium:111.0
5 | restart: "no"
6 | volumes:
7 | - /dev/shm:/dev/shm
8 | external_links:
9 | - ddev-router:$DDEV_HOSTNAME
10 | ports:
11 | - 4444
12 | - "19647:5900"
13 |
--------------------------------------------------------------------------------
/.ddev/docker-compose.typo3.yaml:
--------------------------------------------------------------------------------
1 | services:
2 | web:
3 | environment:
4 | - TYPO3_CONTEXT=Development/DDEV
5 | - TYPO3_PATH_APP=/var/www/html/.build
6 | - MYSQL_DATABASE=db
7 | - MYSQL_PASSWORD=db
8 | - MYSQL_USER=db
9 | - MYSQL_HOST=db
10 | - MAIL_HOST=localhost:1025
11 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Unix-style newlines with a newline ending every file
2 | [*]
3 | charset = utf-8
4 | end_of_line = lf
5 | indent_style = space
6 | indent_size = 4
7 | insert_final_newline = true
8 | trim_trailing_whitespace = true
9 |
10 | # TS/JS-Files
11 | [*.{ts,js}]
12 | indent_size = 2
13 |
14 | # JSON-Files
15 | [*.json]
16 | indent_style = tab
17 |
18 | # ReST-Files
19 | [*.rst]
20 | indent_size = 3
21 | max_line_length = 80
22 |
23 | # YAML-Files
24 | [*.{yaml,yml}]
25 | indent_size = 2
26 |
27 | # package.json
28 | # .travis.yml
29 | [{package.json,.travis.yml}]
30 | indent_size = 2
31 |
32 | # TypoScript
33 | [*.{typoscript,tsconfig}]
34 | indent_size = 2
35 |
36 | # XLF-Files
37 | [*.xlf]
38 | indent_style = tab
39 |
40 | # SQL-Files
41 | [*.sql]
42 | indent_style = tab
43 | indent_size = 2
44 |
45 | # .htaccess
46 | [{_.htaccess,.htaccess}]
47 | indent_style = tab
48 |
--------------------------------------------------------------------------------
/Classes/Command/AbstractCleanupCommand.php:
--------------------------------------------------------------------------------
1 | 0 && (time() - filemtime($file) > $period))) {
31 | $counter++;
32 | unlink($file);
33 | }
34 | }
35 | $output->writeln($counter . ' files removed from your system');
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Classes/Command/FakeRequestTrait.php:
--------------------------------------------------------------------------------
1 | withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE);
20 | $GLOBALS['TYPO3_REQUEST'] = $request;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Classes/Condition/PowermailTypoScriptConditionProvider.php:
--------------------------------------------------------------------------------
1 | expressionLanguageProviders = [
19 | PowermailConditionFunctionsProvider::class,
20 | ];
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Classes/DataProcessor/DataProcessorInterface.php:
--------------------------------------------------------------------------------
1 | getActionMethodName() === 'createAction') {
21 | SessionUtility::saveSessionValuesForPrefill($this->getMail(), $this->getSettings());
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Classes/DataProcessor/UploadDataProcessor.php:
--------------------------------------------------------------------------------
1 | uploadAllFiles();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Classes/Domain/Repository/AbstractRepository.php:
--------------------------------------------------------------------------------
1 | setRespectStoragePage(false);
16 | $this->setDefaultQuerySettings($querySettings);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Classes/Domain/Repository/BackendUserRepository.php:
--------------------------------------------------------------------------------
1 | setRespectStoragePage(false);
17 | $this->setDefaultQuerySettings($querySettings);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Classes/Domain/Repository/UserGroupRepository.php:
--------------------------------------------------------------------------------
1 | dispatch(
26 | GeneralUtility::makeInstance(CustomValidatorEvent::class, $mail, $this)
27 | );
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/Breaker/BreakerInterface.php:
--------------------------------------------------------------------------------
1 | getConfiguration();
21 | $this->checkConfiguration($configuration);
22 | foreach ($this->getMail()->getAnswers() as $answer) {
23 | /** @var $answer Answer */
24 | if ($answer->getValue() === $configuration['value']) {
25 | return true;
26 | }
27 | }
28 | return false;
29 | }
30 |
31 | /**
32 | * @param array $configuration
33 | * @return void
34 | * @throws ConfigurationIsMissingException
35 | */
36 | protected function checkConfiguration(array $configuration): void
37 | {
38 | if (empty($configuration['value'])) {
39 | throw new ConfigurationIsMissingException('No value given to check for', 1516025541289);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/HoneyPodMethod.php:
--------------------------------------------------------------------------------
1 | arguments['field']['__hp']);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/LinkMethod.php:
--------------------------------------------------------------------------------
1 | mail->getAnswers() as $answer) {
20 | if (!is_string($answer->getValue())) {
21 | continue;
22 | }
23 | preg_match_all('@http://|https://|ftp://@', $answer->getValue(), $result);
24 | if (isset($result[0])) {
25 | $linkAmount += count($result[0]);
26 | }
27 | }
28 | return $linkAmount > (int)$this->configuration['linkLimit'];
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/MethodInterface.php:
--------------------------------------------------------------------------------
1 | mail->getAnswers() as $answer) {
33 | if (is_array($answer->getValue())) {
34 | continue;
35 | }
36 | if (in_array($answer->getField()->getMarker(), $keysFirstName)) {
37 | $firstname = $answer->getValue();
38 | }
39 | if (in_array($answer->getField()->getMarker(), $keysLastName)) {
40 | $lastname = $answer->getValue();
41 | }
42 | }
43 | return !empty($firstname) && $firstname === $lastname;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/SessionMethod.php:
--------------------------------------------------------------------------------
1 | mail->getForm()->getUid(),
22 | $this->settings
23 | );
24 | $referrer = $this->arguments['__referrer']['@action'];
25 | return $referrer !== 'optinConfirm' && empty($timeFromSession);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/SpamShield/UniqueMethod.php:
--------------------------------------------------------------------------------
1 | mail->getAnswers() as $answer) {
20 | if (!is_array($answer->getValue()) && $answer->getValue()) {
21 | $answers[] = $answer->getValue();
22 | }
23 | }
24 | return count($answers) !== count(array_unique($answers));
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Classes/Domain/Validator/ValidatorInterface.php:
--------------------------------------------------------------------------------
1 | preview;
20 | }
21 |
22 | public function setPreview(string $preview): void
23 | {
24 | $this->preview = $preview;
25 | }
26 |
27 | public function getItem(): GridColumnItem
28 | {
29 | return $this->item;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Classes/Events/CheckIfMailIsAllowedToSaveEvent.php:
--------------------------------------------------------------------------------
1 | mail = $mail;
25 | }
26 |
27 | /**
28 | * @return Mail
29 | */
30 | public function getMail(): Mail
31 | {
32 | return $this->mail;
33 | }
34 |
35 | public function isSavingOfMailAllowed(): bool
36 | {
37 | return $this->savingOfMailAllowed;
38 | }
39 |
40 | public function setSavingOfMailAllowed(bool $savingOfMailAllowed): void
41 | {
42 | $this->savingOfMailAllowed = $savingOfMailAllowed;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Classes/Events/CustomValidatorEvent.php:
--------------------------------------------------------------------------------
1 | mail = $mail;
28 | $this->customValidator = $customValidator;
29 | }
30 |
31 | /**
32 | * @return Mail
33 | */
34 | public function getMail(): Mail
35 | {
36 | return $this->mail;
37 | }
38 |
39 | /**
40 | * @return CustomValidator
41 | */
42 | public function getCustomValidator(): CustomValidator
43 | {
44 | return $this->customValidator;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Classes/Events/FormControllerConfirmationActionEvent.php:
--------------------------------------------------------------------------------
1 | mail = $mail;
28 | $this->formController = $formController;
29 | }
30 |
31 | /**
32 | * @return Mail
33 | */
34 | public function getMail(): Mail
35 | {
36 | return $this->mail;
37 | }
38 |
39 | /**
40 | * @return FormController
41 | */
42 | public function getFormController(): FormController
43 | {
44 | return $this->formController;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Classes/Events/FormControllerInitializeObjectEvent.php:
--------------------------------------------------------------------------------
1 | settings = $settings;
27 | $this->formController = $formController;
28 | }
29 |
30 | /**
31 | * @return array
32 | */
33 | public function getSettings(): array
34 | {
35 | return $this->settings;
36 | }
37 |
38 | /**
39 | * @param array $settings
40 | * @return FormControllerInitializeObjectEvent
41 | */
42 | public function setSettings(array $settings): FormControllerInitializeObjectEvent
43 | {
44 | $this->settings = $settings;
45 | return $this;
46 | }
47 |
48 | /**
49 | * @return FormController
50 | */
51 | public function getFormController(): FormController
52 | {
53 | return $this->formController;
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Classes/Events/GetNewPathAndFilenameEvent.php:
--------------------------------------------------------------------------------
1 | pathAndFilename = $pathAndFilename;
29 | $this->file = $file;
30 | }
31 |
32 | /**
33 | * @return string
34 | */
35 | public function getPathAndFilename(): string
36 | {
37 | return $this->pathAndFilename;
38 | }
39 |
40 | /**
41 | * @param string $pathAndFilename
42 | * @return GetNewPathAndFilenameEvent
43 | */
44 | public function setPathAndFilename(string $pathAndFilename): GetNewPathAndFilenameEvent
45 | {
46 | $this->pathAndFilename = $pathAndFilename;
47 | return $this;
48 | }
49 |
50 | /**
51 | * @return File
52 | */
53 | public function getFile(): File
54 | {
55 | return $this->file;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Classes/Events/MailRepositoryGetVariablesWithMarkersFromMailEvent.php:
--------------------------------------------------------------------------------
1 | variables = $variables;
29 | $this->mail = $mail;
30 | }
31 |
32 | /**
33 | * @return array
34 | */
35 | public function getVariables(): array
36 | {
37 | return $this->variables;
38 | }
39 |
40 | /**
41 | * @param array $variables
42 | * @return MailRepositoryGetVariablesWithMarkersFromMailEvent
43 | */
44 | public function setVariables(array $variables): MailRepositoryGetVariablesWithMarkersFromMailEvent
45 | {
46 | $this->variables = $variables;
47 | return $this;
48 | }
49 |
50 | /**
51 | * @return Mail
52 | */
53 | public function getMail(): Mail
54 | {
55 | return $this->mail;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Classes/Events/UploadServiceGetFilesEvent.php:
--------------------------------------------------------------------------------
1 | uploadService = $uploadService;
21 | }
22 |
23 | /**
24 | * @return UploadService
25 | */
26 | public function getUploadService(): UploadService
27 | {
28 | return $this->uploadService;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/Events/UploadServicePreflightEvent.php:
--------------------------------------------------------------------------------
1 | uploadService = $uploadService;
21 | }
22 |
23 | /**
24 | * @return UploadService
25 | */
26 | public function getUploadService(): UploadService
27 | {
28 | return $this->uploadService;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/Exception/ClassDoesNotExistException.php:
--------------------------------------------------------------------------------
1 | isFeatureEnabled($arguments['conditionParameters'][0])) {
16 | return true;
17 | }
18 | return false;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Classes/Utility/CsvUtility.php:
--------------------------------------------------------------------------------
1 | setTo([$receiverEmail => '']);
32 | $message->setFrom([$senderEmail => 'Sender']);
33 | $message->setSubject($subject);
34 | $message->text($body);
35 | $message->send();
36 | return $message->isSent();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Classes/Utility/MathematicUtility.php:
--------------------------------------------------------------------------------
1 | findAllWrongLocalizedForms();
25 | return count($forms) === 0;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Be/CheckWrongLocalizedPagesViewHelper.php:
--------------------------------------------------------------------------------
1 | findAllWrongLocalizedPages();
25 | return count($pages) === 0;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Be/ExtMngConfigViewHelper.php:
--------------------------------------------------------------------------------
1 | 2;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Be/IsAdminViewHelper.php:
--------------------------------------------------------------------------------
1 | folder));
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/FileExistsViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('file', 'string', 'Relative path to a file', true);
21 | }
22 |
23 | /**
24 | * @return bool
25 | */
26 | public function render(): bool
27 | {
28 | return file_exists(GeneralUtility::getFileAbsFileName($this->arguments['file']));
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsAllowedToEditViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('mail', Mail::class, 'Mail object', true);
23 | $this->registerArgument('settings', 'array', 'TypoScript settings', false, []);
24 | }
25 |
26 | /**
27 | * Check if logged in User is allowed to edit
28 | *
29 | * @return bool
30 | * @throws DBALException
31 | */
32 | public function render(): bool
33 | {
34 | return FrontendUtility::isAllowedToEdit($this->arguments['settings'], $this->arguments['mail']);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsArrayViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('val', 'string', 'Value');
25 | }
26 |
27 | /**
28 | * @param array $arguments
29 | * @param \Closure $renderChildrenClosure
30 | * @param RenderingContextInterface $renderingContext
31 | *
32 | * @return string
33 | */
34 | public static function renderStatic(
35 | array $arguments,
36 | \Closure $renderChildrenClosure,
37 | RenderingContextInterface $renderingContext
38 | ) {
39 | return is_array($arguments['val']);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsBackendUserAllowedToViewFieldViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('table', 'string', 'Tablename', true);
21 | $this->registerArgument('field', 'string', 'Fieldname', true);
22 | }
23 |
24 | /**
25 | * Check if Backend User is allowed to see this field
26 | *
27 | * @return bool
28 | */
29 | public function render(): bool
30 | {
31 | return BackendUtility::getBackendUserAuthentication()->check(
32 | 'non_exclude_fields',
33 | $this->arguments['table'] . ':' . $this->arguments['field']
34 | );
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsComposerModeViewHelper.php:
--------------------------------------------------------------------------------
1 | isDevelopment();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsImageViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('path', 'string', 'Path', true);
33 | }
34 |
35 | /**
36 | * Check if Path or File is an image
37 | *
38 | * @return bool
39 | */
40 | public function render(): bool
41 | {
42 | $fileInfo = pathinfo($this->arguments['path']);
43 | return in_array($fileInfo['extension'], $this->imageExtensions);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsIpInformationEnabledGloballyViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('val', 'string', 'Value', true);
21 | }
22 |
23 | /**
24 | * @return bool
25 | */
26 | public function render(): bool
27 | {
28 | return StringUtility::isNotEmpty($this->arguments['val']);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsNumberViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('val', 'string', 'Value');
27 | }
28 |
29 | /**
30 | * @param array $arguments
31 | * @param \Closure $renderChildrenClosure
32 | * @param RenderingContextInterface $renderingContext
33 | *
34 | * @return string
35 | */
36 | public static function renderStatic(
37 | array $arguments,
38 | \Closure $renderChildrenClosure,
39 | RenderingContextInterface $renderingContext
40 | ) {
41 | return is_numeric($arguments['val']);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/IsStringInStringViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('haystack', 'string', 'Haystack', true);
20 | $this->registerArgument('needle', 'string', 'Needle', true);
21 | }
22 |
23 | /**
24 | * Check if there is a string in another string
25 | *
26 | * @return bool
27 | */
28 | public function render(): bool
29 | {
30 | return stristr($this->arguments['haystack'], $this->arguments['needle']) !== false;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Condition/OrViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('array', 'array', 'Array with strings', true);
20 | $this->registerArgument('string', 'string', 'String to compare', false, '');
21 | }
22 |
23 | /**
24 | * @return bool
25 | */
26 | public function render(): bool
27 | {
28 | $string = $this->arguments['string'];
29 | foreach ($this->arguments['array'] as $value) {
30 | if (!empty($string) && $value) {
31 | return true;
32 | }
33 | if (!empty($string) && $value === $string) {
34 | return true;
35 | }
36 | }
37 | return false;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Getter/GetDevelopmentContextEmailViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('uid', 'int', 'UID', true);
22 | }
23 |
24 | /**
25 | * get tx_powermail_domain_model_field.title from .uid
26 | *
27 | * @return string
28 | */
29 | public function render(): string
30 | {
31 | $result = '';
32 | $fieldRepository = GeneralUtility::makeInstance(FieldRepository::class);
33 | $field = $fieldRepository->findByUid($this->arguments['uid']);
34 | if (method_exists($field, 'getTitle')) {
35 | $result = $field->getTitle();
36 | }
37 | return $result;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Getter/GetFieldMarkerFromUidViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('uid', 'int', 'UID', true);
22 | }
23 |
24 | /**
25 | * Get tx_powermail_domain_model_field.marker from .uid
26 | *
27 | * @return string
28 | */
29 | public function render(): string
30 | {
31 | $result = '';
32 | $fieldRepository = GeneralUtility::makeInstance(FieldRepository::class);
33 | $field = $fieldRepository->findByUid($this->arguments['uid']);
34 | if (method_exists($field, 'getMarker')) {
35 | $result = $field->getMarker();
36 | }
37 | return $result;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Getter/GetPageNameFromUidViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('uid', 'int', 'UID', false, 0);
22 | }
23 |
24 | /**
25 | * @return string
26 | */
27 | public function render(): string
28 | {
29 | $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
30 | return $pageRepository->getPageNameFromUid((int)$this->arguments['uid']);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Getter/GetPagesWithContentRelatedToFormViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('form', Form::class, 'Form', true);
23 | }
24 |
25 | /**
26 | * Get Pages with contents which are related to a tt_content-powermail-plugin
27 | *
28 | * @return array
29 | */
30 | public function render(): array
31 | {
32 | $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
33 | return $pageRepository->getPagesWithContentRelatedToForm($this->arguments['form']);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Misc/BackendEditLinkViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('tableName', 'string', 'tableName', true);
22 | $this->registerArgument('identifier', 'int', 'identifier', true);
23 | $this->registerArgument('addReturnUrl', 'bool', 'addReturnUrl', false, true);
24 | }
25 |
26 | /**
27 | * @return string
28 | * @throws RouteNotFoundException
29 | */
30 | public function render(): string
31 | {
32 | return BackendUtility::createEditUri(
33 | $this->arguments['tableName'],
34 | (int)$this->arguments['identifier'],
35 | $this->arguments['addReturnUrl']
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Misc/ContentElementViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('uid', 'int', 'tt_content.uid', true);
27 | }
28 |
29 | /**
30 | * Parse a content element
31 | *
32 | * @return string
33 | */
34 | public function render(): string
35 | {
36 | $contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
37 | $configuration = [
38 | 'tables' => 'tt_content',
39 | 'source' => (int)$this->arguments['uid'],
40 | 'dontCheckPid' => 1,
41 | ];
42 | return $contentObject->cObjGetSingle('RECORDS', $configuration);
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Misc/MorestepClassViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('activate', 'bool', 'Activate', true);
20 | $this->registerArgument('class', 'string', 'classname', false, 'powermail_morestep');
21 | }
22 |
23 | /**
24 | * @return string
25 | */
26 | public function render(): string
27 | {
28 | if (!empty($this->arguments['activate'])) {
29 | return $this->arguments['class'];
30 | }
31 | return '';
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/EncodeViewHelper.php:
--------------------------------------------------------------------------------
1 | renderChildren());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/EscapeLabelsViewHelper.php:
--------------------------------------------------------------------------------
1 | renderChildren();
34 | if ($this->isHtmlEnabled() === false) {
35 | $string = htmlspecialchars($string);
36 | }
37 | return $string;
38 | }
39 |
40 | /**
41 | * @return bool
42 | */
43 | protected function isHtmlEnabled(): bool
44 | {
45 | $configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
46 | $settings = $configurationService->getTypoScriptSettings();
47 | return ($settings['misc']['htmlForLabels'] ?? '') === '1';
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/ExplodeViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('string', 'string', 'Any list (e.g. "a,b,c,d")', false, '');
21 | $this->registerArgument('separator', 'string', 'Separator sign (e.g. ",")', false, ',');
22 | $this->registerArgument('trim', 'bool', 'Should be trimmed?', false, true);
23 | }
24 |
25 | /**
26 | * @return array
27 | */
28 | public function render(): array
29 | {
30 | return GeneralUtility::trimExplode(
31 | $this->arguments['separator'],
32 | $this->arguments['string'],
33 | $this->arguments['trim']
34 | );
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/RemoveQuoteViewHelper.php:
--------------------------------------------------------------------------------
1 | renderChildren());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/SanitizeCsvCellViewHelper.php:
--------------------------------------------------------------------------------
1 | renderChildren());
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/UpperViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('string', 'string', 'Any string', true);
20 | }
21 |
22 | /**
23 | * @return string
24 | */
25 | public function render(): string
26 | {
27 | return ucfirst($this->arguments['string']);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/String/Utf8ToUtf16ViewHelper.php:
--------------------------------------------------------------------------------
1 | renderChildren(), 'UTF-16LE', 'UTF-8');
32 | return $string;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Validation/FieldTypeFromValidationViewHelper.php:
--------------------------------------------------------------------------------
1 | 'email',
20 | 2 => 'url',
21 | 3 => 'tel',
22 | 4 => 'number',
23 | 6 => 'number',
24 | 7 => 'number',
25 | 8 => 'range',
26 | ];
27 |
28 | /**
29 | * @return void
30 | */
31 | public function initializeArguments()
32 | {
33 | parent::initializeArguments();
34 | $this->registerArgument('field', Field::class, 'Field', true);
35 | }
36 |
37 | /**
38 | * @return string
39 | */
40 | public function render(): string
41 | {
42 | /** @var Field $field */
43 | $field = $this->arguments['field'];
44 | if (!$this->isNativeValidationEnabled()) {
45 | return 'text';
46 | }
47 | if (array_key_exists($field->getValidation(), $this->html5InputTypes)) {
48 | return $this->html5InputTypes[$field->getValidation()];
49 | }
50 | return 'text';
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Validation/IsHonepodEnabledViewHelper.php:
--------------------------------------------------------------------------------
1 | getTypoScriptSettings();
24 | return ConfigurationUtility::isValidationEnabled($settings, HoneyPodMethod::class);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/Validation/PasswordValidationDataAttributeViewHelper.php:
--------------------------------------------------------------------------------
1 | isClientValidationEnabled()) {
28 | /** @var Field $field */
29 | $field = $this->arguments['field'];
30 | $additionalAttributes['data-powermail-equalto'] = '#powermail_field_' . $field->getMarker();
31 | $additionalAttributes['data-powermail-equalto-message'] =
32 | LocalizationUtility::translate('validationerror_password');
33 | }
34 |
35 | return $additionalAttributes;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Configuration/Backend/Routes.php:
--------------------------------------------------------------------------------
1 | [
5 | 'path' => '/powermail/list',
6 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::listAction',
7 | ],
8 | 'powermail_formoverview' => [
9 | 'path' => '/powermail/formoverview',
10 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::overviewBeAction',
11 | ],
12 | 'powermail_reportingform' => [
13 | 'path' => '/powermail/reportingform',
14 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::reportingFormBeAction',
15 | ],
16 | 'powermail_reportingmarketing' => [
17 | 'path' => '/powermail/reportingmarketing',
18 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::reportingMarketingBeAction',
19 | ],
20 | 'powermail_functioncheck' => [
21 | 'path' => '/powermail/functioncheck',
22 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::checkBeAction',
23 | ],
24 | 'powermail_downloadfile' => [
25 | 'path' => '/powermail/downloadfile',
26 | 'target' => \In2code\Powermail\Controller\ModuleController::class . '::downloadFile',
27 | ],
28 | ];
29 |
--------------------------------------------------------------------------------
/Configuration/Commands.php:
--------------------------------------------------------------------------------
1 | [
13 | 'class' => ExportCommand::class,
14 | 'schedulable' => true,
15 | ],
16 | 'powermail:resetMarkers' => [
17 | 'class' => ResetMarkersCommand::class,
18 | 'schedulable' => true,
19 | ],
20 | 'powermail:cleanupUploads' => [
21 | 'class' => CleanupUploadsCommand::class,
22 | 'schedulable' => true,
23 | ],
24 | 'powermail:cleanupExports' => [
25 | 'class' => CleanupExportsCommand::class,
26 | 'schedulable' => true,
27 | ],
28 | 'powermail:cleanupUnusedUploads' => [
29 | 'class' => CleanupUnusedUploadsCommand::class,
30 | 'schedulable' => true,
31 | ],
32 | ];
33 |
--------------------------------------------------------------------------------
/Configuration/ExpressionLanguage.php:
--------------------------------------------------------------------------------
1 | [
7 | PowermailTypoScriptConditionProvider::class,
8 | ],
9 | ];
10 |
--------------------------------------------------------------------------------
/Configuration/Extbase/Persistence/Classes.php:
--------------------------------------------------------------------------------
1 | [
12 | 'tableName' => 'fe_users',
13 | ],
14 | UserGroup::class => [
15 | 'tableName' => 'fe_groups',
16 | ],
17 | BackendUser::class => [
18 | 'tableName' => 'be_users',
19 | ],
20 | BackendUserGroup::class => [
21 | 'tableName' => 'be_groups',
22 | ],
23 | ];
24 |
--------------------------------------------------------------------------------
/Configuration/Icons.php:
--------------------------------------------------------------------------------
1 | [
5 | \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class,
6 | 'source' => 'EXT:powermail/Resources/Public/Icons/powermail.svg',
7 | ],
8 | ];
9 |
--------------------------------------------------------------------------------
/Configuration/TCA/Overrides/sys_template.php:
--------------------------------------------------------------------------------
1 | |
13 |
14 | # example: fill checkboxes or multiselect with more values
15 | # category.0 = TEXT
16 | # category.0.value = IT
17 | # category.1 = TEXT
18 | # category.1.value = Real Estate
19 |
20 | # example: fill with value from Field Record
21 | # available: uid, title, type, settings, css, feuserValue, mandatory, marker, pid, prefillValue, senderEmail, senderName, sorting, validation
22 | # comment = TEXT
23 | # comment.field = type
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/Configuration/23_SaveSession.typoscript:
--------------------------------------------------------------------------------
1 | ##################
2 | # Save submitted values in a session to prefill forms for further visits. Define each markername for all forms.
3 | ##################
4 | plugin.tx_powermail.settings.setup {
5 | saveSession {
6 | # EXAMPLE: Method "temporary" means as long as the browser is open. "permanently" could be used together with a frontend-user session. If method is empty, saveSession is deactivated.
7 | # _method = temporary
8 | #
9 | # firstname = TEXT
10 | # firstname.field = firstname
11 | #
12 | # lastname = TEXT
13 | # lastname.field = lastname
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/Configuration/30_Finisher.typoscript:
--------------------------------------------------------------------------------
1 | ##################
2 | # Finisher classes that will be called after submit
3 | ##################
4 | plugin.tx_powermail.settings.setup {
5 | finishers {
6 | # Powermail finishers
7 | 10.class = In2code\Powermail\Finisher\SaveToAnyTableFinisher
8 | 20.class = In2code\Powermail\Finisher\SendParametersFinisher
9 | 100.class = In2code\Powermail\Finisher\RedirectFinisher
10 |
11 | # EXAMPLE: Add your own finishers classes (e.g. if you want to do something with form values by your own: Save into tables, call an API, make your own redirect etc...)
12 | # 1 {
13 | # Classname that should be called with method *Finisher()
14 | # class = Vendor\Ext\Finisher\DoSomethingFinisher
15 |
16 | # optional: Add configuration for your PHP
17 | # config {
18 | # foo = bar
19 |
20 | # fooCObject = TEXT
21 | # fooCObject.value = do something with this text
22 | # }
23 |
24 | # optional: If file will not be loaded from autoloader, add path and it will be called with require_once
25 | # require = fileadmin/powermail/finisher/DoSomethingFinisher.php
26 | # }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/Configuration/31_DataProcessors.typoscript:
--------------------------------------------------------------------------------
1 | ##################
2 | # DataProcessor classes that will be called before the mail object will be persisted and used in mails
3 | ##################
4 | plugin.tx_powermail.settings.setup {
5 | dataProcessors {
6 | # Powermail data processors
7 | 10.class = In2code\Powermail\DataProcessor\UploadDataProcessor
8 | 20.class = In2code\Powermail\DataProcessor\SessionDataProcessor
9 |
10 | # EXAMPLE Add your own data processor classes (e.g. if you want to do something with form values by your own before they are used in powermail to persist or in mails)
11 | # 1 {
12 | # Classname that should be called with method *Finisher()
13 | # class = Vendor\Ext\Finisher\DoSomethingFinisher
14 |
15 | # optional: Add configuration for your PHP
16 | # config {
17 | # foo = bar
18 |
19 | # fooCObject = TEXT
20 | # fooCObject.value = do something with this text
21 | # }
22 |
23 | # optional: If file will not be loaded from autoloader, add path and it will be called with require_once
24 | # require = fileadmin/powermail/finisher/DoSomethingFinisher.php
25 | # }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/Configuration/33_Debug.typoscript:
--------------------------------------------------------------------------------
1 | ##################
2 | # Switch on or off Debug mode
3 | ##################
4 | plugin.tx_powermail.settings.setup {
5 | debug {
6 | # All views: Show Settings from TypoScript, Flexform and Extension Manager
7 | settings = {$plugin.tx_powermail.settings.misc.debugSettings}
8 |
9 | # Create view: Show submitted variables
10 | variables = {$plugin.tx_powermail.settings.misc.debugVariables}
11 |
12 | # Create view: Show complete mail settings
13 | mail = {$plugin.tx_powermail.settings.misc.debugMail}
14 |
15 | # Create view: Show saveToTable array
16 | saveToTable = {$plugin.tx_powermail.settings.misc.debugSaveToTable}
17 |
18 | # Create view: Show spamtest results
19 | spamshield = {$plugin.tx_powermail.settings.misc.debugSpamshield}
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/Configuration/40_Includes.typoscript:
--------------------------------------------------------------------------------
1 | page {
2 | includeJSFooter {
3 | powermailForm = EXT:powermail/Resources/Public/JavaScript/Powermail/Form.min.js
4 | powermailForm.defer = 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Main/setup.typoscript:
--------------------------------------------------------------------------------
1 | @import 'EXT:powermail/Configuration/TypoScript/Main/Configuration/*.typoscript'
2 |
--------------------------------------------------------------------------------
/Configuration/TypoScript/Powermail_Frontend/constants.typoscript:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/in2code-de/powermail/c690974bc691904b9c31bb62fc895970e9905208/Configuration/TypoScript/Powermail_Frontend/constants.typoscript
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BackendUserRights.md:
--------------------------------------------------------------------------------
1 | # Backend User Rights
2 |
3 | ## Introduction
4 |
5 | A backend user without administration rights is not able to manage all fields in a powermail form by default.
6 | Maybe the Plugin looks like:
7 |
8 | 
9 |
10 | ## Solution
11 |
12 | The user is not able to see the powermail fields. The problem is simple to solve.
13 | The admin should have a look into "Page Content: Plugin" and after that into
14 | "Page Content Plugin Options powermail_pi1" in the user or usergroup record.
15 |
16 | 
17 |
18 | 
19 |
20 | After having all access rights, the plugin will look like:
21 |
22 | 
23 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/AjaxSubmit.md:
--------------------------------------------------------------------------------
1 | # AJAX Submit
2 |
3 | If you want to use submit via AJAX, you can enable this in TypoScript Setup (jQuery is needed for AJAX functions)
4 |
5 | `plugin.tx_powermail.settings.setup.misc.ajaxSubmit = 1`
6 |
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/ChangingLabels.md:
--------------------------------------------------------------------------------
1 | # Overwrite Labels and Validation messages
2 |
3 | You can overwrite any label in powermail via TypoScript Setup.
4 | Have a look into locallang.xlf (EXT:powermail/Resources/Private/Language/locallang.xlf) for getting the relevant keys,
5 | that you want to overwrite (e.g. validationerror_mandatory).
6 |
7 | ```
8 | plugin.tx_powermail {
9 | _LOCAL_LANG.default.validationerror_mandatory = Please insert a value
10 | _LOCAL_LANG.de.validationerror_mandatory = Bitte Pflichtfeld ausfüllen
11 | }
12 | ```
13 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/SaveSession.md:
--------------------------------------------------------------------------------
1 | # Save values to a session
2 |
3 | You can save values after a submit to a session.
4 | This could be helpful if a user should not fill out a form field twice.
5 | So a form could be prefilled with values that a user submitted before.
6 |
7 | You can also use TypoScript stdWrap functionallity to manipulate those values.
8 |
9 | See following example:
10 |
11 | ```
12 | plugin.tx_powermail.settings.setup {
13 |
14 | # Save submitted values in a session to prefill forms for further visits. Define each markername for all forms.
15 | saveSession {
16 | # Method "temporary" means as long as the browser is open. "permanently" could be used together with a frontend-user session. If method is empty, saveSession is deactivated.
17 | _method = temporary
18 |
19 | firstname = TEXT
20 | firstname.field = firstname
21 |
22 | lastname = TEXT
23 | lastname.field = lastname
24 | }
25 | }
26 | ```
27 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/SetPidForNewForms.md:
--------------------------------------------------------------------------------
1 | # Set PID for new forms
2 |
3 | Maybe you want to define where new forms should be saved if editors are using the add link in plugin, you can do this
4 | with a bit of page TSConfig.
5 |
6 | 
7 |
8 | ```
9 | # Save new forms on page 123
10 | tx_powermail.flexForm.newFormPid = 123
11 | ```
12 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/TypoScriptConditions.md:
--------------------------------------------------------------------------------
1 | # TypoScript Conditions
2 |
3 | Powermail offers 2 conditions, that could make your live easier
4 |
5 | ## If a powermail form was submitted
6 |
7 | ```
8 | [isPowermailSubmitted()]
9 | // Yes, powermail just submitted, add own stuff
10 | [end]
11 | ```
12 |
13 | ## If a powermail plugin is included into current page
14 |
15 | ```
16 | [isPowermailOnCurrentPage()]
17 | // Powermail plugin Pi1 (Form) is on the current page, add own stuff (include CSS or JS, etc...)
18 | [end]
19 |
20 | [isPowermailOnCurrentPage(['powermail_pi1', 'powermail_pi1'])]
21 | // Any powermail plugin Pi1 (Form) or Pi2 (Powermail Frontend) is on the current page, add own stuff
22 | [end]
23 | ```
24 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/BestPractice/UniqueValues.md:
--------------------------------------------------------------------------------
1 | # Unique Values
2 |
3 | As you may know from powermail 1.x you can enforce that every value of a field should only exist once.
4 | This could be helpful if you want to start a competition with powermail and every email should only saved once.
5 |
6 | ```
7 | plugin.tx_powermail.settings.setup.validation {
8 | unique {
9 | # Enable unique check for {email} - every email must be unique on the page where mails are stored
10 | email = 1
11 |
12 | # Enable a max limit of 3 times for the same entry for {event}
13 | event = 3
14 | }
15 | }
16 | ```
17 |
--------------------------------------------------------------------------------
/Documentation/ForAdministrators/Index.md:
--------------------------------------------------------------------------------
1 | # For administrators
2 |
3 | This chapter describes how you can install and configure powermail on your TYPO3 instance
4 |
5 | * [Installation](Installation.md) (Install powermail the right way)
6 | * [BackendUserRights](BackendUserRights.md) (How to configure powermail for your editors)
7 | * [PowermailFrontend](PowermailFrontend.md) (Powermail can also show mails in a frontend context)
8 | * [SchedulerTasks](SchedulerTasks.md) (Schedulertasks and Commands for administrative tasks)
9 | * [BestPractice](BestPractice.md) (A large best practice chapter for frequently asked tasks)
10 | * [Privacy](Privacy.md) (What about GDPR and privacy in powermail?)
11 | * [Upgrade](Upgrade.md) (Some upgrade notes to powermail)
12 |
--------------------------------------------------------------------------------
/Documentation/ForDevelopers/AddNewFlexFormProperties.md:
--------------------------------------------------------------------------------
1 | # Add new FlexForm properties
2 |
3 | ## Introduction
4 |
5 | If you want to add new fields to the FlexForm in the plugin, you can simply use a bit of Page TSConfig to do this.
6 | Of course you can access values in new fields with `
3 |
4 |
4 |
7 | |
9 | ||
---|---|---|
14 | |
16 |
17 | {value} | 20 |
23 | |
27 |