Esempio n. 1
0
 protected function _display($supress_output = false)
 {
     $this->template->addHeaderLink('mootools-core.js');
     $this->template->addHeaderLink('mootools-more.js');
     parent::_display($supress_output);
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Errors:\n" . $errors);
     }
     $this->ff = I2CE_FormFactory::instance();
     if (!$this->request_exists('id') || !($formid = $this->request('id'))) {
         $this->pushError("Bad list id {$id}");
         //needs to be localized
         return false;
     }
     $success = true;
     list($form, $id) = array_pad(explode("|", $formid, 2), 2, '');
     I2CE::raiseError(print_r($this->request(), true));
     if ($id == '*') {
         $where = array('operator' => 'FIELD_LIMIT', 'field' => 'remap', 'style' => 'not_null', 'data' => array());
         $ids = I2CE_FormStorage::search($form, false, $where);
         I2CE::raiseError("Form {$form} has remapping data for " . implode(" ", $ids));
         if (count($ids) > 0) {
             foreach (I2CE_List::getFieldsMappingToList($form) as $rform => $fields) {
                 foreach ($fields as $fieldObj) {
                     $field = $fieldObj->getName();
                     foreach ($ids as $id) {
                         I2CE::raiseError("Checking for remaps on {$rform}+{$field}");
                         $success &= $this->doRemap($rform, $field, $form . '|' . $id);
                     }
                 }
             }
         }
         $url = "index.php/auto_list?form=" . $form;
     } else {
         $form = '';
         if (!$this->request_exists('form') || !($form = $this->request('form')) || !in_array($form, $this->ff->getForms())) {
             $this->pushError("Form {$form} not found");
             return false;
         }
         $field = '';
         if (!$this->request_exists('field') || !($field = $this->request('field'))) {
             $this->pushError("Bad Field {$field}");
             return false;
         }
         $success = $this->doRemap($form, $field, $formid);
         $url = "index.php/auto_list?id={$formid}&form=" . $form;
     }
     if ($success) {
         $this->pushContent("Data was succesully remapped.  Continue on to database lists <a href='{$url}'>site</a>?");
     } else {
         $this->pushContent("Data was <b>not</b> succesully remapped.  Continue on to database lists <a href='{$url}'>site</a>?");
     }
     return true;
 }
 /**
  *Abstract method to retreive/display the contents of the rendered forms
  * @param boolean $as_string.  Defaults to false 
  * @returns mixed.  If {$as_string} is false the it is a  boolean true on sucess.  If $as_string is true, then it is a string on success, false on failure
  */
 public function display($as_string = false)
 {
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Got errors:\n{$errors}");
     }
     $title = addslashes(str_replace(array(' ', "\n", "\t"), array('_', ' ', '_'), $this->std_form) . '.pdf');
     if (!$as_string) {
         $this->pdf->Output($title, 'D');
         exit;
         // we want to make sure there is no further output or that the $this->page->display() method is not called
     } else {
         return $this->pdf->Output($title, 'S');
     }
 }
 protected function _display($supress_output = false)
 {
     if (!$this->isPost()) {
         //not doing a data import
         return parent::_display($supress_output);
     } else {
         parent::_display($supress_output);
         if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
             I2CE::raiseError("Errors:\n" . $errors);
         }
         if (!$this->hasPermission('task(form_relationship_can_import)')) {
             $this->pushError("You do not have permission to import");
             return false;
         }
         $ignore_ids = $this->request_exists('ignore_ids') && $this->request('ignore_ids');
         $src = $_FILES['upload']['tmp_name'];
         $this->import($src, $ignore_ids);
         return true;
     }
 }
 /**
  * Display the report
  * @param DOMNode $contentNode The DOM node we wish to display into
  * @param boolean $processResults Defaults to true meaning we run through the results
  * @param mixed $controls.  If null (default), we display all the report controsl.  If string or an array of string, we only display the indicated controls
  * @returns boolean. true on sucess
  */
 public function display($contentNode, $processResults = true, $controls = null)
 {
     $this->saveDefaultView();
     $style = $this->getStyle();
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Got errors:\n{$errors}");
     }
     if ($this->transformsToHTML()) {
         $style = 'html';
     }
     $filename = $this->getFileName();
     $encoding = '';
     if (array_key_exists('HTTP_HOST', $_SERVER)) {
         header("Content-disposition: attachment; filename=\"{$filename}\"");
         $contentType = $this->getContentType();
         if ($contentType) {
             header("Content-type: {$contentType}");
         } else {
             //html snippet
             foreach ($this->template->getHeaders() as $header) {
                 header($header);
             }
         }
         // Flush the headers so the download box appears fast
         flush();
     }
     echo $this->generateExport();
     flush();
     exit;
     // we want to make sure there is no further output or that the $this->page->display() method is not called
 }
 protected function action_get($action)
 {
     switch ($action) {
         case 'publish':
             $params = $this->loadRequestParameters(self::$retrieve_single);
             try {
                 $svs = new iHRIS_SVS($params['id']);
             } catch (Exception $e) {
                 I2CE::raiseError("Couldn't create SVS for {$params['id']}");
                 return false;
             }
             if (!$svs->publishConceptList($params['version'], $params['lang'])) {
                 I2CE::raiseError("Couldn't publish SVS for {$params['id']}");
                 $this->userMessage("Could not publish Shared Value Set " . $params['id']);
             } else {
                 $this->userMessage("Published Shared Value Set " . $params['id']);
             }
             $this->redirect($this->page . '/config');
             return true;
         case 'RetrieveMultipleValueSets':
             $params = $this->loadRequestParameters(self::$retrieve_multi);
             if (!($svs_doc = $this->generateMultiDoc($params)) instanceof DOMDocument) {
                 I2CE::raiseError("Could not retrieve multiples");
                 return false;
             }
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Got errors:\n{$errors}");
             }
             header('Content-Type: text/xml');
             echo $svs_doc->saveXML();
             exit(0);
         default:
         case 'RetrieveValueSet':
             $params = $this->loadRequestParameters(self::$retrieve_single);
             if (!is_string($svs = iHRIS_SVS::getPublishedConceptList($params['id'], $params['version'], $params['lang']))) {
                 I2CE::raiseError("Couldn't retrieve SVS for {$params['id']} on version {$params['version']} language {$params['lang']}");
                 return false;
             }
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Got errors:\n{$errors}");
             }
             header('Content-Type: text/xml');
             header('Content-Disposition: attachment; filename="' . $params['id'] . '.xml"');
             echo $svs;
             exit(0);
     }
 }
 protected function action()
 {
     parent::action();
     if (!$this->config instanceof I2CE_MagicDataNode) {
         $this->reshow(true);
         //show the parent node.
         return;
     }
     $reshow = false;
     switch ($this->page()) {
         case 'upload':
             I2CE::raiseError("Upload on " . $this->config->getPath(false) . "\n" . print_r($_FILES, true));
             if (!array_key_exists('upload', $_FILES) || array_key_exists('error', $_FILES['upload']) && $_FILES['upload']['error'] > 0 || ($upload = file_get_contents($_FILES['upload']['tmp_name'])) === false) {
                 $this->userMessage("Could not upload " . $_FILES['upload']['name']);
                 break;
             }
             if (strlen($upload) != $_FILES['upload']['size']) {
                 I2CE::raiseError("Upload size mismatch " . strlen($upload) . ' != ' . $_FILES['upload']['size']);
                 $this->userMessage("Could not upload " . $_FILES['upload']['name']);
                 break;
             }
             if ($this->config->is_parent()) {
                 $this->userMessage("Cannot set value on parent node");
                 break;
             }
             $content = $this->config;
             if ($content->is_parent()) {
                 $this->userMessage("Cannot overwrite content node");
                 break;
             }
             if ($content->hasAttribute('binary') && $content->getAttribute('binary')) {
                 $upload = base64_encode($upload);
                 $content->setValue($upload);
                 $content->setAttribute('encoding', 'base64');
                 $content->setAttribute('binary', '1');
             } else {
                 $content->setValue($upload);
             }
             break;
         case 'upload_binary':
             I2CE::raiseError("Upload Binary on " . $this->config->getPath(false) . "\n" . print_r($_FILES, true));
             if (!array_key_exists('upload', $_FILES) || array_key_exists('error', $_FILES['upload']) && $_FILES['upload']['error'] > 0 || ($upload = file_get_contents($_FILES['upload']['tmp_name'])) === false) {
                 $this->userMessage("Could not upload " . $_FILES['upload']['name']);
                 break;
             }
             if (strlen($upload) != $_FILES['upload']['size']) {
                 I2CE::raiseError("Upload size mismatch " . strlen($upload) . ' != ' . $_FILES['upload']['size']);
                 $this->userMessage("Could not upload " . $_FILES['upload']['name']);
                 break;
             }
             if ($this->config->is_scalar()) {
                 $this->userMessage("Cannot set value on parent node");
                 break;
             }
             $content = $this->config->traverse('content', true, false);
             $name = $this->config->traverse('name', true, false);
             $type = $this->config->traverse('type', true, false);
             if ($content->is_parent()) {
                 $this->userMessage("Cannot overwrite content node");
                 break;
             }
             if ($name->is_parent()) {
                 $this->userMessage("Cannot overwrite content node");
                 break;
             }
             if ($type->is_parent()) {
                 $this->userMessage("Cannot overwrite type node");
                 break;
             }
             //I2CE::raiseError("Setting " . $this->config->getPath() );
             $upload = base64_encode($upload);
             $content->setValue($upload);
             $name->setValue($_FILES['upload']['name']);
             $type->setValue($_FILES['upload']['type']);
             $content->setAttribute('binary', 1);
             $content->setAttribute('encoding', 'base64');
             break;
         case 'load':
             I2CE::raiseError("Begin load:" . print_r($this->request(), true));
             $transform = false;
             if (($transform_key = $this->request('transform_key')) && I2CE_MagicDataNode::checkKey($transform_key) && I2CE::getConfig()->setIfIsSet($transform, "/modules/magicDataBrowser/transforms/" . $this->request('transform_key')) && $transform) {
                 if (substr($transform, 0, 7) == 'file://' && (!($transform_file = I2CE::getFileSearch()->search('XSL', $file_name = substr($transform, 7))) || !($transform = file_get_contents($transform_file)))) {
                     I2CE::raiseError("Could not load {$file_name} for transform");
                     $this->userMessage("Invalid registered transform");
                     return false;
                 }
             } else {
                 if (array_key_exists('transform', $_FILES) && !(array_key_exists('error', $_FILES['transform']) && $_FILES['transform']['error'] > 0)) {
                     $transform = file_get_contents($_FILES['transform']['tmp_name']);
                 }
             }
             I2CE::raiseError("Loading with transform:{$transform}");
             if ($this->actionLoad($transform)) {
                 $this->userMessage("Data successuly loaded");
             } else {
                 $this->userMessage("There was a problem loading the data");
             }
             break;
         case 'erase':
             $name = $this->config->getName();
             $parent = $this->config->traverse('../');
             if ($this->isPost() && $this->config->getPath() != $this->config->traverse('/')->getPath()) {
                 //don't allow an erase of the top level node
                 unset($parent->{$name});
             }
             $reshow = true;
             break;
         case 'parent':
             if ($this->isPost() && $this->config->is_indeterminate()) {
                 $this->config->set_parent();
             }
             break;
         case 'scalar':
             if ($this->isPost() && $this->config->is_indeterminate()) {
                 $this->config->set_scalar();
             }
             break;
         case 'add':
             if ($this->post_exists('browser_magic_data_add_key')) {
                 $key = $this->post('browser_magic_data_add_key');
                 if (I2CE_MagicDataNode::checkKey($key) && !$this->config->pathExists($key)) {
                     $this->config->traverse($key, true, false);
                 }
             }
             break;
         case 'add_parent':
             if ($this->post_exists('browser_magic_data_add_key')) {
                 $key = $this->post('browser_magic_data_add_key');
                 if (I2CE_MagicDataNode::checkKey($key) && !$this->config->pathExists($key) && ($newNode = $this->config->traverse($key, true, false)) instanceof I2CE_MagicDataNode) {
                     $newNode->set_parent();
                 }
             }
             break;
         case 'add_scalar':
             if ($this->post_exists('browser_magic_data_add_key')) {
                 $key = $this->post('browser_magic_data_add_key');
                 if (I2CE_MagicDataNode::checkKey($key) && !$this->config->pathExists($key) && ($newNode = $this->config->traverse($key, true, false)) instanceof I2CE_MagicDataNode) {
                     $newNode->set_scalar();
                 }
             }
             break;
         case 'set':
             I2CE::raiseError("Try to set:0");
             if ($this->post_exists('browser_magic_data_value') && $this->post_exists('browser_magic_data_key')) {
                 I2CE::raiseError("Try to set:1");
                 $key = $this->post('browser_magic_data_key');
                 $value = $this->post('browser_magic_data_value');
                 if ($this->config->offsetExists($key) && is_scalar($value)) {
                     I2CE::raiseError("Try to set:2");
                     if ($this->config->is_translatable($key)) {
                         $locales = I2CE_Locales::getPreferredLocales();
                         reset($locales);
                         $locale = current($locales);
                         $this->config->setTranslation($locale, $value, $key);
                         if ($locale == I2CE_Locales::DEFAULT_LOCALE) {
                             $this->config->__set($key, $value);
                         }
                     } else {
                         $this->config[$key] = $value;
                     }
                 }
             }
             //we redirect so a reload does not post and so that if the page's display depends on the value that is being
             //set, we redisplay it.
             break;
         case 'download':
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Errors:\n" . $errors);
             }
             $value = $this->config->getValue();
             header("Cache-Control: max-age=1, s-maxage=1, no-store, no-cache, must-revalidate");
             header('Cache-Control: post-check=0, pre-check=0', false);
             header('Pragma: no-cache');
             header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
             header("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 10) . " GMT");
             header("ETag: PUB" . time());
             header("Pragma: no-cache");
             header("Content-length: " . strlen($value));
             header('Content-Disposition: attachment; filename="' . $this->config->getName() . '"');
             $mime_type = I2CE_MimeTypes::magicMimeType($value);
             I2CE::raiseError($mime_type);
             header('Content-type:' . $mime_type);
             session_cache_limiter("nocache");
             echo $value;
             die;
         case 'trans':
             $this->config->setTranslatable(null, !$this->config->is_translatable());
             break;
         case 'show':
         case 'mini':
             $this->actionDisplayConfig();
             $reshow = null;
             break;
         default:
             break;
     }
     if ($reshow !== null) {
         $this->reshow($reshow);
     }
 }
