/** * Download Reports in XML format * @param Validation $post Validation object with the download criteria * @param array $incidents reports to be downloaded * @param array $categories deployment categories * @param array $custom_forms Custom form field structure and values */ public static function download_xml($post, $incidents, $categories, $custom_forms) { // Adding XML Content $writer = new XMLWriter(); $writer->openMemory(); $writer->startDocument('1.0', 'UTF-8'); $writer->setIndent(TRUE); /* Category Element/Attribute maps */ // Category map $category_map = array('attributes' => array('color' => 'category_color', 'visible' => 'category_visible', 'trusted' => 'category_trusted'), 'elements' => array('title' => 'category_title', 'description' => 'category_description')); // Array of category elements $category_elements = array('color', 'visible', 'trusted', 'title', 'description', 'parent'); /* Category translation Element/Attribute maps */ // Translation map $translation_map = array('attributes' => array('locale' => 'locale'), 'elements' => array('translation_title' => 'category_title', 'translation_description' => 'category_description')); // Array of translation elements $translation_elements = array('locale', 'translation_title', 'translation_description'); /* Form element/attribute maps */ // Forms map $form_map = array('attributes' => array('active' => 'form_active'), 'elements' => array('title' => 'form_title', 'description' => 'form_description')); // Forms element $form_elements = array('active', 'title', 'description'); /* Custom fields element/attribute maps */ // Field elements $form_field_elements = array('type', 'required', 'visible_by', 'submit_by', 'datatype', 'hidden', 'name', 'default'); /* Reports element/attribute maps */ // Report map $report_map = array('attributes' => array('id' => 'id', 'approved' => 'incident_active', 'verified' => 'incident_verified', 'mode' => 'incident_mode'), 'elements' => array('title' => 'incident_title', 'date' => 'incident_date', 'dateadd' => 'incident_dateadd')); // Report elements $report_elements = array('id', 'approved', 'verified', 'form_name', 'mode', 'title', 'date', 'dateadd'); // Location Map $location_map = array('attributes' => array(), 'elements' => array('name' => 'location_name', 'longitude' => 'longitude', 'latitude' => 'latitude')); // Location elements $location_elements = array('name', 'longitude', 'latitude'); // Media Map $media_map = array('attributes' => array('type' => 'media_type', 'active' => 'media_active', 'date' => 'media_date'), 'elements' => array()); // Media elements $media_elements = array('type', 'active', 'date'); // Personal info map $person_map = array('attributes' => array(), 'elements' => array('first_name' => 'person_first', 'last_name' => 'person_last', 'email' => 'person_email')); // Personal info elements $person_elements = array('first_name', 'last_name', 'email'); // Incident Category map $incident_category_map = array('attributes' => array(), 'elements' => array('category' => 'category_title')); // Incident Category elements $incident_category_elements = array('category'); // Ensure column order is always the same sort($post->data_include); /* Start Import Tag*/ $writer->startElement('UshahidiReports'); foreach ($post->data_include as $item) { switch ($item) { case 3: /* Start Categories element */ $writer->startElement('categories'); if (count($categories) > 0) { foreach ($categories as $category) { // Begin individual category tag $writer->startElement('category'); // Generate category element map $category_element_map = xml::generate_element_attribute_map($category, $category_map); if ($category->parent_id > 0) { // Category's parent $parent = ORM::factory('category', $category->parent_id); // If parent category exists if ($parent->loaded) { // Add to array of category_element_map for purposes of generating tags $category_element_map['elements']['parent'] = $parent->category_title; } } // Generate individual category tags xml::generate_tags($writer, $category_element_map, $category_elements); // Category Translation $translations = ORM::factory('category_lang')->where('category_id', $category->id)->find_all(); // If translations exist if (count($translations) > 0) { $writer->startElement('translations'); foreach ($translations as $translation) { // Begin individual translation element $writer->startElement('translation'); // Generate translation element map $translation_element_map = xml::generate_element_attribute_map($translation, $translation_map); // Generate translation tags xml::generate_tags($writer, $translation_element_map, $translation_elements); // End individual category translation tag $writer->endElement(); } $writer->endElement(); } $writer->endElement(); } } else { $writer->text('There are no categories on this deployment.'); } /* Close Categories Element */ $writer->endElement(); break; case 6: /* Start Customforms Element */ $writer->startElement('custom_forms'); // If we have custom forms if (count($custom_forms) > 0) { foreach ($custom_forms as $form) { // Custom Form element $writer->startElement('form'); // Generate form elements map $form_element_map = xml::generate_element_attribute_map($form, $form_map); // Generate form element tags xml::generate_tags($writer, $form_element_map, $form_elements); // Get custom fields associated with this form $form_fields = customforms::get_custom_form_fields(FALSE, $form->id, FALSE); foreach ($form_fields as $field) { // Make sure this custom form field belongs to the current form if ($field['form_id'] == $form->id) { // Custom Form Fields $writer->startElement('field'); $form_field_map = array('attributes' => array('type' => $field['field_type'], 'required' => $field['field_required'], 'visible_by' => $field['field_ispublic_visible'], 'submit_by' => $field['field_ispublic_submit']), 'elements' => array()); /* Get custom form field options */ $options = ORM::factory('form_field_option')->where('form_field_id', $field['field_id'])->find_all(); foreach ($options as $option) { if ($option->option_name == 'field_datatype') { // Data type i.e Free, Numeric, Email, Phone? $form_field_map['attributes']['datatype'] = $option->option_value; } if ($option->option_name == 'field_hidden') { // Hidden Field? $form_field_map['attributes']['hidden'] = $option->option_value; } } // Field name $form_field_map['elements']['name'] = $field['field_name']; // Default Value if ($field['field_default'] != '') { $form_field_map['elements']['default'] = $field['field_default']; } // Generate custom fields tags xml::generate_tags($writer, $form_field_map, $form_field_elements); // Close Custom form field element $writer->endElement(); } } // Close Custom Form Element $writer->endElement(); } } else { $writer->text('There are no custom forms on this deployment.'); } /* End Custom Forms Element */ $writer->endElement(); break; } } /* Start Reports Element*/ $writer->startElement('reports'); // If we have reports on this deployment if (count($incidents) > 0) { foreach ($incidents as $incident) { // Start Individual report $writer->startElement('report'); // Generate report map $report_element_map = xml::generate_element_attribute_map($incident, $report_map); // Grab Default form title $default_form = ORM::factory('form', 1); // Form this incident belongs to? $form_name = $incident->form->loaded ? $incident->form->form_title : $default_form->form_title; // Add it to report element map $report_element_map['attributes']['form_name'] = $form_name; // Generate report tags xml::generate_tags($writer, $report_element_map, $report_elements); foreach ($post->data_include as $item) { switch ($item) { // Report Description case 2: $writer->startElement('description'); $writer->text($incident->incident_description); $writer->endElement(); break; // Report Location // Report Location case 1: $writer->startElement('location'); // Generate location map $location_map_element = xml::generate_element_attribute_map($incident->location, $location_map); // Generate location tags xml::generate_tags($writer, $location_map_element, $location_elements); // Close location tag $writer->endElement(); break; case 7: // Report Personal information $incident_person = $incident->incident_person; if ($incident_person->loaded) { $writer->startElement('personal_info'); // Generate incident person element map $person_element_map = xml::generate_element_attribute_map($incident_person, $person_map); // Generate incident person element tags xml::generate_tags($writer, $person_element_map, $person_elements); // Close personal info tag $writer->endElement(); } break; case 3: // Report Category $writer->startElement('report_categories'); foreach ($incident->incident_category as $category) { // Generate Incident Category Element Map $incident_category_element_map = xml::generate_element_attribute_map($category->category, $incident_category_map); // Generate Incident Category Tags xml::generate_tags($writer, $incident_category_element_map, $incident_category_elements); } $writer->endElement(); break; case 6: // Report Fields $customresponses = customforms::get_custom_form_fields($incident->id, $incident->form_id, FALSE); if (!empty($customresponses)) { $writer->startElement('custom_fields'); foreach ($customresponses as $customresponse) { // If we don't have an empty form response if ($customresponse['field_response'] != '') { $writer->startElement('field'); $writer->startAttribute('name'); $writer->text($customresponse['field_name']); $writer->endAttribute(); $writer->text($customresponse['field_response']); $writer->endElement(); } } $writer->endElement(); } break; } } // Report Media $reportmedia = $incident->media; if (count($reportmedia) > 0) { $writer->startElement('media'); foreach ($reportmedia as $media) { // Videos and news links only if ($media->media_type == 2 or $media->media_type == 4) { $writer->startElement('item'); // Generate media elements map $media_element_map = xml::generate_element_attribute_map($media, $media_map); // Generate media elements xml::generate_tags($writer, $media_element_map, $media_elements); $writer->endAttribute(); $writer->text($media->media_link); // Close item tag $writer->endElement(); } } $writer->endElement(); } // Close individual report $writer->endElement(); } } else { $writer->text('There are no reports on this deployment.'); } /* Close reports Element */ $writer->endElement(); /* Close import tag */ $writer->endElement(); // Close the document $writer->endDocument(); // Print return $writer->outputMemory(TRUE); }
/** * Tests download helper function which generates object array maps * to be used to generate XML element tags * @test * @dataProvider providerTestGenerateArrayMap * @param array $object_map associative array map skeleton * @param array $expected_map expected output * @param object $object_orm ORM object * @param string $object_name */ public function testGenerateArrayMap($object_map, $expected_map, $object_orm, $object_name) { // Get array map returned by download helper function $actual_map = xml::generate_element_attribute_map($object_orm, $object_map); // For the random category if ($object_name == 'Category') { // Check if this category has a parent if ($object_orm->parent_id > 0) { // Fetch the parent category $parent = ORM::Factory('category', $object_orm->parent_id); // Add category parent to actual_map and expected_map $expected_map['elements']['parent'] = $parent->category_title; $actual_map['elements']['parent'] = $parent->category_title; } } if ($object_name == 'Report') { // Make sure the incident_form is loaded if ($object_orm->form->loaded) { // Add form_name attribute to actual map and expected map $expected_map['attributes']['form_name'] = $object_orm->form->form_title; $actual_map['attributes']['form_name'] = $object_orm->form->form_title; } } // Test to ensure expected array map and actual array map match $this->assertEquals($expected_map, $actual_map, 'Output does not match expected array for the ' . $object_name . ' object'); }