HTML Form Entry Module Getting Started

  1. Getting Started
  2. Additional Information
  3. Tips for making new forms

This is the basic information you need to create a simple form using the the Html Form Entry Module.

Getting Started

The htmlform tag

Your entire form must be wrapped in an htmlform tag

<htmlform>
    ...stuff goes here...
</htmlform>

Required elements

A form is required to ask for the datetime, location, and provider, and it must have a submit button. For a complete reference on these tags see Tag Reference Page

<htmlform>
    Date: <encounterDate default="today"/> <br/>
    Location: <encounterLocation/> <br/>
    Provider: <encounterProvider role="Provider"/> <br/>
    ...stuff goes here...
    <submit/>
</htmlform>

Section Tag

The <section> tag lets you break your form, and corresponding form schema, into sections. For a complete reference on this tag see Tag Reference Page

<section headerLabel="section1">
...
</section>

<section headerLabel="section2">
...
</section>

Obs Tag

The form wouldn't be much without being able to enter observations. For a complete reference on this tag see Tag Reference Page

<obs conceptId="5089" labelText="Weight" />
<obs conceptId="5090" labelText="Height" />

Velocity expressions

The lookup tag allows you to evaluate velocity expressions. For a complete reference on these tags see Tag Reference Page

<lookup expression="patient.personName"/> to display the patient's name
<lookup expression="patient.gender"/> to display the patient's gender
<lookup expression="patient.age"/> to display the patient's age

<lookup expression="patient.getPatientIdentifier(5)"/> to display the patient's identifier of the type with id=5

<lookup complexExpression="#foreach( $addr in $patient.addresses ) $\!addr.cityVillage <br/> #end"/> to display the city/village of each of the patient's addresses

Putting it all together

A very basic form to enter height and weight observations could look like:

<htmlform>
  <section headerLabel="1. Encounter Details">
    Date: <encounterDate default="today"/> <br/>
    Location: <encounterLocation/> <br/>
    Physician: <encounterProvider role="Provider"/> <br/>
    <br/>
  </section>

  <section headerLabel="2. Demographic Info">
    <span>Nom du patient: <lookup expression="patient.personName"/></span>
    <span>No. Dossier: <lookup complexExpression="#foreach( $patId in $patientIdentifiers.get("PIH ID") ) $\!patId #end"/></span><br/>
    <span>Sexe: <lookup expression="patient.gender" codePrefix="gender_"/></span>
    <span>(a) Date de naissance: <lookup expression="patient.birthdate"/></span>
    <span>(b) Age: <lookup expression="patient.age"/></span>
  </section>

  <section headerLabel="3.  Vital Signs">
    <obs conceptId="5089" labelText="Weight" /> (kg)
    <obs conceptId="5090" labelText="Height" /> (cm)
  </section>
<br/><br/>

<submit/>
</htmlform>

Additional Information

See HTML_Form_Entry_Module_HTML_Reference for complete documentation on the tags listed above, additional information on the <obs> tag and the related <obsGroup>, and details on more advanced features like macros, repeating templates, and enrolling patients in programs.

See the /wiki/spaces/RES/pages/26262844 page for more explanations and examples.  Ellen Ball presented /wiki/spaces/RES/pages/26312479.  The other training courses include sections on forms as well.  

Tips for making new forms

1. Always start with the actual paper form being used. It is important that clinicians already use this form and have "bought in" to it. If they don't really like it then they might decide to scrap it later and your work will be for nothing.

2. Print out the form. Also, if there is an InfoPath form try to get it.

3. If an InfoPath version exists, go through the paper copy and write down each concept used next to the question on the form for it. Keep in mind that the InfoPath version may contain data mapping errors. Note this on the paper form so you can come back to them later. For questions not replicated on the InfoPath form, or if you don't have the InfoPath version, go through the paper form and look up each concept in your concept dictionary. Write these down on your paper copy along with whatever data hiearchies you want (obs groups, coded questions, etc.)

4. Keep in mind that certain information may be best if left out of a htmlform and instead directly inputted to the EMR. These include many patient demographics and drug regimens.

5. Once your data scheme is on paper, you may begin the process of writing the form. Many forms employ numerous tables or other styles that are relatively simple to execute in html. A good html tutorial can be found here. Using html to style your form you should be able to closely replicate most paper forms. Images are not currently handled well and should be left out.

6. You may find it helpful to periodically preview your htmlform using that function in openMRS. Failure to do so can lead to troubles with debugging later as errors pile up. A good practice is to

7. Once the form has been implemented you should review the data schema to make sure that all concepts are mapping appropriately. Try the form out with testing data. If all looks well send to clinicians and/or share with others.

8. A note on using HTML forms across servers: Values specified in some tags are local to that particular server. When moving HTML forms it is necessary to change these attributes to match the new server. For example: LocationIDs in <encounterLocation>, Username, UserID, and Role used in <encounterProvider>, ProgramID in <enrollInProgram>, and concept IDs used with <obs> or <obsgroup>.