Esempio n. 7
0
    public function streamCache($ids = false, $last_modified = -1, $headers = false, $pre = '', $post = '', $wrap = true)
    {
        I2CE::longExecution(array("max_execution_time" => 1800));
        $results = $this->getCache($ids, $last_modified);
        if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
            I2CE::raiseError("Got errors:\n{$errors}");
        }
        if (array_key_exists('HTTP_HOST', $_SERVER)) {
            if (!is_array($headers)) {
                $headers = array('Content-Type: text/xml');
            }
            foreach ($headers as $header) {
                header($header);
            }
        }
        flush();
        if ($pre) {
            echo $pre;
            flush();
        }
        if ($wrap) {
            echo '
<csd:CSD xmlns:csd="urn:ihe:iti:csd:2013" >
';
        }
        foreach (array('organization', 'service', 'facility', 'provider') as $directory) {
            if ($wrap) {
                echo "<csd:" . $directory . "Directory>";
                flush();
            }
            if ($this->directory == $directory && $results) {
                while ($result = $results->fetchRow()) {
                    I2CE::longExecution(array("max_execution_time" => 1800));
                    $entity = $result->xml_entry;
                    echo $entity;
                    flush();
                }
            }
            if ($wrap) {
                echo "</csd:" . $directory . "Directory>\n";
                flush();
            }
        }
        flush();
        if ($wrap) {
            echo '</csd:CSD>
';
        }
        if ($post) {
            echo $post;
        }
        flush();
    }
    protected function action_full_soap($last_modified = -1, $cache_names = false, $headers = false, $content = false)
    {
        if (!$content) {
            $content = file_get_contents("php://input");
        }
        $content = file_get_contents("php://input");
        if (!$content || !($req_doc = new DOMDocument("1.0", "UTF-8")) || !$req_doc->loadXML($content) || !($xpath = new DOMXPath($req_doc)) || !$xpath->registerNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope') || !$xpath->registerNamespace('wsa', 'http://www.w3.org/2005/08/addressing') || !$xpath->registerNamespace('csd', 'urn:ihe:iti:csd:2013') || !($results = $xpath->query('/soap:Envelope/soap:Body/csd:getModificationsRequest/csd:lastModified')) instanceof DOMNodeList || !($results->length == 1) || !($item = $results->item(0)) instanceof DOMElement || !($mod_time = $item->textContent) || !($results = $xpath->query('/soap:Envelope/soap:Header/wsa:MessageID')) instanceof DOMNodeList || !($results->length == 1) || !($item = $results->item(0)) instanceof DOMElement || !($msg_id = $item->textContent)) {
            I2CE::raiseError("Invalid request");
            //NEED TO ADD IN ERROR HANDLING ACCORDING TO SPEC
            return false;
        }
        if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
            I2CE::raiseError("Got errors:\n{$errors}");
        }
        if (!is_array($headers)) {
            $headers = array('Content-Type: text/xml');
        }
        foreach ($headers as $header) {
            header($header);
        }
        echo '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:csd="urn:ihe:iti:csd:2013"> <soap:Header>
            <wsa:Action soap:mustUnderstand="1" >urn:ihe:iti:csd:2013:GetDirectoryModificationsResponse</wsa:Action>
            <wsa:MessageID>urn:uuid:' . iHRIS_UUID_Map::generateUUID() . '</wsa:MessageID>
            <wsa:To soap:mustUnderstand="1"> http://www.w3.org/2005/08/addressing/anonymous</wsa:To> <wsa:RelatesTo>' . $msg_id . '</wsa:RelatesTo>
            </soap:Header>
            <soap:Body>
            <csd:getModificationsResponse>
