Skip to content

MelisFormEngine

Shared storage and runtime layer for the whole form system — owns every melis_form* table, all per-entity services, the field view-helpers (form → HTML) and the server-side validators. Package melisplatform/melis-form-engine.

Purpose

MelisFormEngine is the load-bearing infrastructure module of the form family. It owns every database table (form definitions, workflow entities, visitor answers), exposes one service per entity, renders form fields to HTML through a set of view-helpers, runs server-side validation on submitted answers, and persists submissions. It has almost no UI of its own — the builder (MelisFormCreator) and the answer reviewer (MelisFormTool) are thin layers that call these services and write into these tables.

Form family at a glance:

ModuleRole
MelisFormEngine (this module)Storage + runtime: tables, services, field renderers, validators, answer persistence.
MelisFormCreatorBuilder UI — calls these services to write form definitions into these tables.
MelisFormToolAnswer reviewer — lists/shows answers and drives the instruction workflow.
MelisSmallBusinessWorkflow framework behind the instruction/validation process.

Downstream, MelisDocumentGenerator reads melis_forms_answers to produce documents.

Enable it

Add to config/melis.module.load.php:

php
return [
    // …
    'MelisFormEngine',
];

Requires melisplatform/melis-core ^5.3 (events, mailer, BO chrome) and melisplatform/melis-engine ^5.3 (front-office rendering engine, so forms can be submitted on the public site using the same services/tables). melis-site: false — no demo-site content is bundled.

Key services

All aliases are registered in config/module.config.php. Note: alias names keep the MelisFormCreatorForm* prefix; the actual classes live in MelisFormEngine\Service\.

Service aliasRole
MelisFormCreatorFormServiceCentral form CRUD + the form→HTML builder. Key methods: saveForm(), setFormConfigXML(), getFormByFormId(), generateForm($xml, $renderMode = 'melis', …) (parses form config XML into a Laminas form), and updateFormXmlBy{Updated,Deleted}{Field,Status,Validator,Process}() sync helpers.
MelisFormCreatorFormFieldServiceField CRUD: getFieldList(), saveFormField(), saveFormFieldRules(), saveFormFieldGroups(), deleteFormField(), getSavedFieldXml().
MelisFormCreatorFormGroupsServiceField-group CRUD.
MelisFormCreatorFormRulesServiceConditional-rule CRUD.
MelisFormCreatorFormStatusServiceAnswer-status CRUD.
MelisFormCreatorFormTypeServiceForm-type CRUD.
MelisFormCreatorFormProcessesServiceWorkflow process-stage CRUD.
MelisFormCreatorFormValidatorsServiceWorkflow validator CRUD.
MelisFormCreatorFormReasonsServiceRejection/action reason CRUD.
MelisFormCreatorFormCommentsServiceComment-template CRUD.
MelisFormCreatorFormVersioningServiceForm version snapshot/read.
MelisFormAnswersServiceVisitor answers: generateAnswersXml($data, $postDatas, $fieldsArr), saveFormAnswers($data, $id), validateAnswer($formId, $formAnswersId, $fieldId, $fieldValue, $file), saveFormAnswersDocument(…), answer listing/reading.
MelisFormValidationServiceInstruction server-side validation pipeline: generateFormProcessesNode(…), validator/role resolution, answer event/audit XML.
MelisFormEngineOtherConfigServicePersists the DB-vs-filesystem document-storage choice (triggered by meliscore_save_other_config).

Backoffice

The only back-office surface is a settings panel under System → Configuration → Form Engine settings (OtherConfigController). It lets an admin choose whether uploaded form documents are stored in the database or on the filesystem, and toggles the validation-UI options (whether validate/comment buttons appear on answers). Settings are persisted by MelisFormEngineOtherConfigService via the meliscore_save_other_config event.

Front office

Field view-helpers

Registered in view_helpers (config/module.config.php). BaseFieldHelper is the orchestrator; it dispatches to a concrete helper per field type and wraps the control in its div + label/tooltip.

Helper (view-helper name)Renders
BaseFieldHelperOrchestrator — routes to the right helper below.
InputFieldHelper<input> (text / email / number).
TextareaFieldHelper<textarea>.
SelectFieldHelper<select> (key|label options).
CheckboxFieldHelper / RadioButtonFieldHelperCheckbox group / radio group.
DateFieldHelper / DateTimeFieldHelperDate / date-time picker.
FileUploadFieldHelperFile upload control.
LabelFieldHelper / TextDisplayZoneHelperRead-only label / display zone (with conditional visibility).
MelisSwitchHelper (MelisSwitch, MelisSwitchOnOff)Toggle switch.
MelisTinyMCEHelper (MelisTinyMCE)Rich-text editor.
MelisBOUsersHelper (MelisBOUsersSelect)Back-office-user select.
CustomInputModelHelperCustom input model.
ValidationCommentHelperPer-field approve/reject icons + comment button + history (review UI).

