Forms Reference Public

Module Research Notes

Evidence gathered from the current Forms module files — controllers, models, configs, and migrations — before writing these user guide pages.

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 3 min 2 views
Reference

Module Research Notes

Evidence gathered from the current module files before writing the user guide pages.

Slug: formsVersion: 1.0.0Category: ProductivityReviewed: 2026-07-11

Research Sources Inspected

Source path

modules/Forms

Feature flags marked true

  • Controllers
  • Models
  • Views
  • Permissions
  • Left Menu
  • Default Menu
  • Routes
  • System Logs

Evidence Summary

Manifest

module.json defines slug forms, version 1.0.0, category Productivity, and the module capability flags used in this guide.

Runtime surface

4 controller file(s), 20 view file(s), and 15 route mapping(s) were found.

Data surface

4 model file(s), 4 declared table(s), and 0 migration file(s) were found.

Operations surface

21 permission key(s), 0 job(s), 1 seeder(s), and 1 test file(s) were found.

Detailed File Evidence

Controllers and methods

  • Form_email_templates - index, modal_form, save, list_data, delete, view_form_email_template, save_content
  • Form_responses - index, save, upload_file, validate_file, check_recaptcha
  • Forms - index, modal_form, save, list_data, update_status, delete, embedded_code_modal_form, view, view_edit_forms, list_form_fields, field_modal_form, save_form_fields, delete_form_fields, preview_forms, sort_fields, view_browse
  • Hidden_fields - index, modal_form, save, list_data, delete

Jobs and schedules

No scheduled module jobs were found.

Routes sampled

RouteTarget
mcs/formsForms/index
mcs/forms/(:any)Forms/$1
mcs/forms/(:any)/(:any)Forms/$1/$2
mcs/forms/(:any)/(:any)/(:any)Forms/$1/$2/$3
mcs/forms_email_template/index/(:any)Form_email_templates/index/$1
mcs/forms_email_template/(:any)Form_email_templates/$1
mcs/forms_email_template/(:any)/(:any)Form_email_templates/$1/$2
mcs/hidden_fieldsHidden_fields/index
mcs/hidden_fields/(:any)Hidden_fields/$1
mcs/hidden_fields/(:any)/(:any)Hidden_fields/$1/$2
forms/saveForm_responses/save
forms/upload_fileForm_responses/upload_file
forms/validate_fileForm_responses/validate_file
forms/(:any)Form_responses/index/$1
forms/(:any)/(:any)Form_responses/$1/$2

README topics

  • What this module owns
  • URLs (unchanged from the legacy/core surface)
  • Permissions
  • Boundaries with core (deliberate)
  • Demo Seeder
  • Enable / verify
  • History

Operating Implications

  • Permission coverage is part of the module contract, so every workflow should be tested with a role-limited user and an administrator.
  • Seeders exist for sample or starter data; operators should know whether seeded records are demo-only or operational defaults.

Known Risks from the Manifest

  • Independent toggle: enablement is the module_forms active-setting (slug 'forms'). Controllers self-gate with with_module('forms'); the sidebar slice, permissions and default menu all key on module_forms. Forms is deliberately independent of module_marketing.
  • Shared core model: form fields are stored in the core custom_fields table via application/models/Custom_fields_model.php with related_to='form-{form_id}'. That model is shared with Leads/Team members and STAYS in core (loaded here via package paths) - it is intentionally NOT owned by this module.
  • API stays core: the read-only integration REST API (api/v1/forms, scope forms:read) and the end-user API (/v1/api/forms + uploads/responses) are served by core controllers under application/controllers/{api,v1/api}/marketing/ and routed from application/config/{api,v1_api.php}. They load this module's models via package paths. Relocating the API surface into the module is a clean follow-up.
  • Tables ship in the base install schema (no module migrations): forms, form_responses, form_email_templates, hidden_fields. File uploads on forms/form_responses use serialized files_data columns and the S3 migrator registry (application/libraries/S3_migrator.php) keys them under module 'forms' - unchanged.
Was this guide helpful?

Report a content problem