';
        flush();
        $this->action_full_stream($mod_time, false, array(), false, false);
        echo '</csd:getModificationsResponse>
    </soap:Body>
</soap:Envelope>';
    }
 public function generate($id, $stream = true)
 {
     I2CE::longExecution(array("max_execution_time" => 1800));
     if (!($doc = $this->get_doc_for_id($id)) instanceof DOMDocument) {
         I2CE::raiseError("Could not get document for " . $this->formRelationship->getPrimaryForm() . "|{$id}");
         return false;
     }
     $contents = $doc->saveXML($doc->documentElement);
     $transform_src = false;
     $transform_file = false;
     $trans_is_temp = false;
     if (!($this->request_exists('transform') && $this->request('transform') == 0)) {
         //allow request varible to turn of transform to check underlying data source easily
         if (array_key_exists('transform', $this->args) && is_string($this->args['transform'])) {
             $transform_src = $this->args['transform'];
         }
         if (is_string($transform_src) && strlen($transform_src)) {
             if ($transform_src[0] == '@') {
                 //it's a file.  search for it.
                 $file = substr($transform_src, 1);
                 if (!($transform_file = I2CE::getFileSearch()->search('XSLTS', $file))) {
                     I2CE::raiseError("Invalid transform file at {$file} => {$transform_file}\n" . print_r(I2CE::getFileSearch()->getSearchPath('XSLTS'), true));
                     return false;
                 }
             } else {
                 if (substr($transform_src, 0, 7) == 'file://') {
                     $transform_file = substr($transform_src, 7);
                 } else {
                     $trans_is_temp = true;
                     $transform_file = tempnam(sys_get_temp_dir(), 'XSL_REL_');
                     file_put_contents($transform_file, $transform_src);
                 }
             }
         }
     }
     if ($stream) {
         if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
             I2CE::raiseError("Got errors:\n{$errors}");
         }
         header('Content-Type: text/xml');
         flush();
         if ($transform_file) {
             $temp_file = tempnam(sys_get_temp_dir(), 'XML_REL_SINGLE_');
             file_put_contents($temp_file, $contents);
             $cmd = $this->get_transform_cmd($contents, $temp_file, $transform_file);
             passthru($cmd);
             unlink($temp_file);
             if ($trans_is_temp) {
                 unlink($transform_file);
             }
         } else {
             echo $contents;
         }
         exit(0);
     } else {
         if ($transform_file) {
             $temp_file = tempnam(sys_get_temp_dir(), 'XML_REL_SINGLE_');
             file_put_contents($temp_file, $contents);
             $cmd = $this->get_transform_cmd($contents, $temp_file, $transform_file);
             $trans = shell_exec($cmd);
             unlink($temp_file);
             if ($trans_is_temp) {
                 unlink($transform_file);
             }
             return $trans;
         } else {
             return $contents;
         }
     }
 }
 protected function action()
 {
     switch ($this->getAction()) {
         case 'xml':
             header("Content-type: text/xml");
             $children = $this->request_exists('children') && $this->request('children');
             if (!($obj = $this->getPrimary()) instanceof I2CE_Form) {
                 I2CE::raiseError("Bad Object");
                 return false;
             }
             $out = $obj->getXMLRepresentation(false, null, false, $children);
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Got errors:\n{$errors}");
             }
             header("Content-disposition: attachment; filename=\"" . $obj->getName() . "_" . $obj->getID() . ".xml");
             echo $out;
             exit(0);
         case 'json':
             header("Content-type: application/json");
             $children = $this->request_exists('children') && $this->request('children');
             if (!($obj = $this->getPrimary()) instanceof I2CE_Form) {
                 I2CE::raiseError("Bad Object");
                 return false;
             }
             $out = json_encode(simplexml_load_string($obj->getXMLRepresentation(false, null, false, $children)));
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Got errors:\n{$errors}");
             }
             echo $out;
             exit(0);
         case 'json_small':
             header("Content-type: application/json");
             if (!($obj = $this->getPrimary()) instanceof I2CE_Form) {
                 I2CE::raiseError("Bad Object");
                 return false;
             }
             if ($this->isPost()) {
                 $vals = json_decode($in = file_get_contents('php://input'), true);
                 $out = "{'success':0}";
                 if (is_array($vals)) {
                     if (array_key_exists('id', $vals)) {
                         $obj->setID($vals['id']);
                         $obj->populate();
                     }
                     $ok_fields = $obj->getFieldNames();
                     $ok_fields[] = 'parent';
                     foreach ($vals as $field => $data) {
                         if (!is_string($data) || !in_array($field, $ok_fields) || !($fieldObj = $obj->getField($field)) instanceof I2CE_FormField) {
                             continue;
                         }
                         $fieldObj->setFromDB($data);
                     }
                     I2CE::raiseError("JSON Save:" . $obj->getNameID());
                     $obj->save($this->user);
                     $out = "{'success':1}";
                 }
             } else {
                 $vals = array();
                 $fields = $obj->getFieldNames();
                 $fields = array_merge($fields, array('id', 'parent', 'created', 'last_modified'));
                 foreach ($fields as $field) {
                     if (!($fieldObj = $obj->getField($field)) instanceof I2CE_FormFIeld) {
                         continue;
                     }
                     $vals[$field] = $fieldObj->getDBValue();
                 }
                 $out = json_encode($vals);
             }
             if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
                 I2CE::raiseError("Got errors:\n{$errors}");
             }
             echo $out;
             exit(0);
         default:
             return parent::action();
     }
 }
 /**
  *Abstract method to retreive/display the contents of the rendered forms
  * @param boolean $as_string.  Defaults to false 
  * @returns mixed.  If {$as_string} is false the it is a  boolean true on sucess.  If $as_string is true, then it is a string on success, false on failure
  */
 public function display($as_string = false)
 {
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Got errors:\n{$errors}");
     }
     if ($as_string) {
         //we don't want mime type.  this goes to the archive
         $this->odf->saveToDisk();
         //
         return file_get_contents($this->odf->getTmpFile());
     } else {
         //we do want mime type.  this goes to the browser
         $this->odf->exportAsAttachedFile(addslashes($this->getFileName()));
         exit;
         // we want to make sure there is no further output or that the $this->page->display() method is not called
     }
 }
 /**
  * Display the report
  * @param DOMNode $contentNode The DOM node we wish to display into
  * @param boolean $processResults Defaults to true meaning we run through the results
  * @param mixed $controls.  If null (default), we display all the report controsl.  If string or an array of string, we only display the indicated controls
  * @return mixed I2CE_PDF on success, boolean otherwise
  */
 public function getPDF($contentNode, $processResults = true, $controls = null)
 {
     I2CE::longExecution(array("max_execution_time" => 1800));
     $this->resultsTable = array();
     if ($this->defaultOptions['table']['has_header']) {
         $formfields = $this->getDisplayFieldsData();
         $headers = array('#');
         foreach ($formfields as $formfield => $data) {
             if (!$data) {
                 continue;
             }
             $headers[$formfield] = $data['header'];
         }
         $this->resultsTable[] = $headers;
     }
     $data = $this->getResults();
     if (!$this->processResults($data, $contentNode)) {
         I2CE::raiseError("Could not get results");
         return false;
     }
     $encoding = new I2CE_Encoding('ASCII');
     //make sure we have somethin in our options
     $pdf = new I2CE_PDF($encoding, $this->defaultOptions['paper_orientation'], $this->defaultOptions['unit_of_measure'], $this->defaultOptions['paper_size']);
     //portrait, we are doing measurements in inches, letter paper
     //setup the main page display style
     $this->addFont($this->defaultOptions['main']['font'], $pdf);
     $pdf->SetTopMargin($this->defaultOptions['main']['top_margin']);
     $pdf->SetCompression($this->defaultOptions['compression']);
     $pdf->SetLineSpacing($this->defaultOptions['line_spacing']);
     //setup the header
     $pdf->setPrintHeader($this->defaultOptions['header']['show']);
     $pdf->setPrintFooter(false);
     $this->addFont($this->defaultOptions['header']['font'], $pdf);
     $pdf->setHeaderFont($this->defaultOptions['header']['font']['name'], $this->defaultOptions['header']['font']['style'], $this->defaultOptions['header']['font']['size']);
     $title = '';
     if ($this->defaultOptions['header']['title_prefix']) {
         $title = $this->defaultOptions['header']['title_prefix'] . ': ';
     }
     $title .= $this->config->display_name;
     $text = '';
     if ($this->defaultOptions['header']['text_prefix']) {
         if ($this->config->description) {
             $text = $this->defaultOptions['header']['text_prefix'] . ': ' . $this->config->description;
         } else {
             $text = $this->defaultOptions['header']['text_prefix'];
         }
     } else {
         if ($this->config->description) {
             $text = $this->config->description;
         } else {
             $text = '';
         }
     }
     $user = new I2CE_User();
     $name = $user->firstname . ' ' . $user->lastname;
     $time = strftime("%c");
     $desc = "This report was printed by {$name} on {$time}.\n";
     $limitsDesc = $this->getReportLimitsDescription();
     if (strlen($limitsDesc) > 0) {
         $desc .= "Report Limited by: " . $limitsDesc . "\n";
     }
     $pdf->setHeaderData($this->defaultOptions['header']['logo']['file'], $this->defaultOptions['header']['logo']['width'], $title, $text, $desc);
     $pdf->setHeaderMargin($this->defaultOptions['header']['margin']);
     // load our hyphenation dictionary
     $hyphen = new I2CE_Hyphen($encoding);
     $hyphen->LoadHyphenDictionary($this->defaultOptions['hyphenation_file']);
     $pdf->SetHyphenationDictionary($hyphen);
     //setup table style
     $pdf->SetTableHeaderFillColor($this->defaultOptions['table']['header']['fill_color']);
     $pdf->SetTableHeaderTextColor($this->defaultOptions['table']['header']['text_color']);
     $pdf->SetTableDataFillColor($this->defaultOptions['table']['data']['fill_color']);
     $pdf->SetTableDataTextColor($this->defaultOptions['table']['data']['text_color']);
     $pdf->SetMinTableCellWidth($this->defaultOptions['table']['min_cell_width']);
     $pdf->SetTableFramingColor($this->defaultOptions['table']['framing_color']);
     $pdf->SetTableColSpacing($this->defaultOptions['table']['column_spacing']);
     if (strtolower($this->defaultOptions['table']['width_style']) == 'explicit') {
         if (!empty($this->defaultOptions['table']['explicit_widths'])) {
             $pdf->SetTableWidths($this->defaultOptions['table']['explicit_widths']);
         } else {
             //fall back to a safe option
             $pdf->SetAutoTableWidthStyle('ALL');
         }
     } else {
         $pdf->SetAutoTableWidthStyle($this->defaultOptions['table']['width_style']);
     }
     //get on with displaying the report
     $this->setFont($this->defaultOptions['main']['font'], $pdf);
     $pdf->AddPage();
     if ($this->defaultOptions['table']['has_header']) {
         if ($this->defaultOptions['table']['use_running_header']) {
             $table_header_options = 2;
         } else {
             $table_header_options = 1;
         }
     } else {
         $table_header_options = 0;
     }
     $pdf->MakeTable($this->resultsTable, $this->defaultOptions['table']['border'], $this->defaultOptions['table']['max_width'], $this->defaultOptions['table']['data']['justification'], $table_header_options, $this->defaultOptions['table']['header']['justification'], 1);
     $pdf->Close();
     $title = addslashes(str_replace(array(' ', "\n", "\t"), array('_', ' ', '_'), $this->config->display_name) . '.pdf');
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Errors:\n" . print_r($errors, true));
     }
     return $pdf;
 }
 protected function outputTemplate($odf, $basename)
 {
     if (!array_key_exists('tmp_dir', $this->args) || !is_scalar($tmp_dir = $this->args['tmp_dir']) || !is_dir($tmp_dir)) {
         $tmp_dir = sys_get_temp_dir();
     }
     $odt_temp_file = tempnam($tmp_dir, '_ODT_');
     $odf->saveToDisk($odt_temp_file);
     $unoconv = false;
     if (I2CE::getConfig()->setIfIsSet($unoconv, "/modules/PrintedFormsODT/unoconv/exec")) {
         $unoconv = system("which " . $unoconv);
     }
     $conversions = array();
     I2CE::getConfig()->setIfIsSet($conversions, "/modules/PrintedFormsODT/unoconv/conversions", true);
     $format = false;
     if (array_key_exists('format', $this->args)) {
         $format = $this->args['format'];
     }
     if ($this->request_exists('format')) {
         $format = $this->request('format');
     }
     $command_options = '';
     if ($unoconv && is_string($format) && is_array($conversions) && array_key_exists($format, $conversions) && is_array($conversion = $conversions[$format]) && array_key_exists('mime', $conversion) && is_string($mime = $conversion['mime']) && array_key_exists('ext', $conversion) && is_string($ext = $conversion['ext'])) {
         $conv_temp_file = tempnam($tmp_dir, '_' . $format . '_');
         $export_options = '';
         if (array_key_exists('export_options', $this->args) && is_array($this->args['export_options']) && array_key_exists($format, $this->args['export_options']) && is_string($t_export_options = $this->args['export_options'][$format]) && strlen($t_export_options = trim($t_export_options)) > 0) {
             $export_options = ' -e ' . $t_export_options . ' ';
         }
         $connection = '';
         if (array_key_exists('connection', $this->args) && is_string($t_connection = $this->args['connection']) && strlen($t_connection = trim($t_connection)) > 0) {
             $connection = ' -c ' . $t_connection . ' ';
         }
         //On Ubuntu server 12.04 the odt needs chmod 605 before of try to use unoconv
         chmod($odt_temp_file, 0605);
         $multiple = false;
         $unoconv_config = I2CE::getConfig()->modules->PrintedFormsODT->unoconv;
         $unoconv_config->setIfIsSet($multiple, "allow_multiple");
         $home_idx = 1;
         if ($multiple) {
             while ($home_idx) {
                 if ($unoconv_config->is_parent("status/{$home_idx}")) {
                     $avail = 0;
                     $unoconv_config->setIfIsSet($avail, "status/{$home_idx}/available");
                     if ($avail) {
                         break;
                     } else {
                         $home_idx++;
                         continue;
                     }
                 }
                 break;
             }
             $unoconv_config->status->{$home_idx}->available = 0;
             if (!file_exists("/tmp/unoconv_homes/home{$home_idx}")) {
                 mkdir("/tmp/unoconv_homes/home{$home_idx}", 0755, true);
             }
             $exec = "HOME=/tmp/unoconv_homes/home{$home_idx} {$unoconv} --port=400{$home_idx} -o {$conv_temp_file} {$export_options} -f {$format} {$odt_temp_file}";
         } else {
             $exec = $unoconv . ' -o ' . $conv_temp_file . $export_options . ' -f ' . $format . ' ' . $odt_temp_file;
         }
         //NEED TO DO ON UBUNTU SERVER: sudo mkdir /home/www-data; sudo  chown www-data:www-data /home/www-data
         $error = 0;
         system($exec, $error);
         if ($multiple) {
             $unoconv_config->status->{$home_idx}->available = 1;
         }
         if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
             I2CE::raiseError("Errors:\n" . $errors);
         }
         I2CE::raiseError("Converting with {$exec}");
         if ($error == 0) {
             header('Content-type: ' . $mime);
             header('Content-Disposition: attachment; filename="' . $basename . '.' . $ext . '"');
             readfile($conv_temp_file);
             exit;
         }
         I2CE::raiseError("Error ({$error}) with {$exec}");
     }
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Errors:\n" . $errors);
     }
     header('Content-type: application/vnd.oasis.opendocument.text');
     header('Content-Disposition: attachment; filename="' . $basename . '.odt"');
     readfile($odt_temp_file);
     exit;
 }
 /**
  * Display the report
  * @param DOMNode $contentNode The DOM node we wish to display into
  * @param boolean $processResults Defaults to true meaning we run through the results
  * @param mixed $controls.  If null (default), we display all the report controsl.  If string or an array of string, we only display the indicated controls
  * @returns boolean. true on sucess
  */
 public function display($contentNode, $processResults = true, $controls = null)
 {
     I2CE::longExecution(array("max_execution_time" => 1800));
     $this->saveDefaultView();
     $template = $this->defaultOptions['odt_template'];
     $template_upload = false;
     $template_file = null;
     if ($this->config->setIfIsSet($template_upload, "printed_forms/{$template}/template_upload", true) && array_key_exists('content', $template_upload) && $template_upload['content'] && array_key_exists('name', $template_upload) && $template_upload['name']) {
         $template_file = $template_upload['name'];
         $pos = strrpos($template_file, '.');
         if ($pos !== false) {
             $name = substr($template_file, 0, $pos);
         } else {
             $name = $template_file;
         }
         $template_loc = tempnam(sys_get_temp_dir(), basename($name . '_')) . '.odt';
         file_put_contents($template_loc, $template_upload['content']);
     } else {
         $this->config->setIfIsSet($template_file, "printed_forms/{$template}/template");
         $template_loc = I2CE::getFileSearch()->search('ODT_TEMPLATES', $template_file);
         if (!$template_loc) {
             I2CE::raiseError("No template file found from {$template_file}");
             return false;
         }
     }
     $this->header_vars = array();
     foreach ($this->getDisplayFieldsData() as $formfield => $data) {
         $this->header_vars["++header+{$formfield}"] = $data['header'];
         list($formObj, $fieldObj) = $this->getFormFieldObjects($formfield);
         $this->image_objs[$formfield] = $fieldObj instanceof I2CE_FormField_IMAGE;
         $this->extra[$formfield] = array();
     }
     $this->limit_vars = $this->getLimitVars();
     $odf_config = array('DELIMITER_LEFT' => '{{{', 'DELIMITER_RIGHT' => '}}}', 'ZIP_PROXY' => 'PhpZipProxy');
     $this->odf = new I2CE_Odf($template_loc, $odf_config);
     try {
         $this->odf->setVars('++report_title', $this->config->display_name, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setStyleVars('++report_title', $this->config->display_name, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setVars('++report_description', $this->config->description, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setStyleVars('++report_description', $this->config->description, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     foreach ($this->header_vars as $key => $val) {
         try {
             $this->odf->setVars($key, $val, $this->encoding, $this->charset);
         } catch (OdfException $e) {
             //It's ok if it's not there so don't do anything.
         }
         try {
             $this->odf->setStyleVars($key, $val, $this->encoding, $this->charset);
         } catch (OdfException $e) {
             //It's ok if it's not there so don't do anything.
         }
     }
     foreach ($this->limit_vars as $key => $val) {
         try {
             $this->odf->setVars($key, $val, $this->encoding, $this->charset);
         } catch (OdfException $e) {
             //It's ok if it's not there so don't do anything.
         }
         try {
             $this->odf->setStyleVars($key, $val, $this->encoding, $this->charset);
         } catch (OdfException $e) {
             //It's ok if it's not there so don't do anything.
         }
     }
     $user = new I2CE_User();
     $name = $user->firstname . ' ' . $user->lastname;
     try {
         $this->odf->setVars('++user_name', $name, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setStyleVars('++user_name', $name, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     $time = strftime("%c");
     try {
         $this->odf->setVars('++time', $time, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setStyleVars('++time', $time, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     $limitsDesc = $this->getReportLimitsDescription();
     try {
         $this->odf->setVars('++report_limit', $limitsDesc, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf->setStyleVars('++report_limit', $limitsDesc, $this->encoding, $this->charset);
     } catch (OdfException $e) {
         //It's ok if it's not there so don't do anything.
     }
     try {
         $this->odf_row = $this->odf->setSegment('report_row');
     } catch (OdfException $e) {
         I2CE::raiseError("Couldn't find report_row in ODT template {$template_loc}.");
         return false;
     }
     $keys = $this->odf_row->getKeys();
     foreach ($this->odf_row->getKeys() as $key) {
         if (!is_string($key) || strlen($key) < 1) {
             continue;
         }
         if ($key[0] == '+') {
             continue;
         }
         list($namedform, $field, $t_extra) = array_pad(explode("+", $key, 3), 3, '');
         $extra = array();
         if (is_string($t_extra) && strlen($t_extra) > 0) {
             $t_extra = explode(',', $t_extra);
             foreach ($t_extra as $ex) {
                 list($ex_k, $ex_v) = array_pad(explode('=', $ex, 2), 2, '');
                 if (!$ex_k || !$ex_v) {
                     continue;
                 }
                 $extra[$ex_k] = $ex_v;
             }
         }
         $namedform = trim($namedform);
         $field = trim($field);
         $this->extra[$namedform . '+' . $field] = $extra;
         $this->full_keys[$namedform . '+' . $field] = $key;
     }
     $data = $this->getResults();
     if (!$this->processResults($data, $contentNode)) {
         I2CE::raiseError("Could not get results");
         return false;
     }
     $this->odf->mergeSegment($this->odf_row);
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Errors:\n" . $errors);
     }
     $this->odf->exportAsAttachedFile($template_file);
     exit;
     // we want to make sure there is no further output or that the $this->page->display() method is not called
 }
 protected function outputTemplate($odf, $basename)
 {
     $odt_temp_file = tempnam(sys_get_temp_dir(), '_ODT_');
     $odf->saveToDisk($odt_temp_file);
     $unoconv = false;
     if (I2CE::getConfig()->setIfIsSet($unoconv, "/modules/PrintedFormsODT/unoconv/exec")) {
         $unoconv = system("which " . $unoconv);
     }
     $conversions = array();
     I2CE::getConfig()->setIfIsSet($conversions, "/modules/PrintedFormsODT/unoconv/conversions", true);
     $format = false;
     if (array_key_exists('format', $this->args)) {
         $format = $this->args['format'];
     }
     if ($this->request_exists('format')) {
         $format = $this->request('format');
     }
     $command_options = '';
     if ($unoconv && is_string($format) && is_array($conversions) && array_key_exists($format, $conversions) && is_array($conversion = $conversions[$format]) && array_key_exists('mime', $conversion) && is_string($mime = $conversion['mime']) && array_key_exists('ext', $conversion) && is_string($ext = $conversion['ext'])) {
         $conv_temp_file = tempnam(sys_get_temp_dir(), '_' . $format . '_');
         $export_options = '';
         if (array_key_exists('export_options', $this->args) && is_array($this->args['export_options']) && array_key_exists($format, $this->args['export_options']) && is_string($t_export_options = $this->args['export_options'][$format]) && strlen($t_export_options = trim($t_export_options)) > 0) {
             $export_options = ' -e ' . $t_export_options . ' ';
         }
         $exec = $unoconv . ' -o ' . $conv_temp_file . $export_options . ' -f ' . $format . ' ' . $odt_temp_file;
         //NEED TO DO ON UBUNTU SERVER: sudo mkdir /home/www-data; sudo  chown www-data:www-data /home/www-data
         $error = 0;
         system($exec, $error);
         if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
             I2CE::raiseError("Errors:\n" . $errors);
         }
         I2CE::raiseError("Converting with {$exec}");
         if ($error == 0) {
             header('Content-type: ' . $mime);
             header('Content-Disposition: attachment; filename="' . $basename . '.' . $ext . '"');
             readfile($conv_temp_file);
             exit;
         }
         I2CE::raiseError("Error ({$error}) with {$exec}");
     }
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Errors:\n" . $errors);
     }
     header('Content-type: application/vnd.oasis.opendocument.text');
     header('Content-Disposition: attachment; filename="' . $basename . '.odt"');
     readfile($odt_temp_file);
     exit;
 }
 protected function export_results()
 {
     if (!($flow = $this->request('flow'))) {
         I2CE::raiseError("Bad flow");
         $this->error("Invalid Flow");
         return false;
     }
     $this->instantiateDisplay('Default', $this->view);
     if (!$this->display_obj instanceof I2CE_CustomReport_Display_mHero) {
         I2CE::raiseError("Bad display");
         $this->error("Invalid Display");
         return false;
     }
     I2CE::longExecution();
     $titles = $this->get_display_field_titles();
     I2CE::raiseError("TITLES=" . print_r($titles, true));
     $labels = $this->rapidpro->get_flow_field_labels($flow);
     $headers = array();
     if (array_key_exists('HTTP_USER_AGENT', $_SERVER) && preg_match('/\\s+MSIE\\s+\\d\\.\\d;/', $_SERVER['HTTP_USER_AGENT'])) {
         $headers[] = "application/vnd.ms-excel";
     } else {
         $headers[] = "text/csv; charset=UTF-8";
     }
     $filename = 'mHero-' . '-' . $this->slug . '-export-' . date('Y') . '-' . date('m') . '-' . date('d') . '.csv';
     $headers[] = "Content-disposition: attachment; filename=\"{$filename}\"";
     $out = fopen("php://output", 'w');
     $keys = array('entityID' => 'Health Worker Registry Entity ID', 'iHRIS_link' => 'iHRIS Source Record');
     $keys = array_merge($keys, $labels);
     $keys = array_merge($keys, $titles);
     I2CE::raiseError("KEYS=" . print_r($keys, true));
     $csd_uuids = $this->display_obj->get_csd_uuids();
     $person_ids = array_flip($csd_uuids);
     $assigning_authority = $this->host . '/' . $this->slug;
     $contacts = $this->rapidpro->getOtherIDs($this->csd_host, $csd_uuids, $assigning_authority);
     $contact_list = array();
     foreach ($contacts as $entityID => $contact) {
         if (!is_array($contact) || !array_key_exists('otherID', $contact) || !is_array($contact['otherID']) || count($contact['otherID']) != 1 || !reset($contact['otherID']) || !is_array($otherID = current($contact['otherID'])) || !array_key_exists('value', $otherID) || !($rapidpro_id = $otherID['value'])) {
             continue;
         }
         $contact_list[$rapidpro_id] = $entityID;
     }
     I2CE::raiseError(print_r($contacts, true));
     I2CE::raiseError(print_r($contact_list, true));
     $runs = $this->rapidpro->getFlowValues($flow);
     //would be better if we could put the streaming function as a callback after each hit on rapidpro
     $results = array();
     foreach ($runs as $run) {
         I2CE::raiseMessage($run['contact']);
         if (!is_array($run) || !array_key_exists('contact', $run) || !($rapidpro_id = $run['contact']) || !array_key_exists($rapidpro_id, $contact_list) || !($entityID = $contact_list[$rapidpro_id]) || !array_key_exists('values', $run) || !is_array($run['values'])) {
             continue;
         }
         $values = array();
         foreach ($run['values'] as $val_set) {
             if (!is_array($val_set) || !array_key_exists('label', $val_set) || !($label = $val_set['label']) || !array_key_exists('text', $val_set)) {
                 continue;
             }
             $values[$label] = $val_set['text'];
         }
         $results[$entityID] = $values;
     }
     I2CE::raiseError(print_r($results, true));
     if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
         I2CE::raiseError("Got errors:\n{$errors}");
     }
     I2CE::longExecution();
     foreach ($headers as $header) {
         header($header);
     }
     fputcsv($out, $keys);
     foreach ($results as $entityID => $values) {
         if (!array_key_exists($entityID, $person_ids) || !($person_id = $person_ids[$entityID])) {
             continue;
         }
         $iHRIS_link = I2CE::getAccessedBaseURL() . 'view?id=' . $person_id;
         $fields = array('entityID' => $entityID, 'iHRIS_link' => $iHRIS_link);
         foreach ($labels as $label) {
             if (!array_key_exists($label, $values)) {
                 $fields[] = '';
             } else {
                 $fields[] = $values[$label];
             }
         }
         $fields = array_merge($fields, $this->get_display_fields($person_id));
         foreach ($titles as $title => $label) {
             if (!array_key_exists($title, $fields) || !is_scalar($val = $fields[$title])) {
                 $fields[$title] = '';
             } else {
                 $fields[$title] = $val;
             }
         }
         fputcsv($out, $fields);
         flush();
     }
     fclose($out);
     exit(0);
 }
 public function generate_for_ids($ids, $stream = true)
 {
     $temp_file = tempnam(sys_get_temp_dir(), 'XML_REL_');
     file_put_contents($temp_file, "<?xml version='1.0'?><relationshipCollection name='" . $this->formRelationship->getPrimaryFormName() . "'>\n", FILE_APPEND);
     file_put_contents($temp_file, "<!-- Contains " . count($ids) . " records -->\n", FILE_APPEND);
     I2CE::raiseError("get XML representation for " . count($ids) . " records");
     $div = 1;
     if (count($ids) > 0) {
         $part = count($ids) / 10;
     }
     $rec = 0;
     $div = $part;
     foreach ($ids as $id) {
         $rec++;
         if ($rec > $div) {
             I2CE::raiseError("Completed " . $div / $part * 10 . " %");
             $div += $part;
         }
         I2CE::longExecution(array("max_execution_time" => 1800));
         $doc = $this->get_doc_for_id($id);
         file_put_contents($temp_file, "<!-- Record #: " . $rec . "-->", FILE_APPEND);
         file_put_contents($temp_file, $doc->saveXML($doc->documentElement) . "\n", FILE_APPEND);
     }
     I2CE::longExecution(array("max_execution_time" => 1800));
     file_put_contents($temp_file, "</relationshipCollection>", FILE_APPEND);
     $transform_src = false;
     $transform_file = false;
     $trans_is_temp = false;
     if (!($this->request_exists('transform') && $this->request('transform') == 0)) {
         //allow request varible to turn of transform to check underlying data source easily
         if (array_key_exists('transform', $this->args) && is_string($this->args['transform'])) {
             $transform_src = $this->args['transform'];
         }
         if (is_string($transform_src) && strlen($transform_src)) {
             I2CE::raiseError("Looking at {$transform_src}");
             if ($transform_src[0] == '@') {
                 //it's a file.  search for it.
                 $file = substr($transform_src, 1);
                 if (!($transform_file = I2CE::getFileSearch()->search('XSLTS', $file))) {
                     I2CE::raiseError("Invalid transform file at {$file} => {$transform_file}\n" . print_r(I2CE::getFileSearch()->getSearchPath('XSLTS'), true));
                     exit(0);
                 }
             } else {
                 if (substr($transform_src, 0, 7) == 'file://') {
                     $transform_file = substr($transform_src, 7);
                 } else {
                     $transform_file = tempnam(sys_get_temp_dir(), 'XSL_REL_');
                     $trans_is_temp = true;
                     file_put_contents($transform_file, $transform_src);
                 }
             }
         }
     }
     if ($stream) {
         if ($errors = I2CE_Dumper::cleanlyEndOutputBuffers()) {
             I2CE::raiseError("Got errors:\n{$errors}");
         }
         header('Content-Type: text/xml');
         if ($transform_file) {
             $cmd = "xsltproc " . escapeshellarg($transform_file) . " " . escapeshellarg($temp_file);
             I2CE::raiseError("Transforming with: {$cmd}");
             passthru($cmd);
             unlink($temp_file);
             if ($trans_is_temp) {
                 unlink($transform_file);
             }
         } else {
             I2CE::raiseError("Reading: {$temp_file}");
             readfile($temp_file);
             unlink($temp_file);
         }
         exit(0);
     } else {
         if ($transform_file) {
             $cmd = "xsltproc " . escapeshellarg($transform_file) . " " . escapeshellarg($temp_file);
             I2CE::raiseError("Transforming with: {$cmd}");
             $contents = shell_exec($cmd);
             if ($trans_is_temp) {
                 unlink($transform_file);
             }
             unlink($temp_file);
             return $contents;
         } else {
             I2CE::raiseError("Reading: {$temp_file}");
             $contents = file_get_contents($temp_file);
             unlink($temp_file);
             return $contents;
         }
     }
 }