...
- It creates an instance of the appropriate * HtmlGeneratorElement * implementation and calls it's generateHtml(Context) method to generate the Html input fields to substitute for the tag. When a HtmlGeneratorElement is instantiated, it creates any widgets needed to render the element, and registers the widgets with the FormEntryContext.
- It creates an instance of the appropriate * FormSubmissionControllerAction * implementation implementation, and adds it to the FormSubmissionController. The FormSubmissonController will use this to handle the specifics of form submissions for this element.
...
If validation in successful, the web controller then calls the FormSubmissionController handleFormSubmission(FormEntrySession, HttpServletRequest) method. Again, the FormSubmissionController iterates through all the FormSubmissionControllerActions, this time calling their handleFormSubmissionhandleSubmission(FormEntrySession, HttpServletRequest) methods to handle the submission of the individual elements in the form.
...
That's a basic, but not exhaustive, overview of how the module work. We didn't discuss how obsgroups are implemented, or about the various classes in the schema package, among other things. Check out the javadocs for more information.
Other Features
Custom Tags
For a good example of how to add a custom tag to the valid list of htmlformentry tags from another module (or, in other words, how to register a custom tag handler from another module), see the htmlformflowsheet moduleCustom tags can be registered by calling the HtmlFormEntryService addHandler method(). Modules can register new tags by calling this method... for an example, in the HTML Form Flowsheet module the onLoad() method in the HtmlFormFlowsheetActivator registers a handler for a new "htmlformflowsheet" tag. To create a custom tag, you will need to define implementations of TagHandler, HtmlGeneratorElement, and FormSubmissionControllerAction for this new tag. You can take a look at some of the existing tags for examples of how to do this.
Defining attribute descriptors for custom tags
...
Currently, the module supports exporting any openmrs metadata referenced by id, uuid, or name. It also supports exporting concepts referenced by concept mapping.
Note that currently, before exporting a form, all references to persons, roles, and patient identifier types are removed from the form, though this may become configurable in the future.
Note that to work with version 1.7.2, any existing custom tag handlers will need to be modified to implement getAttributeDescriptors to work with verison 1.7.2 (though if the custom tag handler already implements SubstitutionTagHandler, no change will be required).
In the future, attribute descriptors may be used for other purposed purposes besides metadata sharing. For instance, the Html Form Entry Designer module could use the descriptors to determine the valid attributes for a tag.
Custom Content for Velocity Context
If your module instantiates a Spring bean that implements org.openmrs.module.htmlformentry.velocity.VelocityContextContentProvider then your bean's populateContext() method will be called each time a new HTML Form is opened (for entry, view, or edit). (Since HTML Form Entry 1.11)
See an example from the Kenya EMR module on github.