├── LICENSE.md ├── README.md ├── UPGRADE.md ├── composer.json ├── config ├── backend │ └── base_config.yaml ├── doctrine │ └── model │ │ ├── DoubleOptInSession.orm.xml │ │ ├── FormDefinition.orm.xml │ │ ├── OutputWorkflow.orm.xml │ │ └── OutputWorkflowChannel.orm.xml ├── install │ ├── sql │ │ └── install.sql │ └── translations │ │ ├── admin.csv │ │ └── frontend.csv ├── optional │ ├── config │ │ └── email_checker.yaml │ └── services │ │ ├── disposable_email_domain_checker.yaml │ │ └── email_checker.yaml ├── pimcore │ ├── config.yaml │ ├── routing.yaml │ ├── routing_funnels.yaml │ └── routing_funnels_not_localized.yaml ├── serialization │ ├── DoubleOptInSession.yaml │ ├── File.yaml │ ├── FileStack.yaml │ ├── FormStorageData.yaml │ ├── FunnelActionDefinition.yaml │ ├── FunnelActionElement.yaml │ ├── OutputWorkflowChannel.yaml │ └── OutputWorkflowSignalEvent.yaml ├── services.yaml ├── services │ ├── assembler.yaml │ ├── brick.yaml │ ├── builder.yaml │ ├── conditional_logic │ │ ├── action.yaml │ │ ├── condition.yaml │ │ ├── config.yaml │ │ └── dispatcher.yaml │ ├── controller.yaml │ ├── data_injection.yaml │ ├── double_opt_in │ │ └── services.yaml │ ├── dynamic_choice.yaml │ ├── dynamic_multi_file.yaml │ ├── event.yaml │ ├── event_subscriber.yaml │ ├── factory.yaml │ ├── form_extension.yaml │ ├── forms │ │ └── forms.yaml │ ├── mail_editor │ │ ├── config.yaml │ │ └── widgets.yaml │ ├── maintenance.yaml │ ├── manager.yaml │ ├── output_workflow │ │ ├── api.yaml │ │ ├── channels.yaml │ │ ├── dynamic_object_resolver.yaml │ │ ├── form.yaml │ │ ├── funnel_layers.yaml │ │ └── services.yaml │ ├── repository.yaml │ ├── runtime_data.yaml │ ├── storage_provider.yaml │ ├── stream.yaml │ ├── system.yaml │ ├── transformer │ │ ├── options_transformer.yaml │ │ └── output_input_transformer.yaml │ ├── twig.yaml │ └── validator.yaml └── types │ ├── container_types.yaml │ ├── field_types.yaml │ └── type │ ├── birthday.yaml │ ├── checkbox.yaml │ ├── choice.yaml │ ├── choice_dynamic.yaml │ ├── cloudflare_turnstile.yaml │ ├── country.yaml │ ├── date.yaml │ ├── date_time.yaml │ ├── dynamic_multi_file.yaml │ ├── friendly_captcha.yaml │ ├── hidden.yaml │ ├── html_tag.yaml │ ├── integer.yaml │ ├── math_captcha.yaml │ ├── recaptcha_v3.yaml │ ├── snippet.yaml │ ├── submit.yaml │ ├── text.yaml │ ├── textarea.yaml │ └── time.yaml ├── public ├── css │ ├── admin-editmode.css │ ├── admin.css │ └── fineuploader │ │ ├── continue.gif │ │ ├── edit.gif │ │ ├── fine-uploader-new.min.css │ │ ├── fine-uploader-new.min.css.map │ │ ├── loading.gif │ │ ├── pause.gif │ │ ├── processing.gif │ │ ├── retry.gif │ │ └── trash.gif ├── img │ ├── application_form.svg │ ├── application_form_add.svg │ ├── birthday.svg │ ├── bool.svg │ ├── bool_add.svg │ ├── button.svg │ ├── captcha.svg │ ├── checkbox.svg │ ├── cl_change_value.svg │ ├── cl_constraints_add.svg │ ├── cl_constraints_remove.svg │ ├── cl_element_value.svg │ ├── cl_output_workflow.svg │ ├── cl_success_message.svg │ ├── cl_switch_output_workflow.svg │ ├── cl_toggle_availability.svg │ ├── cl_toggle_class.svg │ ├── cl_toggle_element.svg │ ├── cl_trigger_event.svg │ ├── cloudflare_turnstile.svg │ ├── container.svg │ ├── container_add.svg │ ├── danger.svg │ ├── data_injection.svg │ ├── date.svg │ ├── date_time.svg │ ├── download.svg │ ├── dynamic_multicheck.svg │ ├── elem_add.svg │ ├── fieldset.svg │ ├── fieldset_add.svg │ ├── file.svg │ ├── filter.svg │ ├── filter_add.svg │ ├── formBuilder.svg │ ├── form_configuration.svg │ ├── friendly_captcha.svg │ ├── globe.svg │ ├── grid_attention.svg │ ├── grid_ok.svg │ ├── grid_ok_edit.svg │ ├── grid_unavailable.svg │ ├── help.svg │ ├── hidden.svg │ ├── html.svg │ ├── lock.svg │ ├── mail_editor.svg │ ├── math_captcha.svg │ ├── multicheckbox.svg │ ├── notice.svg │ ├── output_workflow.svg │ ├── output_workflow_add.svg │ ├── output_workflow_channel.svg │ ├── output_workflow_channel_add.svg │ ├── output_workflow_funnel_aware.svg │ ├── ow_apply_data.svg │ ├── ow_channel_api.svg │ ├── ow_channel_api_mapper.svg │ ├── ow_channel_email.svg │ ├── ow_channel_funnel.svg │ ├── ow_channel_object.svg │ ├── password.svg │ ├── picture.svg │ ├── radio.svg │ ├── recaptcha_v3.svg │ ├── reset.svg │ ├── select.svg │ ├── snippet.svg │ ├── stack.svg │ ├── stack_add.svg │ ├── submit.svg │ ├── textarea.svg │ ├── textfield.svg │ └── time.svg └── js │ ├── admin │ └── area.js │ └── extjs │ ├── _form │ ├── config-fields │ │ ├── abstract.js │ │ ├── checkbox.js │ │ ├── href.js │ │ ├── key_value_repeater.js │ │ ├── label.js │ │ ├── numberfield.js │ │ ├── options_repeater.js │ │ ├── select.js │ │ ├── tagfield.js │ │ └── textfield.js │ ├── data-injection │ │ └── expression.js │ ├── form.js │ └── tab │ │ ├── configPanel.js │ │ ├── output-workflow │ │ ├── channel │ │ │ ├── abstractChannel.js │ │ │ ├── api.js │ │ │ ├── email.js │ │ │ ├── funnel.js │ │ │ ├── funnel │ │ │ │ ├── action │ │ │ │ │ ├── abstractAction.js │ │ │ │ │ ├── channelAction.js │ │ │ │ │ ├── disabledAction.js │ │ │ │ │ └── returnToFormAction.js │ │ │ │ ├── funnelActionDispatcher.js │ │ │ │ └── layer │ │ │ │ │ ├── abstractLayer.js │ │ │ │ │ └── dynamicLayoutLayer.js │ │ │ └── object.js │ │ └── outputWorkflowConfigPanel.js │ │ └── outputWorkflowPanel.js │ ├── components │ ├── elements │ │ └── Formbuilder.HrefTextField.js │ ├── formFieldConstraintComponent.js │ ├── formFieldContainerComponent.js │ ├── formImporterComponent.js │ ├── formTypeBuilderComponent.js │ └── successMessageToggleComponent.js │ ├── conditional-logic │ ├── action │ │ ├── abstract.js │ │ ├── changeValue.js │ │ ├── constraintsAdd.js │ │ ├── constraintsRemove.js │ │ ├── successMessage.js │ │ ├── switchOutputWorkflow.js │ │ ├── toggleAvailability.js │ │ ├── toggleClass.js │ │ ├── toggleElement.js │ │ └── triggerEvent.js │ ├── builder.js │ ├── condition │ │ ├── abstract.js │ │ ├── elementValue.js │ │ └── outputWorkflow.js │ └── form.js │ ├── editor │ ├── AbstractFieldComponent.js │ ├── ContainerFieldComponent.js │ └── FieldComponent.js │ ├── eventObserver.js │ ├── extensions │ ├── formApiMappingEditor.js │ ├── formDataMappingEditor │ │ └── formDataMapper.js │ ├── formDoubleOptInData.js │ ├── formMailEditor.js │ ├── formMetaData.js │ ├── formObjectMappingEditor.js │ └── formObjectMappingEditor │ │ ├── formObjectTreeMapper.js │ │ └── worker │ │ ├── fieldCollectionWorker.js │ │ └── relationWorker.js │ ├── plugin.js │ ├── settings.js │ ├── types │ ├── href.js │ ├── keyValueRepeater.js │ └── localizedField.js │ └── vendor │ └── dataObject.js ├── src ├── Assembler │ ├── FormAssembler.php │ └── FunnelActionElementAssembler.php ├── Builder │ ├── ExtJsFormBuilder.php │ └── FrontendFormBuilder.php ├── Configuration │ └── Configuration.php ├── Controller │ ├── Admin │ │ ├── ExportController.php │ │ ├── MailEditorController.php │ │ ├── OutputWorkflowApiController.php │ │ ├── OutputWorkflowController.php │ │ ├── OutputWorkflowFunnelController.php │ │ ├── OutputWorkflowObjectController.php │ │ └── SettingsController.php │ ├── AjaxController.php │ ├── EmailController.php │ └── FunnelController.php ├── DependencyInjection │ ├── CompilerPass │ │ ├── ApiProviderPass.php │ │ ├── ChoiceBuilderPass.php │ │ ├── DataInjectionPass.php │ │ ├── DispatcherPass.php │ │ ├── DynamicMultiFileAdapterPass.php │ │ ├── DynamicObjectResolverPass.php │ │ ├── FieldTransformerPass.php │ │ ├── MailEditorWidgetPass.php │ │ ├── OptionsTransformerPass.php │ │ ├── OutputInputTransformerPass.php │ │ ├── OutputWorkflowChannelPass.php │ │ ├── OutputWorkflowFunnelActionPass.php │ │ ├── OutputWorkflowFunnelLayerPass.php │ │ ├── RuntimeDataProviderPass.php │ │ └── StorageProviderPass.php │ ├── Configuration.php │ └── FormBuilderExtension.php ├── Doctrine │ └── Type │ │ └── FormBuilderFieldsType.php ├── Document │ └── Areabrick │ │ └── Form │ │ ├── Form.php │ │ └── FormDialogBuilder.php ├── DynamicMultiFile │ └── Adapter │ │ ├── DropZoneAdapter.php │ │ ├── DynamicMultiFileAdapterInterface.php │ │ └── FineUploadAdapter.php ├── Event │ ├── BaseSubmissionEvent.php │ ├── DoubleOptInSubmissionEvent.php │ ├── Form │ │ ├── FormTypeOptionsEvent.php │ │ ├── PostSetDataEvent.php │ │ ├── PreSetDataEvent.php │ │ └── PreSubmitEvent.php │ ├── FormAssembleEvent.php │ ├── OutputWorkflow │ │ ├── ChannelSubjectGuardEvent.php │ │ ├── OutputWorkflowSignalEvent.php │ │ └── OutputWorkflowSignalsEvent.php │ └── SubmissionEvent.php ├── EventListener │ ├── Admin │ │ └── AssetListener.php │ └── Core │ │ ├── FunnelFormAssemblingListener.php │ │ ├── FunnelRouteListener.php │ │ ├── MailParamListener.php │ │ └── RequestListener.php ├── EventSubscriber │ ├── FormBuilderSubscriber.php │ ├── SignalStorage │ │ ├── ArraySignalStorage.php │ │ ├── FormDataSignalStorage.php │ │ ├── ProviderAwareStorageInterface.php │ │ └── SignalStorageInterface.php │ └── SignalSubscribeHandler.php ├── Exception │ ├── DoubleOptInException.php │ ├── DoubleOptInUniqueConstraintViolationException.php │ └── OutputWorkflow │ │ ├── GuardChannelException.php │ │ ├── GuardException.php │ │ ├── GuardOutputWorkflowException.php │ │ └── GuardStackedException.php ├── Factory │ ├── FormDataFactory.php │ ├── FormDataFactoryInterface.php │ ├── FormDefinitionFactory.php │ ├── FormDefinitionFactoryInterface.php │ ├── ObjectResolverFactory.php │ ├── ObjectResolverFactoryInterface.php │ ├── OutputWorkflowFactory.php │ └── OutputWorkflowFactoryInterface.php ├── Form │ ├── Admin │ │ └── Type │ │ │ └── OutputWorkflow │ │ │ ├── Channel │ │ │ ├── Api │ │ │ │ ├── DataMappingElementCollectionType.php │ │ │ │ ├── DataMappingElementConfigType.php │ │ │ │ └── FieldConfigType.php │ │ │ ├── ApiChannelType.php │ │ │ ├── EmailChannelType.php │ │ │ ├── Funnel │ │ │ │ ├── Action │ │ │ │ │ ├── FunnelActionCoreConfigType.php │ │ │ │ │ ├── FunnelActionType.php │ │ │ │ │ ├── FunnelActionsCollectionType.php │ │ │ │ │ └── Type │ │ │ │ │ │ ├── ChannelActionType.php │ │ │ │ │ │ ├── DisabledActionType.php │ │ │ │ │ │ └── ReturnToFormActionType.php │ │ │ │ └── Layer │ │ │ │ │ └── DynamicLayoutLayerType.php │ │ │ ├── FunnelChannelType.php │ │ │ ├── Object │ │ │ │ ├── FieldConfigType.php │ │ │ │ ├── ObjectMappingElementCollectionType.php │ │ │ │ ├── ObjectMappingElementConfigType.php │ │ │ │ └── Worker │ │ │ │ │ ├── FieldCollectionWorkerType.php │ │ │ │ │ ├── RelationWorkerType.php │ │ │ │ │ └── Validation │ │ │ │ │ ├── ValidationCollectionType.php │ │ │ │ │ └── ValidationType.php │ │ │ └── ObjectChannelType.php │ │ │ ├── Component │ │ │ ├── FixedCollectionType.php │ │ │ ├── LocalizedValuesCollectionType.php │ │ │ ├── OutputWorkflowChannelChoiceType.php │ │ │ └── PimcoreHrefType.php │ │ │ ├── OutputWorkflowChannelCollectionType.php │ │ │ ├── OutputWorkflowChannelType.php │ │ │ ├── OutputWorkflowCollectionType.php │ │ │ ├── OutputWorkflowType.php │ │ │ └── SuccessManagementType.php │ ├── AdvancedChoiceBuilderInterface.php │ ├── ChoiceBuilderInterface.php │ ├── Data │ │ ├── FormData.php │ │ └── FormDataInterface.php │ ├── DataInjector │ │ ├── DataInjectorInterface.php │ │ └── ExpressionDataInjector.php │ ├── Extension │ │ └── HelpExtension.php │ ├── FormErrorsSerializer.php │ ├── FormErrorsSerializerInterface.php │ ├── FormValuesInputApplier.php │ ├── FormValuesInputApplierInterface.php │ ├── FormValuesOutputApplier.php │ ├── FormValuesOutputApplierInterface.php │ ├── RuntimeData │ │ ├── FormRuntimeDataAllocator.php │ │ ├── FormRuntimeDataAllocatorInterface.php │ │ ├── HeadlessAwareRuntimeDataProviderInterface.php │ │ ├── Provider │ │ │ ├── DoubleOptInSessionDataProvider.php │ │ │ └── RequestDataProvider.php │ │ ├── RuntimeDataCollector.php │ │ └── RuntimeDataProviderInterface.php │ └── Type │ │ ├── CloudflareTurnstileType.php │ │ ├── Container │ │ ├── ContainerType.php │ │ ├── FieldSetContainerType.php │ │ ├── RepeaterContainerType.php │ │ └── Traits │ │ │ └── ContainerTrait.php │ │ ├── ContainerCollectionType.php │ │ ├── DoubleOptInType.php │ │ ├── DynamicChoiceType.php │ │ ├── DynamicFormType.php │ │ ├── DynamicMultiFile │ │ ├── DropZoneType.php │ │ └── FineUploaderType.php │ │ ├── DynamicMultiFileType.php │ │ ├── FriendlyCaptchaType.php │ │ ├── HoneypotType.php │ │ ├── HtmlTagType.php │ │ ├── InstructionsType.php │ │ ├── LayerType.php │ │ ├── MathCaptchaType.php │ │ ├── Recaptcha3Type.php │ │ └── SnippetType.php ├── FormBuilderBundle.php ├── FormBuilderEvents.php ├── MailEditor │ ├── AttributeBag.php │ ├── Parser │ │ ├── PlaceholderParser.php │ │ ├── PlaceholderParserInterface.php │ │ └── TemplateParser │ │ │ ├── InkyParser.php │ │ │ ├── PlainTextParser.php │ │ │ └── TemplateParserInterface.php │ ├── TemplateGenerator.php │ └── Widget │ │ ├── DateWidget.php │ │ ├── DoubleOptInSessionAdditionalDataWidget.php │ │ ├── DoubleOptInSessionEmailWidget.php │ │ ├── FormFieldWidget.php │ │ ├── MailEditorFieldDataWidgetInterface.php │ │ └── MailEditorWidgetInterface.php ├── Maintenance │ ├── CleanUpTask.php │ └── DisposableEmailDomainFetchTask.php ├── Manager │ ├── DoubleOptInManager.php │ ├── FormDefinitionManager.php │ ├── OutputWorkflowManager.php │ ├── PresetManager.php │ └── TemplateManager.php ├── Migrations │ ├── Version20230830183642.php │ ├── Version20230908101855.php │ ├── Version20240628143429.php │ ├── Version20240819150642.php │ ├── Version20240916132702.php │ └── Version20250306140903.php ├── Model │ ├── DoubleOptInSession.php │ ├── DoubleOptInSessionInterface.php │ ├── FieldDefinitionInterface.php │ ├── FormDefinition.php │ ├── FormDefinitionInterface.php │ ├── FormFieldContainerDefinition.php │ ├── FormFieldContainerDefinitionInterface.php │ ├── FormFieldDefinition.php │ ├── FormFieldDefinitionInterface.php │ ├── FormFieldDynamicDefinition.php │ ├── FormFieldDynamicDefinitionInterface.php │ ├── FormStorageData.php │ ├── Fragment │ │ ├── EntityToArrayAwareInterface.php │ │ └── SubFieldsAwareInterface.php │ ├── FunnelActionDefinition.php │ ├── FunnelActionElement.php │ ├── OutputWorkflow.php │ ├── OutputWorkflowChannel.php │ ├── OutputWorkflowChannelInterface.php │ └── OutputWorkflowInterface.php ├── OutputWorkflow │ ├── Channel │ │ ├── Api │ │ │ ├── ApiData.php │ │ │ ├── ApiOutputChannel.php │ │ │ ├── ApiOutputChannelWorker.php │ │ │ └── ApiProviderInterface.php │ │ ├── ChannelContext.php │ │ ├── ChannelContextAwareInterface.php │ │ ├── ChannelInterface.php │ │ ├── ChannelResponseAwareInterface.php │ │ ├── Email │ │ │ ├── EmailOutputChannel.php │ │ │ ├── EmailOutputChannelWorker.php │ │ │ └── Parser │ │ │ │ └── MailParser.php │ │ ├── Funnel │ │ │ ├── Action │ │ │ │ ├── ChannelAction.php │ │ │ │ ├── DisabledAction.php │ │ │ │ ├── FunnelActionElementStack.php │ │ │ │ ├── FunnelActionInterface.php │ │ │ │ └── ReturnToFormAction.php │ │ │ ├── FunnelOutputChannel.php │ │ │ └── Layer │ │ │ │ ├── DynamicLayoutLayer.php │ │ │ │ ├── FunnelLayerData.php │ │ │ │ ├── FunnelLayerInterface.php │ │ │ │ └── VirtualActionDefinitions.php │ │ ├── FunnelAwareChannelInterface.php │ │ ├── Object │ │ │ ├── AbstractObjectResolver.php │ │ │ ├── ExistingObjectResolver.php │ │ │ ├── Helper │ │ │ │ └── FieldCollectionValidationHelper.php │ │ │ ├── NewObjectResolver.php │ │ │ └── ObjectOutputChannel.php │ │ └── Trait │ │ │ └── ChannelContextTrait.php │ ├── DynamicObjectResolver │ │ ├── DynamicObjectResolverInterface.php │ │ └── ObjectByRuntimeDataResolver.php │ ├── FieldTransformerInterface.php │ ├── FormSubmissionFinisher.php │ ├── FormSubmissionFinisherInterface.php │ ├── FunnelData.php │ ├── FunnelWorker.php │ ├── FunnelWorkerData.php │ ├── FunnelWorkerInterface.php │ ├── OutputWorkflowDispatcher.php │ ├── OutputWorkflowDispatcherInterface.php │ ├── OutputWorkflowResolver.php │ ├── OutputWorkflowResolverInterface.php │ ├── SuccessManagementWorker.php │ └── SuccessManagementWorkerInterface.php ├── Registry │ ├── ApiProviderRegistry.php │ ├── ChoiceBuilderRegistry.php │ ├── ConditionalLogicRegistry.php │ ├── DataInjectionRegistry.php │ ├── DispatcherRegistry.php │ ├── DynamicMultiFileAdapterRegistry.php │ ├── DynamicObjectResolverRegistry.php │ ├── FieldTransformerRegistry.php │ ├── FunnelActionRegistry.php │ ├── FunnelLayerRegistry.php │ ├── InputTransformerRegistry.php │ ├── MailEditorWidgetRegistry.php │ ├── OptionsTransformerRegistry.php │ ├── OutputTransformerRegistry.php │ ├── OutputWorkflowChannelRegistry.php │ ├── RuntimeDataProviderRegistry.php │ └── StorageProviderRegistry.php ├── Repository │ ├── DoubleOptInSessionRepository.php │ ├── DoubleOptInSessionRepositoryInterface.php │ ├── FormDefinitionRepository.php │ ├── FormDefinitionRepositoryInterface.php │ ├── OutputWorkflowRepository.php │ └── OutputWorkflowRepositoryInterface.php ├── Resolver │ ├── FormOptionsResolver.php │ └── FunnelDataResolver.php ├── Session │ ├── FlashBagManager.php │ └── FlashBagManagerInterface.php ├── Storage │ ├── SessionStorageProvider.php │ └── StorageProviderInterface.php ├── Stream │ ├── AttachmentStream.php │ ├── AttachmentStreamInterface.php │ ├── File.php │ ├── FileStack.php │ ├── FileStream.php │ └── FileStreamInterface.php ├── Tool │ ├── CloudflareTurnstile │ │ └── Response.php │ ├── CloudflareTurnstileProcessor.php │ ├── CloudflareTurnstileProcessorInterface.php │ ├── FormDependencyLocator.php │ ├── FriendlyCaptcha │ │ └── Response.php │ ├── FriendlyCaptchaProcessor.php │ ├── FriendlyCaptchaProcessorInterface.php │ ├── ImportExportProcessor.php │ ├── Install.php │ ├── LocaleDataMapper.php │ ├── MathCaptchaProcessor.php │ ├── MathCaptchaProcessorInterface.php │ ├── ReCaptcha │ │ └── Response.php │ ├── ReCaptchaProcessor.php │ └── ReCaptchaProcessorInterface.php ├── Transformer │ ├── ChoicesMetaTransformer.php │ ├── ChoicesTransformer.php │ ├── DefaultValueTransformer.php │ ├── DynamicOptionsTransformerInterface.php │ ├── HrefTransformer.php │ ├── Input │ │ └── InputTransformerInterface.php │ ├── OptionsTransformerInterface.php │ ├── Output │ │ ├── CheckboxObjectTransformer.php │ │ ├── ChoiceDataObjectTransformer.php │ │ ├── CountryDataObjectTransformer.php │ │ ├── DateDataObjectTransformer.php │ │ ├── DynamicMultiFileTransformer.php │ │ ├── FallbackTransformer.php │ │ ├── OutputTransformerInterface.php │ │ └── Traits │ │ │ └── ChoiceTargetTransformerTrait.php │ └── Target │ │ ├── TargetAwareData.php │ │ ├── TargetAwareOutputTransformer.php │ │ └── TargetAwareValue.php ├── Twig │ └── Extension │ │ ├── FlashMessageExtension.php │ │ └── StaticFormExtension.php ├── Validation │ └── ConditionalLogic │ │ ├── Dispatcher │ │ ├── Dispatcher.php │ │ └── Module │ │ │ ├── Constraints.php │ │ │ ├── Data │ │ │ ├── ConstraintsData.php │ │ │ ├── DataInterface.php │ │ │ ├── FormTypeClassesData.php │ │ │ ├── SuccessMessageData.php │ │ │ └── SwitchOutputWorkflowData.php │ │ │ ├── FormTypeClasses.php │ │ │ ├── ModuleInterface.php │ │ │ ├── SuccessMessage.php │ │ │ └── SwitchOutputWorkflow.php │ │ ├── Factory │ │ └── DataFactory.php │ │ ├── Processor │ │ └── ConditionalLogicProcessor.php │ │ ├── ReturnStack │ │ ├── FieldReturnStack.php │ │ ├── ReturnStackInterface.php │ │ └── SimpleReturnStack.php │ │ └── Rule │ │ ├── Action │ │ ├── ActionInterface.php │ │ ├── ConstraintsAddAction.php │ │ ├── ConstraintsRemoveAction.php │ │ ├── SuccessMessageAction.php │ │ ├── SwitchOutputWorkflowAction.php │ │ ├── ToggleClassAction.php │ │ └── ToggleElementAction.php │ │ ├── Condition │ │ ├── ConditionInterface.php │ │ ├── ElementValueCondition.php │ │ └── OutputWorkflowCondition.php │ │ └── Traits │ │ ├── ActionTrait.php │ │ └── ConditionTrait.php └── Validator │ ├── Constraints │ ├── CloudflareTurnstile.php │ ├── CloudflareTurnstileValidator.php │ ├── DynamicMultiFileNotBlank.php │ ├── DynamicMultiFileNotBlankValidator.php │ ├── EmailChecker.php │ ├── EmailCheckerValidator.php │ ├── FriendlyCaptcha.php │ ├── FriendlyCaptchaValidator.php │ ├── MathCaptcha.php │ ├── MathCaptchaValidator.php │ ├── Recaptcha3.php │ └── Recaptcha3Validator.php │ └── EmailChecker │ ├── DisposableEmailDomainChecker.php │ ├── EmailCheckerInterface.php │ └── EmailCheckerProcessor.php ├── templates ├── common │ └── redirect_flash_message.html.twig ├── email │ ├── email.html.twig │ └── form_data.html.twig ├── form │ ├── data │ │ └── data_bootstrap_4.html.twig │ ├── default.html.twig │ ├── elements │ │ └── dynamic_multi_file │ │ │ ├── form.html.twig │ │ │ └── form_drop_zone.html.twig │ ├── form.html.twig │ ├── presets │ │ └── demo.html.twig │ └── theme │ │ ├── bootstrap_3_horizontal_layout.html.twig │ │ ├── bootstrap_3_layout.html.twig │ │ ├── bootstrap_4_horizontal_layout.html.twig │ │ ├── bootstrap_4_layout.html.twig │ │ ├── bootstrap_5_horizontal_layout.html.twig │ │ ├── bootstrap_5_layout.html.twig │ │ ├── form_div_layout.html.twig │ │ ├── macro │ │ ├── bootstrap_3_horizontal_layout.html.twig │ │ ├── bootstrap_3_layout.html.twig │ │ ├── bootstrap_4_horizontal_layout.html.twig │ │ ├── bootstrap_4_layout.html.twig │ │ ├── bootstrap_5_horizontal_layout.html.twig │ │ ├── bootstrap_5_layout.html.twig │ │ └── form_div_layout.html.twig │ │ └── type │ │ ├── cloudflare_turnstile.html.twig │ │ ├── container.html.twig │ │ ├── dynamic_multi_file.html.twig │ │ ├── friendly_captcha.html.twig │ │ ├── html_tag.html.twig │ │ ├── instructions.html.twig │ │ └── snippet.html.twig ├── funnel │ ├── base.html.twig │ ├── error.html.twig │ └── layer │ │ └── simple_layout_layer.html.twig ├── layout.html.twig └── layout_funnel.html.twig └── translations ├── admin.de.yml └── admin.en.yml /config/optional/config/email_checker.yaml: -------------------------------------------------------------------------------- 1 | flysystem: 2 | storages: 3 | form_builder.email_checker.storage: 4 | adapter: 'local' 5 | options: 6 | directory: '%kernel.project_dir%/var/tmp/form-builder-email-checker' 7 | 8 | form_builder: 9 | validation_constraints: 10 | email_checker: 11 | class: FormBuilderBundle\Validator\Constraints\EmailChecker 12 | label: 'form_builder_validation_constraint.email_checker' 13 | icon_class: form_builder_icon_validation -------------------------------------------------------------------------------- /config/optional/services/disposable_email_domain_checker.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Validator\EmailChecker\DisposableEmailDomainChecker: 9 | tags: 10 | - { name: form_builder.validator.email_checker } 11 | 12 | FormBuilderBundle\Maintenance\DisposableEmailDomainFetchTask: 13 | arguments: 14 | $logger: '@form_builder.application_logger.email_checker_logger' 15 | tags: 16 | - {name: pimcore.maintenance.task, type: formbuilder_email_checker_disposable_email_domain_fetch } -------------------------------------------------------------------------------- /config/optional/services/email_checker.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | form_builder.application_logger.email_checker_logger: 4 | public: true 5 | class: Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger 6 | calls: 7 | - [addWriter, ['@Pimcore\Bundle\ApplicationLoggerBundle\Handler\ApplicationLoggerDb']] 8 | - [setComponent, ['form_builder_email_checker']] -------------------------------------------------------------------------------- /config/pimcore/routing_funnels.yaml: -------------------------------------------------------------------------------- 1 | # Frontend Routing 2 | form_builder.controller.funnel.dispatch: 3 | path: /{_locale}/fb/funnel/{funnelId}/{channelId}/{storageToken} 4 | controller: FormBuilderBundle\Controller\FunnelController::dispatchAction 5 | methods: [POST, GET] -------------------------------------------------------------------------------- /config/pimcore/routing_funnels_not_localized.yaml: -------------------------------------------------------------------------------- 1 | # Frontend Routing 2 | form_builder.controller.funnel.dispatch: 3 | path: /fb/funnel/{funnelId}/{channelId}/{storageToken} 4 | controller: FormBuilderBundle\Controller\FunnelController::dispatchAction 5 | methods: [POST, GET] -------------------------------------------------------------------------------- /config/serialization/DoubleOptInSession.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Model\DoubleOptInSession: 2 | attributes: 3 | token: 4 | groups: [ Default, ExtJs ] 5 | formDefinition: 6 | groups: [ Default ] 7 | email: 8 | groups: [ Default, ExtJs ] 9 | additionalData: 10 | groups: [ Default, ExtJs ] 11 | dispatchLocation: 12 | groups: [ Default, ExtJs ] 13 | applied: 14 | groups: [ Default, ExtJs ] 15 | creationDate: 16 | groups: [ Default, ExtJs ] 17 | -------------------------------------------------------------------------------- /config/serialization/File.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Stream\File: 2 | attributes: 3 | id: 4 | groups: [Default, OutputWorkflow] 5 | name: 6 | groups: [Default, OutputWorkflow] 7 | path: 8 | groups: [Default, OutputWorkflow] 9 | -------------------------------------------------------------------------------- /config/serialization/FileStack.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Stream\FileStack: 2 | attributes: 3 | files: 4 | groups: [Default, OutputWorkflow] 5 | -------------------------------------------------------------------------------- /config/serialization/FormStorageData.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Model\FormStorageData: 2 | attributes: 3 | formId: 4 | groups: [Default, OutputWorkflow] 5 | formData: 6 | groups: [Default, OutputWorkflow] 7 | formRuntimeData: 8 | groups: [Default, OutputWorkflow] 9 | funnelRuntimeData: 10 | groups: [Default, OutputWorkflow] 11 | initiationPath: 12 | groups: [Default, OutputWorkflow] 13 | funnelErrors: 14 | groups: [Default, OutputWorkflow] 15 | attachmentSignals: 16 | groups: [Default, OutputWorkflow] -------------------------------------------------------------------------------- /config/serialization/FunnelActionDefinition.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Model\FunnelActionDefinition: 2 | attributes: 3 | name: 4 | groups: [Default, ExtJs, FunnelOutput] 5 | label: 6 | groups: [Default, ExtJs, FunnelOutput] 7 | parameters: 8 | groups: [Default, ExtJs, FunnelOutput] 9 | -------------------------------------------------------------------------------- /config/serialization/FunnelActionElement.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Model\FunnelActionElement: 2 | attributes: 3 | path: 4 | groups: [Default, FunnelOutput] 5 | subject: 6 | groups: [Default] 7 | isChannelAware: 8 | groups: [Default, FunnelOutput] 9 | isDisabled: 10 | groups: [Default, FunnelOutput] 11 | funnelActionDefinition: 12 | groups: [Default, FunnelOutput] 13 | -------------------------------------------------------------------------------- /config/serialization/OutputWorkflowChannel.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Model\OutputWorkflowChannel: 2 | attributes: 3 | id: 4 | groups: [Default, ExtJs] 5 | type: 6 | groups: [Default, ExtJs] 7 | name: 8 | groups: [Default, ExtJs] 9 | configuration: 10 | groups: [Default, ExtJs] 11 | funnelActions: 12 | groups: [Default, ExtJs] 13 | outputWorkflow: 14 | groups: [Default] 15 | -------------------------------------------------------------------------------- /config/serialization/OutputWorkflowSignalEvent.yaml: -------------------------------------------------------------------------------- 1 | FormBuilderBundle\Event\OutputWorkflow\OutputWorkflowSignalEvent: 2 | attributes: 3 | name: 4 | groups: [Default, OutputWorkflow] 5 | data: 6 | groups: [Default, OutputWorkflow] 7 | -------------------------------------------------------------------------------- /config/services.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: services/conditional_logic/*.yaml } 3 | - { resource: services/mail_editor/*.yaml } 4 | - { resource: services/output_workflow/*.yaml } 5 | - { resource: services/forms/*.yaml } 6 | - { resource: services/transformer/*.yaml } 7 | - { resource: services/*.yaml } -------------------------------------------------------------------------------- /config/services/assembler.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Assembler\FormAssembler: ~ 9 | FormBuilderBundle\Assembler\FunnelActionElementAssembler: ~ -------------------------------------------------------------------------------- /config/services/brick.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Document\Areabrick\Form\FormDialogBuilder: 9 | arguments: 10 | $translator: '@Pimcore\Bundle\AdminBundle\Translation\AdminUserTranslator' 11 | 12 | FormBuilderBundle\Document\Areabrick\Form\Form: 13 | tags: 14 | - { name: pimcore.area.brick, id: formbuilder_form } -------------------------------------------------------------------------------- /config/services/builder.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # form builder 9 | FormBuilderBundle\Builder\FrontendFormBuilder: ~ 10 | 11 | # backend form builder 12 | FormBuilderBundle\Builder\ExtJsFormBuilder: 13 | arguments: 14 | $translator: '@Pimcore\Bundle\AdminBundle\Translation\AdminUserTranslator' 15 | 16 | # form values output applier 17 | FormBuilderBundle\Form\FormValuesOutputApplier: ~ 18 | FormBuilderBundle\Form\FormValuesOutputApplierInterface: '@FormBuilderBundle\Form\FormValuesOutputApplier' 19 | 20 | # form values input applier 21 | FormBuilderBundle\Form\FormValuesInputApplier: ~ 22 | FormBuilderBundle\Form\FormValuesInputApplierInterface: '@FormBuilderBundle\Form\FormValuesInputApplier' 23 | 24 | # error serializer 25 | FormBuilderBundle\Form\FormErrorsSerializer: ~ 26 | FormBuilderBundle\Form\FormErrorsSerializerInterface: '@FormBuilderBundle\Form\FormErrorsSerializer' -------------------------------------------------------------------------------- /config/services/conditional_logic/action.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\ConstraintsAddAction: ~ 9 | 10 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\ConstraintsRemoveAction: ~ 11 | 12 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\ToggleClassAction: ~ 13 | 14 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\ToggleElementAction: ~ 15 | 16 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\SwitchOutputWorkflowAction: ~ 17 | 18 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\SuccessMessageAction: ~ -------------------------------------------------------------------------------- /config/services/conditional_logic/condition.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Condition\ElementValueCondition: ~ 9 | 10 | FormBuilderBundle\Validation\ConditionalLogic\Rule\Condition\OutputWorkflowCondition: ~ -------------------------------------------------------------------------------- /config/services/conditional_logic/config.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # registry: action and condition classes 9 | FormBuilderBundle\Registry\ConditionalLogicRegistry: 10 | arguments: 11 | $actionInterface: 'FormBuilderBundle\Validation\ConditionalLogic\Rule\Action\ActionInterface' 12 | $conditionInterface: 'FormBuilderBundle\Validation\ConditionalLogic\Rule\Condition\ConditionInterface' 13 | 14 | FormBuilderBundle\Validation\ConditionalLogic\Processor\ConditionalLogicProcessor: ~ 15 | 16 | # registry: action and condition classes 17 | FormBuilderBundle\Registry\DispatcherRegistry: ~ 18 | 19 | FormBuilderBundle\Validation\ConditionalLogic\Dispatcher\Dispatcher: ~ -------------------------------------------------------------------------------- /config/services/controller.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | FormBuilderBundle\Controller\: 4 | resource: '../../src/Controller' 5 | public: true 6 | autowire: true 7 | autoconfigure: true 8 | tags: ['controller.service_arguments'] 9 | -------------------------------------------------------------------------------- /config/services/data_injection.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Registry\DataInjectionRegistry: ~ 9 | 10 | FormBuilderBundle\Form\DataInjector\ExpressionDataInjector: 11 | tags: 12 | - { name: form_builder.data_injector, identifier: expression } 13 | -------------------------------------------------------------------------------- /config/services/double_opt_in/services.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\MailEditor\Widget\DoubleOptInSessionEmailWidget: 9 | tags: 10 | - { name: form_builder.mail_editor.widget, type: double_opt_in_session_email } 11 | 12 | FormBuilderBundle\MailEditor\Widget\DoubleOptInSessionAdditionalDataWidget: 13 | tags: 14 | - { name: form_builder.mail_editor.widget, type: double_opt_in_session_additional_data } -------------------------------------------------------------------------------- /config/services/dynamic_choice.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # registry 9 | FormBuilderBundle\Registry\ChoiceBuilderRegistry: ~ -------------------------------------------------------------------------------- /config/services/dynamic_multi_file.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # registry 9 | FormBuilderBundle\Registry\DynamicMultiFileAdapterRegistry: ~ 10 | 11 | # adapter 12 | FormBuilderBundle\DynamicMultiFile\Adapter\FineUploadAdapter: 13 | tags: 14 | - { name: form_builder.dynamic_multi_file.adapter } 15 | 16 | FormBuilderBundle\DynamicMultiFile\Adapter\DropZoneAdapter: 17 | tags: 18 | - { name: form_builder.dynamic_multi_file.adapter } 19 | 20 | # forms 21 | FormBuilderBundle\Form\Type\DynamicMultiFile\FineUploaderType: 22 | public: false 23 | arguments: 24 | - '@translator' 25 | tags: 26 | - { name: form.type } 27 | 28 | FormBuilderBundle\Form\Type\DynamicMultiFile\DropZoneType: 29 | public: false 30 | arguments: 31 | - '@translator' 32 | tags: 33 | - { name: form.type } 34 | -------------------------------------------------------------------------------- /config/services/event.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\EventSubscriber\FormBuilderSubscriber: 9 | tags: 10 | - { name: kernel.event_subscriber } 11 | 12 | FormBuilderBundle\EventListener\Core\RequestListener: 13 | tags: 14 | - { name: kernel.event_subscriber } 15 | 16 | FormBuilderBundle\EventListener\Core\MailParamListener: 17 | tags: 18 | - { name: kernel.event_subscriber } 19 | 20 | FormBuilderBundle\EventListener\Core\FunnelRouteListener: 21 | tags: 22 | - { name: kernel.event_subscriber } 23 | 24 | FormBuilderBundle\EventListener\Core\FunnelFormAssemblingListener: 25 | tags: 26 | - { name: kernel.event_subscriber } 27 | 28 | FormBuilderBundle\EventListener\Admin\AssetListener: 29 | tags: 30 | - { name: kernel.event_subscriber } -------------------------------------------------------------------------------- /config/services/event_subscriber.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # alias for form builder subscriber. 9 | FormBuilderBundle\EventSubscriber\FormBuilderSubscriber: ~ -------------------------------------------------------------------------------- /config/services/factory.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Factory\FormDataFactoryInterface: '@FormBuilderBundle\Factory\FormDataFactory' 9 | FormBuilderBundle\Factory\FormDataFactory: ~ 10 | 11 | FormBuilderBundle\Factory\FormDefinitionFactoryInterface: 12 | alias: FormBuilderBundle\Factory\FormDefinitionFactory 13 | public: true 14 | 15 | FormBuilderBundle\Factory\FormDefinitionFactory: ~ 16 | 17 | FormBuilderBundle\Factory\OutputWorkflowFactoryInterface: '@FormBuilderBundle\Factory\OutputWorkflowFactory' 18 | FormBuilderBundle\Factory\OutputWorkflowFactory: ~ 19 | 20 | FormBuilderBundle\Factory\ObjectResolverFactoryInterface: '@FormBuilderBundle\Factory\ObjectResolverFactory' 21 | FormBuilderBundle\Factory\ObjectResolverFactory: ~ -------------------------------------------------------------------------------- /config/services/form_extension.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | FormBuilderBundle\Form\Extension\HelpExtension: 3 | tags: 4 | - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType } -------------------------------------------------------------------------------- /config/services/mail_editor/widgets.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\MailEditor\Widget\FormFieldWidget: 9 | tags: 10 | - { name: form_builder.mail_editor.widget, type: fb_field } 11 | 12 | FormBuilderBundle\MailEditor\Widget\DateWidget: 13 | tags: 14 | - { name: form_builder.mail_editor.widget, type: date } -------------------------------------------------------------------------------- /config/services/maintenance.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Maintenance\CleanUpTask: 9 | tags: 10 | - {name: pimcore.maintenance.task, type: formbuilder_clean_up } -------------------------------------------------------------------------------- /config/services/manager.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | # manager: form definition 9 | FormBuilderBundle\Manager\FormDefinitionManager: ~ 10 | 11 | # manager: output workflow 12 | FormBuilderBundle\Manager\OutputWorkflowManager: ~ 13 | 14 | # manager: preset 15 | FormBuilderBundle\Manager\PresetManager: ~ 16 | 17 | # manager: template (form themes, type templates) 18 | FormBuilderBundle\Manager\TemplateManager: ~ 19 | 20 | # manager: double-opt-in 21 | FormBuilderBundle\Manager\DoubleOptInManager: ~ -------------------------------------------------------------------------------- /config/services/output_workflow/api.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Registry\ApiProviderRegistry: ~ -------------------------------------------------------------------------------- /config/services/output_workflow/channels.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\OutputWorkflow\Channel\Email\EmailOutputChannelWorker: ~ 9 | FormBuilderBundle\OutputWorkflow\Channel\Email\EmailOutputChannel: 10 | tags: 11 | - { name: form_builder.output_workflow.channel, type: email } 12 | 13 | FormBuilderBundle\OutputWorkflow\Channel\Email\Parser\MailParser: 14 | shared: false 15 | 16 | FormBuilderBundle\OutputWorkflow\Channel\Object\ObjectOutputChannel: 17 | tags: 18 | - { name: form_builder.output_workflow.channel, type: object } 19 | 20 | FormBuilderBundle\OutputWorkflow\Channel\Api\ApiOutputChannelWorker: ~ 21 | FormBuilderBundle\OutputWorkflow\Channel\Api\ApiOutputChannel: 22 | tags: 23 | - { name: form_builder.output_workflow.channel, type: api } 24 | 25 | FormBuilderBundle\OutputWorkflow\Channel\Funnel\FunnelOutputChannel: 26 | tags: 27 | - { name: form_builder.output_workflow.channel, type: funnel } -------------------------------------------------------------------------------- /config/services/output_workflow/dynamic_object_resolver.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Registry\DynamicObjectResolverRegistry: ~ -------------------------------------------------------------------------------- /config/services/output_workflow/funnel_layers.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\OutputWorkflow\Channel\Funnel\Layer\DynamicLayoutLayer: 9 | tags: 10 | - { name: form_builder.output_workflow.funnel_layer, type: dynamicLayout } 11 | 12 | FormBuilderBundle\OutputWorkflow\Channel\Funnel\Action\ChannelAction: 13 | tags: 14 | - { name: form_builder.output_workflow.funnel_action, type: channelAction } 15 | 16 | FormBuilderBundle\OutputWorkflow\Channel\Funnel\Action\ReturnToFormAction: 17 | tags: 18 | - { name: form_builder.output_workflow.funnel_action, type: returnToFormAction } 19 | 20 | FormBuilderBundle\OutputWorkflow\Channel\Funnel\Action\DisabledAction: 21 | tags: 22 | - { name: form_builder.output_workflow.funnel_action, type: disabledAction } 23 | -------------------------------------------------------------------------------- /config/services/repository.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Repository\FormDefinitionRepositoryInterface: '@FormBuilderBundle\Repository\FormDefinitionRepository' 9 | FormBuilderBundle\Repository\FormDefinitionRepository: ~ 10 | 11 | FormBuilderBundle\Repository\OutputWorkflowRepositoryInterface: '@FormBuilderBundle\Repository\OutputWorkflowRepository' 12 | FormBuilderBundle\Repository\OutputWorkflowRepository: ~ 13 | 14 | FormBuilderBundle\Repository\DoubleOptInSessionRepositoryInterface: '@FormBuilderBundle\Repository\DoubleOptInSessionRepository' 15 | FormBuilderBundle\Repository\DoubleOptInSessionRepository: ~ -------------------------------------------------------------------------------- /config/services/runtime_data.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Registry\RuntimeDataProviderRegistry: ~ 9 | 10 | FormBuilderBundle\Form\RuntimeData\FormRuntimeDataAllocator: ~ 11 | FormBuilderBundle\Form\RuntimeData\FormRuntimeDataAllocatorInterface: '@FormBuilderBundle\Form\RuntimeData\FormRuntimeDataAllocator' 12 | 13 | FormBuilderBundle\Form\RuntimeData\Provider\DoubleOptInSessionDataProvider: 14 | tags: 15 | - { name: form_builder.runtime_data_provider } 16 | -------------------------------------------------------------------------------- /config/services/storage_provider.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | FormBuilderBundle\Registry\StorageProviderRegistry: ~ 9 | 10 | FormBuilderBundle\Storage\SessionStorageProvider: 11 | tags: 12 | - { name: form_builder.storage_provider } 13 | -------------------------------------------------------------------------------- /config/services/stream.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: true 7 | 8 | # stream: files 9 | FormBuilderBundle\Stream\FileStreamInterface: '@FormBuilderBundle\Stream\FileStream' 10 | FormBuilderBundle\Stream\FileStream: ~ 11 | 12 | # stream: attachment 13 | FormBuilderBundle\Stream\AttachmentStreamInterface: '@FormBuilderBundle\Stream\AttachmentStream' 14 | FormBuilderBundle\Stream\AttachmentStream: 15 | tags: 16 | - { name: kernel.event_listener, event: !php/const FormBuilderBundle\FormBuilderEvents::OUTPUT_WORKFLOW_SIGNALS, method: cleanUp } -------------------------------------------------------------------------------- /config/services/transformer/options_transformer.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Registry\OptionsTransformerRegistry: 9 | arguments: 10 | $optionsInterface: 'FormBuilderBundle\Transformer\OptionsTransformerInterface' 11 | $dynamicOptionsInterface: 'FormBuilderBundle\Transformer\DynamicOptionsTransformerInterface' 12 | 13 | FormBuilderBundle\Transformer\ChoicesTransformer: 14 | tags: 15 | - { name: form_builder.transformer.options } 16 | 17 | FormBuilderBundle\Transformer\DefaultValueTransformer: 18 | tags: 19 | - { name: form_builder.transformer.options } 20 | 21 | FormBuilderBundle\Transformer\HrefTransformer: 22 | tags: 23 | - { name: form_builder.transformer.options } 24 | 25 | FormBuilderBundle\Transformer\ChoicesMetaTransformer: 26 | tags: 27 | - { name: form_builder.transformer.dynamic_options } 28 | -------------------------------------------------------------------------------- /config/services/twig.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | _defaults: 4 | autowire: true 5 | autoconfigure: true 6 | public: false 7 | 8 | FormBuilderBundle\Twig\Extension\StaticFormExtension: 9 | tags: 10 | - { name: twig.extension } 11 | 12 | FormBuilderBundle\Twig\Extension\FlashMessageExtension: 13 | tags: 14 | - { name: twig.extension } -------------------------------------------------------------------------------- /config/types/field_types.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: type/*.yaml } -------------------------------------------------------------------------------- /config/types/type/hidden.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | hidden: 4 | class: Symfony\Component\Form\Extension\Core\Type\HiddenType 5 | backend: 6 | form_type_group: hidden_fields 7 | label: 'form_builder_type.hidden_type' 8 | icon_class: 'form_builder_icon_hidden' 9 | constraints: false 10 | output_workflow: 11 | object: 12 | allowed_class_types: 13 | - manyToOneRelation 14 | - manyToManyRelation 15 | - input 16 | - textarea 17 | - wysiwyg 18 | fields: 19 | options.value: ~ 20 | options.help_text: ~ -------------------------------------------------------------------------------- /config/types/type/html_tag.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | html_tag: 4 | class: FormBuilderBundle\Form\Type\HtmlTagType 5 | backend: 6 | form_type_group: other_fields 7 | label: 'form_builder_type.html_tag_type' 8 | icon_class: 'form_builder_icon_html_tag' 9 | constraints: false 10 | fields: 11 | optional.email_label: ~ 12 | options.help_text: ~ 13 | options.data: ~ 14 | options.value: ~ 15 | options.tag: 16 | display_group_id: attributes 17 | type: select 18 | label: 'form_builder_type_field.tag_element' 19 | config: 20 | options: '%form_builder_html_tag_elements%' -------------------------------------------------------------------------------- /config/types/type/integer.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | integer: 4 | class: Symfony\Component\Form\Extension\Core\Type\IntegerType 5 | backend: 6 | form_type_group: text_fields 7 | label: 'form_builder_type.integer_type' 8 | icon_class: 'form_builder_icon_integer' 9 | constraints: 10 | disabled: 11 | - 'dynamic_multi_file_not_blank' 12 | output_workflow: 13 | object: 14 | allowed_class_types: 15 | - manyToOneRelation 16 | - manyToManyRelation 17 | - input 18 | - textarea 19 | - wysiwyg 20 | - numeric 21 | - slider 22 | fields: 23 | options.value: ~ -------------------------------------------------------------------------------- /config/types/type/recaptcha_v3.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | recaptcha_v3: 4 | class: FormBuilderBundle\Form\Type\Recaptcha3Type 5 | backend: 6 | form_type_group: security_fields 7 | label: 'form_builder_type.recaptcha_v3' 8 | icon_class: 'form_builder_icon_recaptcha_v3' 9 | constraints: false 10 | fields: 11 | optional.email_label: ~ 12 | options.help_text: ~ 13 | options.data: ~ 14 | options.value: ~ 15 | options.action_name: 16 | display_group_id: attributes 17 | type: textfield 18 | label: 'form_builder_type_field.recaptcha_v3.action_name' 19 | config: 20 | default_value: 'homepage' -------------------------------------------------------------------------------- /config/types/type/snippet.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | snippet: 4 | class: FormBuilderBundle\Form\Type\SnippetType 5 | backend: 6 | form_type_group: other_fields 7 | label: 'form_builder_type.snippet_type' 8 | icon_class: 'form_builder_icon_snippet_tag' 9 | constraints: false 10 | fields: 11 | optional.email_label: ~ 12 | options.help_text: ~ 13 | options.data: ~ 14 | options.value: ~ 15 | options.path: 16 | display_group_id: attributes 17 | type: href 18 | label: 'form_builder_type_field.snippet_path' 19 | options_transformer: FormBuilderBundle\Transformer\HrefTransformer 20 | config: 21 | types: 22 | - 'document' 23 | subtypes: 24 | document: 25 | - 'snippet' -------------------------------------------------------------------------------- /config/types/type/submit.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | submit: 4 | class: Symfony\Component\Form\Extension\Core\Type\SubmitType 5 | backend: 6 | form_type_group: buttons 7 | label: 'form_builder_type.submit_type' 8 | icon_class: 'form_builder_icon_button' 9 | constraints: false 10 | fields: 11 | optional.email_label: ~ 12 | options.help_text: ~ 13 | options.data: ~ 14 | options.value: ~ -------------------------------------------------------------------------------- /config/types/type/text.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | text: 4 | class: Symfony\Component\Form\Extension\Core\Type\TextType 5 | backend: 6 | form_type_group: text_fields 7 | label: 'form_builder_type.text_type' 8 | icon_class: 'form_builder_icon_text' 9 | constraints: 10 | disabled: 11 | - 'dynamic_multi_file_not_blank' 12 | output_workflow: 13 | object: 14 | allowed_class_types: 15 | - input 16 | - textarea 17 | - wysiwyg 18 | - firstname 19 | - lastname 20 | - email 21 | fields: 22 | options.value: ~ -------------------------------------------------------------------------------- /config/types/type/textarea.yaml: -------------------------------------------------------------------------------- 1 | form_builder: 2 | types: 3 | textarea: 4 | class: Symfony\Component\Form\Extension\Core\Type\TextareaType 5 | backend: 6 | form_type_group: text_fields 7 | label: 'form_builder_type.textarea_type' 8 | icon_class: 'form_builder_icon_textarea' 9 | constraints: 10 | disabled: 11 | - 'dynamic_multi_file_not_blank' 12 | output_workflow: 13 | object: 14 | allowed_class_types: 15 | - textarea 16 | - wysiwyg 17 | fields: 18 | options.value: ~ 19 | -------------------------------------------------------------------------------- /public/css/fineuploader/continue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/continue.gif -------------------------------------------------------------------------------- /public/css/fineuploader/edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/edit.gif -------------------------------------------------------------------------------- /public/css/fineuploader/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/loading.gif -------------------------------------------------------------------------------- /public/css/fineuploader/pause.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/pause.gif -------------------------------------------------------------------------------- /public/css/fineuploader/processing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/processing.gif -------------------------------------------------------------------------------- /public/css/fineuploader/retry.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/retry.gif -------------------------------------------------------------------------------- /public/css/fineuploader/trash.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dachcom-digital/pimcore-formbuilder/19a103739d5fd2dc6b41c66c7ceef7beb8e08a6d/public/css/fineuploader/trash.gif -------------------------------------------------------------------------------- /public/img/application_form.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/img/bool.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/bool_add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/checkbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/cl_change_value.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/cl_constraints_add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/img/cl_constraints_remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/img/cl_output_workflow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/cl_success_message.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/cl_switch_output_workflow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/cl_toggle_availability.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/img/cl_toggle_class.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/cl_trigger_event.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/cloudflare_turnstile.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /public/img/container.svg: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/container_add.svg: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/img/data_injection.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/elem_add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/fieldset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/fieldset_add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/img/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/img/filter_add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/formBuilder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/img/form_configuration.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/friendly_captcha.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/img/grid_ok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/grid_unavailable.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/html.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/img/mail_editor.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/img/multicheckbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/img/notice.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /public/img/output_workflow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/output_workflow_channel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/img/output_workflow_funnel_aware.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/ow_apply_data.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/ow_channel_api.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/ow_channel_email.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/img/ow_channel_funnel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/img/ow_channel_object.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/password.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/img/picture.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/img/radio.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/select.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/snippet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/img/submit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/img/textarea.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/img/time.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/abstract.js: -------------------------------------------------------------------------------- 1 | // legacy 2 | pimcore.registerNS('Formbuilder.comp.type.config_fields.abstract'); 3 | pimcore.registerNS('Formbuilder.extjs.form.fields.abstract'); 4 | 5 | Formbuilder.extjs.form.fields.abstract = Class.create({ 6 | isMultiValueAware: function (fieldConfig) { 7 | return false; 8 | }, 9 | getMultiValueAwareValuePrefixes: function (fieldConfig) { 10 | return []; 11 | }, 12 | getField: function (fieldConfig, value) { 13 | return null; 14 | } 15 | }); 16 | 17 | // legacy 18 | Formbuilder.comp.type.config_fields.abstract = Class.create(Formbuilder.extjs.form.fields.abstract, {}); -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/checkbox.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.checkbox'); 2 | Formbuilder.extjs.form.fields.checkbox = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function (fieldConfig, value) { 4 | return new Ext.form.Checkbox({ 5 | fieldLabel: fieldConfig.label, 6 | name: fieldConfig.id, 7 | checked: fieldConfig.config !== null && fieldConfig.config !== undefined && fieldConfig.config.hasOwnProperty('checked') ? fieldConfig.config.checked : false, 8 | uncheckedValue: false, 9 | inputValue: true, 10 | value: value 11 | }); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/href.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.href'); 2 | Formbuilder.extjs.form.fields.href = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function(fieldConfig, value) 4 | { 5 | var fieldData = value, 6 | localizedField = new Formbuilder.extjs.types.localizedField( 7 | function (locale) { 8 | var localeValue = fieldData && fieldData.hasOwnProperty(locale) ? fieldData[locale] : null, 9 | field; 10 | 11 | field = new Formbuilder.extjs.types.href(fieldConfig, localeValue, locale); 12 | 13 | return field.getHref(); 14 | } 15 | ); 16 | 17 | return localizedField.getField(); 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/key_value_repeater.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.key_value_repeater'); 2 | Formbuilder.extjs.form.fields.key_value_repeater = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function (fieldConfig, value) { 4 | var keyValueRepeater = new Formbuilder.extjs.types.keyValueRepeater( 5 | fieldConfig.id, 6 | fieldConfig.label, 7 | value, 8 | null, 9 | true, 10 | true 11 | ); 12 | 13 | return keyValueRepeater.getRepeater(); 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/label.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.label'); 2 | Formbuilder.extjs.form.fields.label = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function(fieldConfig, value) 4 | { 5 | return new Ext.form.Label({ 6 | style: 'display:block; padding:5px; margin:0 0 20px 0; background:#f5f5f5;border:1px solid #eee;', 7 | text: fieldConfig.label 8 | }); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/numberfield.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.numberfield'); 2 | Formbuilder.extjs.form.fields.numberfield = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function(fieldConfig, value) 4 | { 5 | return new Ext.form.field.Number({ 6 | name: fieldConfig.id, 7 | fieldLabel: fieldConfig.label, 8 | allowDecimals: false, 9 | anchor: '100%', 10 | value: value 11 | }); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/options_repeater.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.options_repeater'); 2 | Formbuilder.extjs.form.fields.options_repeater = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function (fieldConfig, value) { 4 | var keyValueRepeater = new Formbuilder.extjs.types.keyValueRepeater( 5 | fieldConfig.id, 6 | fieldConfig.label, 7 | value, 8 | fieldConfig.config.options, 9 | false, 10 | false, 11 | false 12 | ); 13 | 14 | return keyValueRepeater.getRepeater(); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /public/js/extjs/_form/config-fields/tagfield.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.fields.tagfield'); 2 | Formbuilder.extjs.form.fields.tagfield = Class.create(Formbuilder.extjs.form.fields.abstract, { 3 | getField: function(fieldConfig, value) 4 | { 5 | var hasStore = fieldConfig.config && Ext.isArray(fieldConfig.config.store), 6 | tagStore = new Ext.data.ArrayStore({ 7 | fields: ['index', 'name'], 8 | data: hasStore ? fieldConfig.config.store : [] 9 | }); 10 | 11 | return new Ext.form.field.Tag({ 12 | name: fieldConfig.id, 13 | fieldLabel: fieldConfig.label, 14 | queryDelay: 0, 15 | store: tagStore, 16 | value: value, 17 | createNewOnEnter: !hasStore, 18 | createNewOnBlur: !hasStore, 19 | filterPickList: hasStore, 20 | mode: 'local', 21 | displayField: 'name', 22 | valueField: 'index', 23 | hideTrigger: true, 24 | editable: !hasStore, 25 | selectOnFocus: !hasStore, 26 | anchor: '100%' 27 | }); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /public/js/extjs/_form/data-injection/expression.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.form.dataInjection.expression'); 2 | Formbuilder.extjs.form.dataInjection.expression = Class.create({ 3 | 4 | getForm: function (data) { 5 | return [{ 6 | xtype: 'textfield', 7 | fieldLabel: 'Expression', 8 | name: 'expression', 9 | anchor: '100%', 10 | allowBlank: false, 11 | value: data !== null ? data.expression : null 12 | }]; 13 | } 14 | }); -------------------------------------------------------------------------------- /public/js/extjs/_form/tab/output-workflow/channel/funnel/action/abstractAction.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.formPanel.outputWorkflow.channel.funnelAction.abstractAction'); 2 | Formbuilder.extjs.formPanel.outputWorkflow.channel.funnelAction.abstractAction = Class.create({ 3 | 4 | actionButton: null, 5 | type: null, 6 | data: null, 7 | availableChannels: null, 8 | 9 | initialize: function (actionButton, type, data) { 10 | this.actionButton = actionButton; 11 | this.type = type; 12 | this.data = data; 13 | this.availableChannels = null; 14 | }, 15 | 16 | getType: function () { 17 | return this.type; 18 | }, 19 | 20 | setAvailableChannels(channels) { 21 | this.availableChannels = channels; 22 | }, 23 | 24 | getActionData: function () { 25 | return []; 26 | }, 27 | 28 | getConfigItems: function () { 29 | return []; 30 | }, 31 | 32 | isValid: function () { 33 | return false; 34 | }, 35 | 36 | updateButtonState: function () { 37 | this.actionButton.setText(this.actionButton.cls + ' (Unknown Action)'); 38 | this.actionButton.setIconCls('pimcore_icon_warning'); 39 | } 40 | }); -------------------------------------------------------------------------------- /public/js/extjs/_form/tab/output-workflow/channel/funnel/action/disabledAction.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.formPanel.outputWorkflow.channel.funnelAction.disabledAction'); 2 | Formbuilder.extjs.formPanel.outputWorkflow.channel.funnelAction.disabledAction = Class.create(Formbuilder.extjs.formPanel.outputWorkflow.channel.funnelAction.abstractAction, { 3 | 4 | initialize: function ($super, actionButton, type, data) { 5 | 6 | $super(actionButton, type, data); 7 | 8 | this.updateButtonState(); 9 | }, 10 | 11 | getActionData: function () { 12 | 13 | this.updateButtonState(); 14 | 15 | return this.data; 16 | }, 17 | 18 | getConfigItems: function () { 19 | return [{ 20 | xtype: 'tbtext', 21 | style: 'padding: 10px 10px 10px 0', 22 | text: 'No configuration available.', 23 | }]; 24 | }, 25 | 26 | isValid: function () { 27 | return true; 28 | }, 29 | 30 | updateButtonState: function () { 31 | this.actionButton.setText(this.actionButton.cls + ' (Disabled)'); 32 | this.actionButton.setIconCls('pimcore_icon_hide'); 33 | } 34 | }); -------------------------------------------------------------------------------- /public/js/extjs/_form/tab/output-workflow/channel/funnel/layer/abstractLayer.js: -------------------------------------------------------------------------------- 1 | pimcore.registerNS('Formbuilder.extjs.formPanel.outputWorkflow.funnelLayer.abstractLayer'); 2 | Formbuilder.extjs.formPanel.outputWorkflow.funnelLayer.abstractLayer = Class.create({ 3 | 4 | funnelLayerType: null, 5 | funnelLayerOptions: null, 6 | funnelLayerConfig: null, 7 | workflowId: null, 8 | channelId: null, 9 | 10 | initialize: function (funnelLayerType, funnelLayerOptions, funnelLayerConfig, workflowId, channelId) { 11 | this.funnelLayerType = funnelLayerType; 12 | this.funnelLayerOptions = funnelLayerOptions; 13 | this.funnelLayerConfig = funnelLayerConfig; 14 | this.workflowId = workflowId; 15 | this.channelId = channelId; 16 | }, 17 | 18 | getType: function () { 19 | return this.funnelLayerType; 20 | }, 21 | 22 | getConfigItems: function () { 23 | return []; 24 | } 25 | }); -------------------------------------------------------------------------------- /public/js/extjs/components/elements/Formbuilder.HrefTextField.js: -------------------------------------------------------------------------------- 1 | Ext.define('FormBuilder.HrefTextField', { 2 | 3 | extend: 'Ext.form.TextField', 4 | 5 | href: null, 6 | hrefLocale: null, 7 | customProperties: {}, 8 | 9 | /** 10 | * @param locale 11 | */ 12 | setHrefLocale: function (locale) { 13 | this.hrefLocale = locale; 14 | }, 15 | 16 | /** 17 | * @returns {string|null} 18 | */ 19 | getHrefLocale: function () { 20 | return this.hrefLocale; 21 | }, 22 | 23 | /** 24 | * @param href 25 | */ 26 | setHrefObject: function (href) { 27 | this.href = href; 28 | this.lastValue = null; 29 | this.setValue(this.href.hasOwnProperty('path') ? this.href.path : null); 30 | }, 31 | 32 | /** 33 | * @returns {string|null} 34 | */ 35 | getValue: function () { 36 | return this.href; 37 | }, 38 | 39 | getSubmitData: function () { 40 | var data = {}; 41 | data[this.getName()] = this.href; 42 | return data; 43 | } 44 | }); -------------------------------------------------------------------------------- /public/js/extjs/eventObserver.js: -------------------------------------------------------------------------------- 1 | FormbuilderEventObserver = Class.create({ 2 | 3 | observerSections: {}, 4 | 5 | initialize: function () { 6 | this.observerSections = {}; 7 | }, 8 | 9 | registerObservable: function (observableId) { 10 | 11 | if (this.observerSections.hasOwnProperty(observableId)) { 12 | return; 13 | } 14 | 15 | this.observerSections[observableId] = new Ext.util.Observable(); 16 | }, 17 | 18 | unregisterObservable: function (observableId) { 19 | 20 | if (!this.observerSections.hasOwnProperty(observableId)) { 21 | return; 22 | } 23 | 24 | delete this.observerSections[observableId]; 25 | }, 26 | 27 | getObserver: function (observableId) { 28 | return this.observerSections[observableId]; 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /public/js/extjs/plugin.js: -------------------------------------------------------------------------------- 1 | document.addEventListener(pimcore.events.pimcoreReady, (e) => { 2 | 3 | var user = pimcore.globalmanager.get('user'), 4 | openSettings = function (config) { 5 | try { 6 | pimcore.globalmanager.get('form_builder_settings').activate(); 7 | } catch (e) { 8 | pimcore.globalmanager.add('form_builder_settings', new Formbuilder.settings(config)); 9 | } 10 | }; 11 | 12 | if (!user.isAllowed('formbuilder_permission_settings')) { 13 | return false; 14 | } 15 | 16 | Ext.Ajax.request({ 17 | url: '/admin/formbuilder/settings/get-settings', 18 | success: function (response) { 19 | 20 | var config = Ext.decode(response.responseText), 21 | formBuilderMenu = new Ext.Action({ 22 | id: 'form_builder_setting_button', 23 | text: t('form_builder_settings'), 24 | iconCls: 'form_builder_icon_fbuilder', 25 | handler: openSettings.bind(this, config) 26 | }); 27 | 28 | if (layoutToolbar.settingsMenu) { 29 | layoutToolbar.settingsMenu.add(formBuilderMenu); 30 | } 31 | 32 | }.bind(this) 33 | }); 34 | 35 | }); -------------------------------------------------------------------------------- /src/Controller/EmailController.php: -------------------------------------------------------------------------------- 1 | render('@FormBuilder/email/email.html.twig', [ 25 | 'editmode' => $this->editmode, 26 | 'document' => $this->document, 27 | 'body' => $request->attributes->has('body') ? $request->attributes->get('body') : null 28 | ]); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/DynamicMultiFile/Adapter/DynamicMultiFileAdapterInterface.php: -------------------------------------------------------------------------------- 1 | name; 30 | } 31 | 32 | public function getType(): ?string 33 | { 34 | return $this->type; 35 | } 36 | 37 | public function getOptions(): array 38 | { 39 | return $this->options; 40 | } 41 | 42 | public function setOptions(array $options): void 43 | { 44 | $this->options = $options; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Event/Form/PostSetDataEvent.php: -------------------------------------------------------------------------------- 1 | formEvent; 30 | } 31 | 32 | public function getFormOptions(): array 33 | { 34 | return $this->formOptions; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Event/Form/PreSetDataEvent.php: -------------------------------------------------------------------------------- 1 | formEvent; 30 | } 31 | 32 | public function getFormOptions(): array 33 | { 34 | return $this->formOptions; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Event/Form/PreSubmitEvent.php: -------------------------------------------------------------------------------- 1 | formEvent; 30 | } 31 | 32 | public function getFormOptions(): array 33 | { 34 | return $this->formOptions; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Event/OutputWorkflow/OutputWorkflowSignalEvent.php: -------------------------------------------------------------------------------- 1 | name; 31 | } 32 | 33 | public function getData(): mixed 34 | { 35 | return $this->data; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/EventSubscriber/SignalStorage/ArraySignalStorage.php: -------------------------------------------------------------------------------- 1 | context = $context; 26 | } 27 | 28 | public function storeSignal(OutputWorkflowSignalEvent $signal): void 29 | { 30 | $this->signals[] = $signal; 31 | } 32 | 33 | public function getSignals(): array 34 | { 35 | return $this->signals; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/EventSubscriber/SignalStorage/ProviderAwareStorageInterface.php: -------------------------------------------------------------------------------- 1 | exceptions = $guardExceptions; 25 | 26 | parent::__construct('Guard Stacked Exception', 0, $previousException); 27 | } 28 | 29 | public function getGuardExceptionMessages(): array 30 | { 31 | return array_map(function (GuardException $exception) { 32 | return $exception->getMessage(); 33 | }, $this->exceptions); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Factory/FormDataFactory.php: -------------------------------------------------------------------------------- 1 | add('apiMapping', CollectionType::class, ['allow_add' => true, 'entry_type' => TextType::class]); 26 | $builder->add('fieldTransformer', TextType::class); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Funnel/Action/FunnelActionCoreConfigType.php: -------------------------------------------------------------------------------- 1 | add('ignoreInvalidFormSubmission', CheckboxType::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Funnel/Action/Type/ChannelActionType.php: -------------------------------------------------------------------------------- 1 | add('channelName', TextType::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Funnel/Action/Type/DisabledActionType.php: -------------------------------------------------------------------------------- 1 | add('populateForm', CheckboxType::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Funnel/Layer/DynamicLayoutLayerType.php: -------------------------------------------------------------------------------- 1 | add('layout', PimcoreHrefType::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Object/Worker/RelationWorkerType.php: -------------------------------------------------------------------------------- 1 | add('relationType', TextType::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Channel/Object/Worker/Validation/ValidationType.php: -------------------------------------------------------------------------------- 1 | add('type', TextType::class); 26 | $builder->add('enabled', CheckboxType::class); 27 | $builder->add('field', TextType::class); 28 | $builder->add('message', TextType::class); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Form/Admin/Type/OutputWorkflow/Component/PimcoreHrefType.php: -------------------------------------------------------------------------------- 1 | add('id', IntegerType::class); 26 | $builder->add('path', TextType::class); 27 | $builder->add('type', TextType::class); 28 | $builder->add('subtype', TextType::class); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Form/AdvancedChoiceBuilderInterface.php: -------------------------------------------------------------------------------- 1 | 33 | */ 34 | public function getAttachments(): array; 35 | 36 | public function addAttachment(File $attachmentFile): void; 37 | } 38 | -------------------------------------------------------------------------------- /src/Form/DataInjector/DataInjectorInterface.php: -------------------------------------------------------------------------------- 1 | useEmailizr === true; 27 | } 28 | 29 | public function parse(string $template): string 30 | { 31 | return str_replace(array_keys($this->replaces), array_values($this->replaces), $template); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/MailEditor/Parser/TemplateParser/PlainTextParser.php: -------------------------------------------------------------------------------- 1 | ', '
'], "\n", $template); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/MailEditor/Parser/TemplateParser/TemplateParserInterface.php: -------------------------------------------------------------------------------- 1 | $fields 22 | */ 23 | public function setFields(array $fields): void; 24 | 25 | /** 26 | * @return array 27 | */ 28 | public function getFields(): array; 29 | } 30 | -------------------------------------------------------------------------------- /src/Model/FunnelActionDefinition.php: -------------------------------------------------------------------------------- 1 | name = $name; 25 | $this->label = $label; 26 | $this->parameters = $parameters; 27 | } 28 | 29 | public function getName(): string 30 | { 31 | return $this->name; 32 | } 33 | 34 | public function getLabel(): string 35 | { 36 | return $this->label; 37 | } 38 | 39 | public function getParameters(): array 40 | { 41 | return $this->parameters; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Model/OutputWorkflowChannelInterface.php: -------------------------------------------------------------------------------- 1 | contextData; 23 | } 24 | 25 | public function hasContextData(string $key): bool 26 | { 27 | return array_key_exists($key, $this->contextData); 28 | } 29 | 30 | public function getContextData(string $key): mixed 31 | { 32 | return $this->contextData[$key] ?? []; 33 | } 34 | 35 | public function addContextData(string $key, mixed $data): void 36 | { 37 | $this->contextData[$key] = $data; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/OutputWorkflow/Channel/ChannelContextAwareInterface.php: -------------------------------------------------------------------------------- 1 | channelContext; 25 | } 26 | 27 | public function setChannelContext(ChannelContext $channelContext): void 28 | { 29 | $this->channelContext = $channelContext; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/OutputWorkflow/DynamicObjectResolver/DynamicObjectResolverInterface.php: -------------------------------------------------------------------------------- 1 | services[] = $service; 31 | } 32 | 33 | public function getAll(): array 34 | { 35 | return $this->services; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Repository/DoubleOptInSessionRepositoryInterface.php: -------------------------------------------------------------------------------- 1 | id = $id; 27 | $this->name = $name; 28 | $this->path = $path; 29 | } 30 | 31 | public function getId(): string 32 | { 33 | return $this->id; 34 | } 35 | 36 | public function getName(): string 37 | { 38 | return $this->name; 39 | } 40 | 41 | public function getPath(): string 42 | { 43 | return $this->path; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Stream/FileStack.php: -------------------------------------------------------------------------------- 1 | files = $files; 25 | } 26 | 27 | public function addFile(File $file): void 28 | { 29 | $this->files[] = $file; 30 | } 31 | 32 | /** 33 | * @return array 34 | */ 35 | public function getFiles(): array 36 | { 37 | return $this->files; 38 | } 39 | 40 | public function count(): int 41 | { 42 | return count($this->files); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/Stream/FileStreamInterface.php: -------------------------------------------------------------------------------- 1 | callback = $callback; 23 | } 24 | 25 | public function getCallback(): \Closure|array 26 | { 27 | return $this->callback; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/Dispatcher/Module/Data/ConstraintsData.php: -------------------------------------------------------------------------------- 1 | data = $data; 23 | } 24 | 25 | public function hasData(): bool 26 | { 27 | return !empty($this->data); 28 | } 29 | 30 | public function getData(): mixed 31 | { 32 | return $this->data; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/Dispatcher/Module/Data/DataInterface.php: -------------------------------------------------------------------------------- 1 | data = $data; 26 | } 27 | 28 | public function hasData(): bool 29 | { 30 | return !empty($this->data); 31 | } 32 | 33 | public function getData(): mixed 34 | { 35 | return $this->data; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/Dispatcher/Module/ModuleInterface.php: -------------------------------------------------------------------------------- 1 | dataHandler as $dataHandler) { 27 | if ($dataHandler instanceof $serviceId) { 28 | return $dataHandler; 29 | } 30 | } 31 | 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/ReturnStack/ReturnStackInterface.php: -------------------------------------------------------------------------------- 1 | actionType; 27 | } 28 | 29 | public function getData(): mixed 30 | { 31 | return $this->data; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/Rule/Action/ActionInterface.php: -------------------------------------------------------------------------------- 1 | $value) { 23 | $setter = 'set' . ucfirst($key); 24 | if (method_exists($this, $setter)) { 25 | $this->$setter($value); 26 | } 27 | } 28 | 29 | return $this; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Validation/ConditionalLogic/Rule/Traits/ConditionTrait.php: -------------------------------------------------------------------------------- 1 | $value) { 23 | $setter = 'set' . ucfirst($key); 24 | if (method_exists($this, $setter)) { 25 | $this->$setter($value); 26 | } 27 | } 28 | 29 | return $this; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Validator/Constraints/CloudflareTurnstile.php: -------------------------------------------------------------------------------- 1 | message = $message ?? $this->message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Validator/Constraints/EmailChecker.php: -------------------------------------------------------------------------------- 1 | emailChecker as $emailChecker) { 26 | if (!$emailChecker->isValid($email, $context)) { 27 | return false; 28 | } 29 | } 30 | 31 | return true; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /templates/common/redirect_flash_message.html.twig: -------------------------------------------------------------------------------- 1 | {% set flashMessages = form_builder_get_redirect_flash_messages() %} 2 | {% if flashMessages is iterable and flashMessages is not empty %} 3 |
4 | {% for message in flashMessages %} 5 | {{ message|raw }}
6 | {% endfor %} 7 |
8 | {% endif %} -------------------------------------------------------------------------------- /templates/form/default.html.twig: -------------------------------------------------------------------------------- 1 | {% extends main_layout is defined and main_layout is not empty ? main_layout : '@FormBuilder/layout.html.twig' %} 2 | {% block form_builder_layout %} 3 |
4 | {% block form_builder_form %} 5 | {% endblock form_builder_form %} 6 |
7 | {% endblock form_builder_layout %} -------------------------------------------------------------------------------- /templates/form/elements/dynamic_multi_file/form_drop_zone.html.twig: -------------------------------------------------------------------------------- 1 | {% block block_preview_template %} 2 | {# @see https://www.dropzonejs.com/#theming #} 3 | {% endblock %} 4 | -------------------------------------------------------------------------------- /templates/form/form.html.twig: -------------------------------------------------------------------------------- 1 | {% extends form_layout %} 2 | {% block form_builder_form %} 3 | {% if form_template is not null %} 4 | {% import form_block_template as form_builder_theme_macro %} 5 | {% form_theme form form_template %} 6 | {{ form_start(form) }} 7 | {{ form_builder_theme_macro.form_builder_form_head() }} 8 | {% set flashMessages = form_builder_get_flash_messages(form.vars.id) %} 9 | {{ form_builder_theme_macro.form_builder_form_message(flashMessages) }} 10 | {{ form_widget(form) }} 11 | {{ form_builder_theme_macro.form_builder_form_foot() }} 12 | {{ form_end(form) }} 13 | {% elseif message is defined and form_builder_is_admin_mode is defined and form_builder_is_admin_mode == true %} 14 |
{{ 'form builder error: ' ~ message }}
15 | {% endif %} 16 | {% endblock form_builder_form %} -------------------------------------------------------------------------------- /templates/form/presets/demo.html.twig: -------------------------------------------------------------------------------- 1 | {% extends main_layout is not empty ? main_layout : '@FormBuilder/layout.html.twig' %} 2 | {# if preset is defined and called demo, this layout will get loaded #} 3 | {% block form_builder_layout %} 4 | 5 | {# use preset layouts to add additional data to specific forms #} 6 | {{ dump(form_preset) }} 7 | 8 |
9 | {% block form_builder_form %} 10 | {% endblock form_builder_form %} 11 |
12 | 13 | {% endblock form_builder_layout %} -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_3_horizontal_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 |
15 | {{ message|raw }} 16 |
17 | {% endfor %} 18 | {% endfor %} 19 |
20 | {% endif %} 21 | {% endmacro %} 22 | -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_3_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 |
15 | {{ message|raw }} 16 |
17 | {% endfor %} 18 | {% endfor %} 19 |
20 | {% endif %} 21 | {% endmacro %} 22 | -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_4_horizontal_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 |
15 | {{ message|raw }} 16 |
17 | {% endfor %} 18 | {% endfor %} 19 |
20 | {% endif %} 21 | {% endmacro %} 22 | -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_4_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 |
15 | {{ message|raw }} 16 |
17 | {% endfor %} 18 | {% endfor %} 19 |
20 | {% endif %} 21 | {% endmacro %} 22 | -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_5_horizontal_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 | 18 | {% endfor %} 19 | {% endfor %} 20 |
21 | {% endif %} 22 | {% endmacro %} 23 | -------------------------------------------------------------------------------- /templates/form/theme/macro/bootstrap_5_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 |
3 | {% endmacro %} 4 | 5 | {% macro form_builder_form_foot() %} 6 |
7 | {% endmacro %} 8 | 9 | {% macro form_builder_form_message(flash_messages) %} 10 | {% if flash_messages is not empty %} 11 |
12 | {% for label, messages in flash_messages %} 13 | {% for message in messages %} 14 | 18 | {% endfor %} 19 | {% endfor %} 20 |
21 | {% endif %} 22 | {% endmacro %} 23 | -------------------------------------------------------------------------------- /templates/form/theme/macro/form_div_layout.html.twig: -------------------------------------------------------------------------------- 1 | {% macro form_builder_form_head() %} 2 | {% endmacro %} 3 | 4 | {% macro form_builder_form_foot() %} 5 | {% endmacro %} 6 | 7 | {% macro form_builder_form_message(flash_messages) %} 8 | {% if flash_messages is not empty %} 9 | {% for label, messages in flash_messages %} 10 | {% for message in messages %} 11 |
12 | {{ message|raw }} 13 |
14 | {% endfor %} 15 | {% endfor %} 16 | {% endif %} 17 | {% endmacro %} 18 | -------------------------------------------------------------------------------- /templates/form/theme/type/cloudflare_turnstile.html.twig: -------------------------------------------------------------------------------- 1 | {%- block form_builder_cloudflare_turnstile_type_widget -%} 2 |
9 |
10 | {%- endblock -%} -------------------------------------------------------------------------------- /templates/form/theme/type/friendly_captcha.html.twig: -------------------------------------------------------------------------------- 1 | {%- block form_builder_friendly_captcha_type_widget -%} 2 |
8 | {{- form_widget(form) -}} 9 |
10 | {%- endblock -%} -------------------------------------------------------------------------------- /templates/form/theme/type/html_tag.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_builder_html_tag_type_label %}{% endblock %} 2 | 3 | {% block form_builder_html_tag_type_widget %} 4 | {% apply spaceless %} 5 | <{{ tag }} {{ block('attributes') }}>{{ label|trans }} 6 | {% endapply %} 7 | {% endblock %} -------------------------------------------------------------------------------- /templates/form/theme/type/instructions.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_builder_instruction_type_label %}{% endblock %} 2 | 3 | {% block form_builder_instruction_type_widget %} 4 | {% apply spaceless %} 5 | {% if form.vars.instructions is not empty %} 6 |
7 | {{ form.vars.instructions|trans|raw }} 8 |
9 | {% endif %} 10 | {% endapply %} 11 | {% endblock %} -------------------------------------------------------------------------------- /templates/form/theme/type/snippet.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_builder_snippet_type_label %}{% endblock %} 2 | 3 | {% block form_builder_snippet_type_widget %} 4 | {% apply spaceless %} 5 |
6 | {% if path is not empty %} 7 | {{ pimcore_inc(path) }} 8 | {% endif%} 9 |
10 | {% endapply %} 11 | {% endblock %} -------------------------------------------------------------------------------- /templates/funnel/base.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@FormBuilder/layout_funnel.html.twig' %} 2 | 3 | {% if formThemePath is not null %} 4 | {% form_theme form formThemePath %} 5 | {% endif %} 6 | 7 | {% block funnel_content %} 8 | 9 | {{ form_start(form, {attr: {'novalidate': 'novalidate'}}) }} 10 | 11 | {{ form_errors(form) }} 12 | 13 | {% if renderType == 'include' %} 14 | {% include view %} 15 | {% elseif renderType == 'prerender' %} 16 | {{ view|raw }} 17 | {% endif %} 18 | 19 | {% if form._token is defined and not form._token.isRendered %} 20 | {{ form_widget(form._token) }} 21 | {% endif %} 22 | 23 | {{ form_end(form, {render_rest: formRenderRest}) }} 24 | 25 | {% endblock funnel_content %} -------------------------------------------------------------------------------- /templates/funnel/error.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@FormBuilder/layout_funnel.html.twig' %} 2 | 3 | {% block funnel_content %} 4 | 5 |

Funnel Error

6 |

{{ error }}

7 | 8 | {% endblock funnel_content %} -------------------------------------------------------------------------------- /templates/funnel/layer/simple_layout_layer.html.twig: -------------------------------------------------------------------------------- 1 | {% if formThemePath is not null %} 2 | {% form_theme form formThemePath %} 3 | {% endif %} 4 | 5 | {% block funnel_content %} 6 | 7 | {% if layout is not null %} 8 | {{ pimcore_inc(layout) }} 9 | {% endif %} 10 | 11 | {% endblock funnel_content %} -------------------------------------------------------------------------------- /templates/layout.html.twig: -------------------------------------------------------------------------------- 1 | {% block form_builder_layout %} 2 | {% endblock %} -------------------------------------------------------------------------------- /templates/layout_funnel.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Funnel 5 | 6 | 7 | 8 | 9 | {% block funnel_content %} 10 | {# funnel content will be placed here #} 11 | {% endblock funnel_content %} 12 | 13 | 14 | --------------------------------------------------------------------------------