Standard XML Representations of Field Data
This would create a standard way of representing form field data safely as structured xml. It would be used by the custom reporting module whenever export as XML is chosen. This would be added for version 4.1 of I2CE/iHRIS.
Justification Currently the reporting system for iHRIS exports data in XML in an unsafe way, namely it just dumps out the database value. For the currently limited uses of XML report this has not been too problematic. However there are some issues that need to be resolved so that XML based report exports can be more readily implemented and fully utilized. These issues include:
- potential for exported data to itself can xml data which would make the xml export invalid
- inability to export binary data (such as PDF files or photos) in a readable format
- XSLT manipulation of structured data (such a mapped fields) is painful and ugly and prone to breakage as it can only the simple string manipulation functions available.
Note This will break existing XSLT transforms of exported XML data. In particular of the transforms used by Kenya and Zanzibar would need to be updated before they upgrade to 4.1 of iHRIS. This is intentional as we would now be able to use xpath queries to get at the needed data rather than perform string manipulations.
Requirements
- Experience in creating new forms in iHRIS
- Experience in object oriented PHP
- Experience with XML
Deliverables
- Fully functional, documented, and tested code that implements the code requirements as defined below.
- Updates to the XSLT transforms used by Kenya and Zanzibar for SDMX-HD
API
I2CE_FormField
- add in a (final) method getXMLData($as_node = false). Calls _getXMLData(). If $as_node == false, the simply pass it along. If $as_node == true, first convert it to a DOMNode and return that
- add in a abstract method _getXMLData() which return strings
Sub-Classes of I2CE_FormField
- each non-abstract class should implement _getXMLData()
XML Format
Each _getXMLData() should return a string that looks like <field type='XXX'>YYYY<field> where XXX is the form field type such as MAP, STRING, DATE_YMD, etc and YYY is as defined below
I2CE_FormField_BINARY_FILE
I2CE_FormField_DOCUMENT
I2CE_FormField_IMAGE
I2CE_FormField_ASSOC_FLOAT
Same as ASSOC_INT but with type='ASSOC_FLOAT'
I2CE_FormField_ASSOC_INT
<field type='ASSOC_INT'><value key='$key0' >$value[$key0]<value>...<value key='$keyn'>$value[$keyn]</value></field> where key0...keyn runs through the array keys
I2CE_FormField_ASSOC_LIST
<field type='ASSOC_INT'><value key='$key0' >$string_value[$key0]<value>...<value key='$keyn'>$string_value[$keyn]</value></field> where key0...keyn runs through the array keys. Here $string_value should follow the same rules is as in #I2CE_FormField_STRING_LINE adding in the attribute encode='base64' as needed
I2CE_FormField_ASSOC_PERCENT
Same as ASSOC_INT but with type='ASSOC_PERCENT'
I2CE_FormField_BOOL
I2CE_FormField_DATE_HMS
I2CE_FormField_DATE_MD
I2CE_FormField_DATE_TIME
I2CE_FormField_DATE_Y
I2CE_FormField_DATE_YMD
I2CE_FormField_INT
<field type='INT'>$value</field>
I2CE_FormField_INT_GENERATE
I2CE_FormField_INT_LIST
<field type='INT_LIST'><value>$value[0]<value>...<value>$value[n]</value></field> where 0...n runs through the array keys
I2CE_FormField_INT_RANGE
<field type='INT_RANGE'>$value</field>
I2CE_FormField_STRING_LINE
<field type='STRING'>YYYY</field> where YYYY is:
- If the string is less than 1000 characters
- If the string does not contain a "<" character, then YYYY = <value>$value</value>
- If the string contains as "<", then follow the rules for >= 1000 characters
- If the string is >= 1000 characters:
- If the $value contains CDATA a string, then YYYY= <value encoding='base64'>base64($value)</value>
- If the $value does not contains "CDATA" then YYYY= <value><![CDATA[$value]]><value>
I2CE_FormField_STRING_MLINE
same as STRING_LINE but with the type='STRING_MLINE'
I2CE_FormField_STRING_PASS
I2CE_FormField_STRING_TEXT
same as STRING_LINE but with the type='STRING_TEXT'
I2CE_FormField_TOGGLE
same as YESNO but with the type='TOGGLE'
I2CE_FormField_YESNO
- if $value == 1 then <field type='YESNO'>1</value>
- otherwise<field type='YESNO'>0</value>
I2CE_FormField_PERCENT_INT
<field type='INT'>$value</field>
I2CE_FormField_FLOAT
<field type='FLOAT'>$value</field>
I2CE_FormField_PERCENT
<field type='PERCENT'>$value</field>
I2CE_FormField_MAP
<field type='MAP'><value form='$form'>$id</value></field>
I2CE_FormField_MAP_MULT
<field type='MAP'><value form='$form0'>$id1</value>...<value form='$formN'>$idN</value></field>