Rendering pipeline

  1. MelisFormCreatorFormService::generateForm($xml, $renderMode='melis', …) parses melis_forms.mf_config and produces a Laminas form.
  2. BaseFieldHelper dispatches per field type to the concrete *FieldHelper.
  3. On submit, StepByStepController::validateAnswerAction (route /MelisFormEngine/validate-answer) validates a single field via MelisFormAnswersService::validateAnswer() — this powers the step-by-step AJAX validation.
  4. MelisFormAnswersService::generateAnswersXml() + saveFormAnswers() persist the submission into melis_forms_answers.

Server-side validators

Registered in the validators plugin manager (config/module.config.php), resolved per field from the form XML and run by MelisFormAnswersService::validateAnswer(). All extend BaseHelper.

NotEmptyHelper · ValidEmailHelper · IsIntegerHelper · IsFloatHelper · IsDateHelper · DigitsHelper · AlphaNumericHelper · UriHelper · FileExtensionPdfHelper · FileSizeMax500KbHelper · CompareNumberHelper · CompareTextHelper

Database tables

All tables are owned by this module (src/Model/Tables/). Most entities have a base table and a _trans companion holding per-language labels.

Form definition

TableHolds
melis_forms / melis_forms_transThe form itself; mf_config XML = complete form structure (steps, fields, rules, statuses…).
melis_form_fields / melis_form_fields_transReusable field definitions.
melis_form_field_groups / _transField groups/sections.
melis_form_fields_group_relField ↔ group link.
melis_form_field_rules / _transConditional rules (show/hide).
melis_form_fields_rules_relField ↔ rule link.
melis_form_status / _transStatuses an answer can take.
melis_form_forms_statusForm ↔ status link.
melis_form_typesForm layout types (e.g. accordion/tab).
melis_forms_versioningForm version snapshots (major.minor.maintenance).

Instruction / validation workflow

TableHolds
melis_form_processes / _transWorkflow process stages.
melis_form_validators / _transWho may approve/reject.
melis_form_reasons / _transRejection/action reasons.
melis_form_comments / _transComment templates.
melis_form_comments_reasonsComment ↔ reason link.

Answers

TableHolds
melis_forms_answersOne submission per row; answer content is XML.
melis_forms_answers_documentsUploaded files attached to an answer (when "store in DB" is on).
melis_forms_field_custom_baseBase rows for custom-input field models.

Example

Validate a single field, then save a complete form submission:

php
$answersService = $serviceManager->get('MelisFormAnswersService');

// Validate one field (called from AJAX step-by-step)
$result = $answersService->validateAnswer(
    $formId,
    $formAnswersId,
    $fieldId,
    $fieldValue,
    $uploadedFile  // null if not a file field
);

// Build the answers XML and persist the full submission
$xml  = $answersService->generateAnswersXml($formData, $postDatas, $fieldsArr);
$id   = $answersService->saveFormAnswers(['mfa_form_id' => $formId, 'mfa_answer' => $xml], null);

Key files

ConcernPath
Service + table aliases, view_helpers, validators, routesvendor/melisplatform/melis-form-engine/config/module.config.php
Workflow email templatesvendor/melisplatform/melis-form-engine/config/app.emails.php
BO settings panel declarationvendor/melisplatform/melis-form-engine/config/app.interface.php
Laminas forms (review + config)vendor/melisplatform/melis-form-engine/config/app.forms.php
Database table gatewaysvendor/melisplatform/melis-form-engine/src/Model/Tables/
Per-entity servicesvendor/melisplatform/melis-form-engine/src/Service/
Field view-helpersvendor/melisplatform/melis-form-engine/src/View/Helper/Field/
Server-side validatorsvendor/melisplatform/melis-form-engine/src/Validator/
Builder dropdown factoriesvendor/melisplatform/melis-form-engine/src/Form/Factory/
StepByStep (validate-answer) + OtherConfig controllersvendor/melisplatform/melis-form-engine/src/Controller/
OtherConfig event listenervendor/melisplatform/melis-form-engine/src/Listener/MelisFormEngineOtherConfigListener.php

See also: MelisCore · MelisSmallBusiness