public function get_display_fields() { I2CE::longExecution(); $this->unsetPaging(); if (!is_array($data = $this->getResults()) || !array_key_exists('results', $data) || !($results = $data['results'])) { I2CE::raiseError("No data"); return array(); } $person_ids = array(); $id = 'primary_form+id'; $uuid = 'primary_form+csd_uuid'; $display_fields = array(); $titles = $this->get_display_field_titles(); while (is_array($row = $results->fetchRow(MDB2_FETCHMODE_ASSOC))) { I2CE::longExecution(); if (!array_key_exists('primary_form+id', $row) || !($person_id = $row['primary_form+id'])) { I2CE::raiseError("Bad:" . print_r($row, true)); continue; } $data = array(); foreach ($titles as $formfield => $label) { ///this is just to ensure the same order as the display name of the fields if (!array_key_exists($formfield, $row)) { continue; } $data[$formfield] = $row[$formfield]; } $display_fields[$person_id] = $data; } $results->free(); return $display_fields; }
protected function resaveTrainings() { $user = new I2CE_User(); $ff = I2CE_FormFactory::instance(); $ids = I2CE_FormStorage::search('person_scheduled_training_course'); foreach ($ids as $id) { I2CE::longExecution(); //to make sure we don't time out if (!($pstc = $ff->createContainer(array('person_scheduled_training_course', $id))) instanceof iHRIS_Person_Scheduled_Training_Course) { return false; //something is wrong } $pstc->populate(); //populate will recacluate the average field $pstc->save($user); //saves the new calculated average field to the databse $pstc->cleanup(); //free up memory } return true; }
protected function doRemap($form, $field, $id) { $obj = $this->ff->createContainer($id); if (!$obj instanceof I2CE_List) { $this->pushError("ID {$id} does not refer to a list"); //needs to be localized return false; } $obj->populate(); $newform = '0'; $newid = '0'; $rField = $obj->getField('remap'); if (!$rField instanceof I2CE_FormField_REMAP || !($newform = $rField->getMappedForm()) || !($newid = $rField->getMappedID())) { $this->pushError("No remapping data has been set for {$id} [{$newform}|{$newid}]" . get_class($rField)); return false; } $where = array('operator' => 'FIELD_LIMIT', 'field' => $field, 'style' => 'equals', 'data' => array('value' => $id)); if (($count = count($remapIDs = I2CE_FormStorage::search($form, false, $where))) < 1) { $this->pushMessage("No fields found to remap"); return true; } $this->pushCount($count); $exec = array('max_execution_time' => 20 * 60, 'memory_limit' => 256 * 1048576); $user = new I2CE_User(); $success = true; foreach ($remapIDs as $i => $remapID) { I2CE::longExecution($exec); if (!($remapObj = $this->ff->createContainer($form . '|' . $remapID)) instanceof I2CE_Form) { $this->pushMessage("Could not create {$form}|{$remapID}", $i + 1); $success = false; continue; } $remapObj->populate(); if (!($fieldObj = $remapObj->getField($field)) instanceof I2CE_FormField_MAP) { $this->pushMessage("Field {$field} is not a map field", $i + 1); $success = false; $remapObj->cleanup(); continue; } $fieldObj->setFromDB($newform . '|' . $newid); $this->pushMessage("Remapping {$field} in {$form}|{$remapID} to be {$newform}|{$newid}", $i + 1); if (!$remapObj->save($user)) { $success = false; $this->pushMessage("Could not save {$field} in {$form}|{$remapID} to be {$newform}|{$newid}", $i + 1); } else { $this->pushMessage("Remapped {$field} in {$form}|{$remapID} to be {$newform}|{$newid}", $i + 1); } $remapObj->cleanup(); } return $success; }
/** *Loads in the requeted data from the relationship * @returns boolean True on success */ protected function loadData($as_iterator = true) { $fields = $this->getFields(); $ordering = $this->getOrdering(); I2CE::longExecution(array("max_execution_time" => 1800)); $this->data = $this->formRelationship->getFormData($this->primObj->getName(), $this->primObj->getId(), $fields, $ordering, $as_iterator); if ($as_iterator) { if (!$this->data instanceof I2CE_RelationshipData) { I2CE::raiseError("No data"); return false; } } else { if (!is_array($this->data)) { return false; } } return true; }
/** *Abstract method to render the form. Makes sure all ducks are in a row * @returns boolean true on sucess. */ public function render() { if (!is_string($this->std_form) || strlen($this->std_form) == 0) { I2CE::raiseError("No standard printed form set"); return false; } $this->stdConfig = I2CE::getConfig()->traverse('/modules/PrintedForms/forms/' . $this->std_form, false); if (!$this->stdConfig instanceof I2CE_MagicDataNode) { I2CE::raiseError("No standard printed form /modules/PrintedForms/forms/" . $this->std_form); return false; } if (!$this->stdConfig->setIfIsSet($relationship, 'relationship')) { I2CE::raiseError("No relationship set"); return false; } try { $this->rel = new I2CE_FormRelationship($relationship, $this->base_rel_config); } catch (Exception $e) { I2CE::raiseError("Could not instatiate relationship {$relationship}"); return false; } $this->layoutOptions = array('encoding' => 'ASCII', 'hyphenation_file' => 'hyph_en_US.dic', 'orientation' => 'P', 'size' => 'A4', 'rows' => 1, 'cols' => 1, 'horiz_pad' => 10, 'horiz_pad_border' => 0, 'vert_pad' => 10, 'vert_pad_border' => 0); if ($this->stdConfig->is_parent('layout_details')) { I2CE_Util::merge_recursive($this->layoutOptions, $this->stdConfig->getAsArray("layout_details")); } if (!in_array($this->layoutOptions['orientation'], array('P', 'L'))) { $this->layoutOptions['orientation'] = 'P'; } $paper_sizes = array('A0' => array(841, 1189), 'A1' => array(594, 841), 'A2' => array(420, 594), 'A3' => array(297, 420), 'A4' => array(210, 297), 'A5' => array(148, 210), 'A6' => array(105, 148), 'A7' => array(74, 105), 'A8' => array(52, 74), 'A9' => array(37, 52), 'A10' => array(26, 37), 'B0' => array(1000, 1414), 'B1' => array(707, 1000), 'B2' => array(500, 707), 'B3' => array(353, 500), 'B4' => array(250, 353), 'B5' => array(176, 350), 'B6' => array(125, 176), 'B7' => array(88, 125), 'B8' => array(62, 88), 'B9' => array(44, 62), 'B10' => array(31, 44), 'C0' => array(917, 1297), 'C1' => array(648, 917), 'C2' => array(458, 648), 'C3' => array(324, 458), 'C4' => array(229, 324), 'C5' => array(162, 229), 'C6' => array(114, 162), 'C7' => array(81, 114), 'C8' => array(57, 81), 'C9' => array(40, 57), 'C10' => array(28, 40), 'LETTER' => array(216, 279), 'LEGAL' => array(216, 356), 'JUNIOR_LEGAL' => array(203, 127), 'LEDGER' => array(432, 279), 'TABLOID' => array(279, 432)); $this->layoutOptions['size'] = strtoupper($this->layoutOptions['size']); if (!in_array($this->layoutOptions['size'], array_keys($paper_sizes))) { $this->layoutOptions['size'] = 'A4'; } if ($this->layoutOptions['orientation'] == 'P') { $this->layoutOptions['paper_size'] = $paper_sizes[$this->layoutOptions['size']]; } else { $this->layoutOptions['paper_size'] = array_reverse($paper_sizes[$this->layoutOptions['size']]); } if (!array_key_exists('border', $this->layoutOptions)) { if ($this->layoutOptions['rows'] == 1 && $this->layoutOptions['cols'] == 1) { $this->layoutOptions['border'] = 0; } else { $this->layoutOptions['border'] = 1; } } $this->layoutOptions['border'] = (int) $this->layoutOptions['border']; if ($this->layoutOptions['border'] < 0) { $this->layoutOptions['border'] = 0; } $this->layoutOptions['horiz_pad_border'] = (int) $this->layoutOptions['horiz_pad_border']; if ($this->layoutOptions['horiz_pad_border'] < 0) { $this->layoutOptions['horiz_pad_border'] = 0; } $this->layoutOptions['vert_pad_border'] = (int) $this->layoutOptions['vert_pad_border']; if ($this->layoutOptions['vert_pad_border'] < 0) { $this->layoutOptions['vert_pad_border'] = 0; } $this->layoutOptions['horiz_pad'] = (int) $this->layoutOptions['horiz_pad']; if ($this->layoutOptions['horiz_pad'] < 0) { $this->layoutOptions['horiz_pad'] = 10; } $this->layoutOptions['vert_pad'] = (int) $this->layoutOptions['vert_pad']; if ($this->layoutOptions['vert_pad'] < 0) { $this->layoutOptions['vert_pad'] = 10; } $this->layoutOptions['rows'] = (int) $this->layoutOptions['rows']; $this->layoutOptions['cols'] = (int) $this->layoutOptions['cols']; if ($this->layoutOptions['rows'] < 1) { I2CE::raiseError("Invalid rows"); return false; } if ($this->layoutOptions['cols'] < 1) { I2CE::raiseError("Invalid cols"); return false; } $this->layoutOptions['form_width'] = (int) (($this->layoutOptions['paper_size'][0] - 2 * $this->layoutOptions['horiz_pad'] - $this->layoutOptions['border'] * ($this->layoutOptions['cols'] + 1) - 2 * $this->layoutOptions['horiz_pad_border'] * $this->layoutOptions['cols']) / $this->layoutOptions['cols']); $this->layoutOptions['form_height'] = (int) (($this->layoutOptions['paper_size'][1] - 2 * $this->layoutOptions['vert_pad'] - $this->layoutOptions['border'] * ($this->layoutOptions['rows'] + 1) - 2 * $this->layoutOptions['vert_pad_border'] * $this->layoutOptions['rows']) / $this->layoutOptions['rows']); if ($this->layoutOptions['form_width'] < 10) { I2CE::raiseError("Not enough width"); return false; } if ($this->layoutOptions['form_height'] < 10) { I2CE::raiseError("Not enough height"); return false; } $this->content = $this->stdConfig->getAsArray('content'); $forms = array(); foreach ($this->ids as $id) { if (!is_string($id)) { continue; } $fs = $this->rel->getFormsSatisfyingRelationship($id); if (!is_array($fs) || count($fs) == 0) { continue; } $forms[$id] = $fs; } if (count($forms) == 0) { I2CE::raiseError("No valid forms"); return false; } $this->forms = $forms; $textProps = array('font' => 'helvetica', 'style' => '', 'size' => 12, 'alignment' => 'L', 'color' => '#000000', 'bg_color' => 'none', 'style' => ''); if ($this->stdConfig->is_parent('text_properties')) { I2CE_Util::merge_recursive($textProps, $this->stdConfig->getAsArray("text_properties")); } $this->validateTextProps($textProps); I2CE::longExecution(); return $this->_render($textProps); }
protected function createAltConfig($update_from_config) { $hash = '2245023265ae4cf87d02c8b6ba991139'; //the hash of the root node //first test to see if the alt config table is there for some reason. $db = MDB2::singleton(); $qry = 'SHOW TABLES LIKE "config_alt"'; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot access database")) { return false; } if ($result->numRows() > 0) { I2CE::raiseError("Alt Config table has already been created"); $qry = "SELECT count(*) as count FROM `config_alt` WHERE `path_hash` = '{$hash}'"; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot access config_alt")) { return false; } if ($row = $result->fetchRow()) { if ($row->count == 1) { I2CE::raiseError("Alt config has been created and seeded"); return true; } } } if ($update_from_config) { //now see if the tmp alt config table is there and if so drop it. $qry = 'SHOW TABLES LIKE "config_alt_tmp"'; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot access database")) { return false; } if ($result->numRows() > 0) { I2CE::raiseError("Temporary Alt Config table has already been created -- Dropping it"); $qry = 'DROP TABLE `config_alt_tmp`'; if (I2CE::pearError($db->query($qry), "Cannot drop temporary alternative config table")) { return false; } } $create = 'config_alt_tmp'; } else { $create = 'config_alt'; } $qrs = array("CREATE TABLE IF NOT EXISTS `{$create}` (\n `path_hash` char(32) NOT NULL,\n `parent` text NOT NULL,\n `name` text NOT NULL,\n `type` tinyint(4) NOT NULL,\n `value` longtext CHARACTER SET utf8 default NULL,\n PRIMARY KEY (`path_hash`),\n KEY (`parent` (130) ),\n KEY `path` ( `parent` ( 130 ), `name` (30) )\n) ENGINE=InnoDB DEFAULT CHARSET=utf8", "INSERT INTO `{$create}` (`path_hash`,`parent`,`name`,`type`,`value`) VALUE ('{$hash}','','',0,NULL)"); foreach ($qrs as $qry) { $result = $db->query($qry); if (I2CE::pearError($result, "Cannot execute query:\n{$qry}")) { I2CE::raiseError("Could not initialize temporary alternate config table"); return false; } } if (!$update_from_config) { return true; } $qry = 'SHOW TABLES LIKE "config"'; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot access database")) { return false; } if ($result->numRows() == 0) { I2CE::raiseError("Attempting to update to alternative config table from existing config table, but the config table does not exist"); return false; } I2CE::longExecution(); I2CE::raiseError("Inserting entries into config_alt table from config table"); $qry = "REPLACE INTO config_alt_tmp(path_hash,parent,name,type,value) SELECT \n hash AS path_hash,\n IF ( locate('/',path) > 0 , CONCAT('/',SUBSTR(path,8,length(path) -7 - locate('/', reverse(path)))) , IF (locate(':',path), '/','' ) ) as parent,\n IF ( locate('/',path) > 0 , SUBSTR(path,length(path) - locate('/', reverse(path)) +2 ), IF (locate(':',path),SUBSTR(path,locate(':',path)+1),'') ) as name\n ,type,value\nfrom config WHERE ( locate(':',path) > 0 OR path = 'config' )"; if (I2CE::pearError($db->query($qry), "Cannot update alternative config table from existing table")) { return false; } $qry = "RENAME TABLE `config_alt_tmp` TO `config_alt`"; if (I2CE::pearError($db->query($qry), "Cannot rename temporary alternative config table")) { return false; } return $this->setupMagicDataStorage(); }
protected function generateTemplate() { I2CE::longExecution(array("max_execution_time" => 1800)); if (!class_exists('I2CE_Odf')) { I2CE::raiseError("Please turn on the printed forms module"); return false; } $odf_config = array('DELIMITER_LEFT' => '{{{', 'DELIMITER_RIGHT' => '}}}', 'ZIP_PROXY' => 'PhpZipProxy'); $odf = new I2CE_Odf($this->template_file, $odf_config); $segment_style = 'global'; if (array_key_exists('segment_style', $this->args) && is_string($this->args['segment_style'])) { $segment_style = $this->args['segment_style']; } $method = 'generateTemplate_' . $segment_style; if (!$this->_hasMethod($method)) { I2CE::raiseError("Invalid method: {$method}"); return false; } $this->{$method}($odf); I2CE::raiseError("Outputing template"); $this->outputTemplate($odf, basename($this->template_file, '.odt')); }
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; } } }
/** * Get the system status. http://www.ursula1000.com/ * @returns string 'gogo' means we are good. 'needs_installation' means we need to initialize. 'needs_upgrade' */ public static function allSystemsAreGoGo($site_module_file, $check_time = false) { $site_module_file = I2CE_FileSearch::realPath($site_module_file); $config = self::getConfig(); $site_module = ''; $config->setIfIsSet($site_module, '/config/site/module'); $mod_factory = I2CE_ModuleFactory::instance(); $installed = ''; $config->setIfIsSet($installed, "/config/site/installation"); if ($installed == '') { return 'needs_install'; } if (!$site_module) { self::raiseError("Cannot determine what your site is. This is bad.\n({$site_module_file})", E_USER_ERROR); return 'no_site'; } if (substr($installed, 0, 11) == 'in_progress') { if (array_key_exists('HTTP_HOST', $_SERVER)) { self::raiseError("Warning: Trying to access the site while update is in progress. Do you know what you are doing?"); } else { self::raiseError("Warning: Trying to access the site while update is in progress. Run --update=1 --force-restart=1 to restart"); } return $installed; } else { if ($installed == 'done') { $previous_site_file = ''; if ($config->setIfIsSet($previous_site_file, '/config/data/' . $site_module . '/file')) { $previous_site_file = I2CE_FileSearch::realPath($previous_site_file); if ($previous_site_file != $site_module_file) { I2CE::raiseError("Need reinstall ({$previous_site_file}) != ({$site_module_file}) for site module {$site_module}"); return 'needs_reinstall'; } } $mod_factory = I2CE_ModuleFactory::instance(); if (!$mod_factory->isEnabled($site_module)) { return 'needs_reenable'; } //$installed == 'done' and the site module/site module file are good. This should be the 'usual state of affairs' $times = array(); $config->setIfIsSet($times, '/I2CE/update/times', true); if (!isset($times['stale'])) { $times['stale'] = 10; } if (!$check_time) { if ($times['stale'] < 0 || !isset($times['last'])) { $check_time = true; } else { if (isset($times['last'])) { $check_time = time() - $times['last'] > $times['stale']; } } } if ($check_time) { I2CE::longExecution(null, false); //we are due to check the config files/modules for updates $config->__set("/I2CE/update/times/last", time()); $updates = $mod_factory->getOutOfDateConfigFiles(); $config->__set("/I2CE/update/times/last", time()); if (count($updates['updates']) + count($updates['removals']) > 0) { return 'needs_upgrade'; } } return 'done'; } else { self::raiseError("Unknown installation status:" . $installed, E_USER_ERROR); return 'unknown'; } } }
/** * 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; }
/** *Abstract method to render the form. Makes sure all ducks are in a row * @returns boolean true on sucess. */ public function render() { if (count($this->ids) != 1) { I2CE::raiseError("Exactly one ID must be specifed (currently)"); return false; } if (!is_string($this->std_form) || strlen($this->std_form) == 0) { I2CE::raiseError("No standard printed form set"); return false; } $this->stdConfig = I2CE::getConfig()->traverse('/modules/PrintedForms/forms/' . $this->std_form, false); if (!$this->stdConfig instanceof I2CE_MagicDataNode) { I2CE::raiseError("No standard printed form /modules/PrintedForms/forms/" . $this->std_form); return false; } if (!$this->stdConfig->setIfIsSet($relationship, 'relationship')) { I2CE::raiseError("No relationship set"); return false; } try { $this->rel = new I2CE_FormRelationship($relationship, $this->base_rel_config); } catch (Exception $e) { I2CE::raiseError("Could not instatiate relationship {$relationship}"); return false; } $template = false; $template_upload = false; if ($this->stdConfig->setIfIsSet($template_upload, 'template_upload', true) && array_key_exists('content', $template_upload) && $template_upload['content'] && array_key_exists('name', $template_upload) && $template_upload['name']) { $name = $template_upload['name']; $pos = strrpos($name, '.'); if ($pos !== false) { $name = substr($name, 0, $pos); } $this->template_file = tempnam(sys_get_temp_dir(), basename($name . '_')) . '.odt'; file_put_contents($this->template_file, $template_upload['content']); } else { if ($this->stdConfig->setIfIsSet($template, 'template')) { $this->template_file = I2CE::getFileSearch()->search('ODT_TEMPLATES', $template); if (!$this->template_file) { I2CE::raiseError("No template file found from {$template}"); return false; } } else { I2CE::raiseError("No template set"); return false; } } $template_contents = new ZipArchive(); if ($template_contents->open($this->template_file) !== TRUE) { I2CE::raiseError("Could not extract odt file"); return; } $this->template_vars = array(); for ($i = 0; $i < $template_contents->numFiles; $i++) { $stats = $template_contents->statIndex($i); if ($stats['name'] != 'content.xml') { continue; } $matches = array(); //pull out all the template variables for processing. preg_match_all('/{{{([0-9a-zA-Z_\\-\\+\\,\\=\\.]+(\\(.*?\\))?)}}}/', $template_contents->getFromIndex($i), $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!is_array($match) || count($match) < 2 || !is_string($match[1]) || strlen($match[1]) == 0) { continue; } $this->template_vars[] = $match[1]; } $this->template_vars = array_unique($this->template_vars); } $this->content = $this->stdConfig->getAsArray('content'); $forms = array(); foreach ($this->ids as $id) { if (!is_string($id)) { continue; } $fs = $this->rel->getFormsSatisfyingRelationship($id); if (!is_array($fs) || count($fs) == 0) { continue; } $forms[$id] = $fs; } if (count($forms) == 0) { I2CE::raiseError("No valid forms"); return false; } $this->forms = $forms; $textProps = array(); I2CE::longExecution(); $success = $this->_render($textProps); return $success; }
break; } } } if (!$class_found) { $debug = debug_backtrace(); $msg = "Cannot find the defintion for class ({$class_name})"; if (array_key_exists(1, $debug) && array_key_exists('line', $debug[1])) { $msg .= "called from line " . $debug[1]['line'] . ' of file ' . $debug[1]['file']; } $msg .= "\nSearch Path is:\n" . print_r(I2CE::getFileSearch()->getSearchPath('CLASSES'), true); // I2CE::raiseError( $msg, E_USER_NOTICE); } } spl_autoload_register('i2ce_class_autoload'); I2CE::longExecution(array('memory_limit' => 512 * 1048576)); /***************************************** * make the module list pages *****************************************/ $module_packages = array(); $wout = array(); $wout['all'] = "__PAGE:iHRIS Module List\nThis is a list of all the modules available in the iHRIS Suite\n"; foreach ($packages as $pkg => $info) { $wout[$pkg] = '__PAGE:' . $info['name'] . " Module List\n"; $wout[$pkg] .= "This is a list of all modules available in version " . $versions[$pkg] . ' of the package [' . $info['bzr'] . ' ' . $info['name'] . "]\n"; } $comps = array('atleast' => 'at least ', 'atmost' => 'at most ', 'exactly' => 'exactly ', 'greaterthan' => 'greater than ', 'lessthan' => 'less than '); ksort($found_modules, SORT_STRING); $classObjs = array(); $fuzzys = array(); $fuzzys_CLI = array();
/** * 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 }
/** * Checks to make sure there is the given index on the last_entry. If it does not exist it adds it. * @param string $index_name * @param mixed $fields. Either a string or array of string, the fields we want to make an index on * * If the field names need backtics, you are required to provide them */ protected function createIndexOnLastEntry($index_name, $fields) { if (is_string($fields)) { $fields = array($fields); } if (!is_array($fields) || count($fields) == 0) { I2CE::raiseError("Invalid fields"); return false; } $db = MDB2::singleton(); $qry = "SELECT null FROM information_schema.statistics WHERE\ntable_schema = '{$db->database_name}'\nand table_name = 'last_entry'\nand index_name = '{$index_name}'"; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot execute query:\n{$qry}")) { return false; } if ($result->numRows() > 0) { //the index has already been created. return true; } //the index has not been created. I2CE::longExecution(); //it may take a shilw I2CE::raiseError("Creating index '{$index_name}' on the field(s) " . implode(",", $fields) . " of last_entry. This may take a long time if you have many records."); $qry = "CREATE INDEX {$index_name} ON last_entry (" . implode(',', $fields) . ")"; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot execute query:\n{$qry}")) { return false; } return true; }
/** * Generate the the exported report * @returns string */ public function generateExport() { I2CE::longExecution(array("max_execution_time" => 1800)); $style = $this->getStyle(); $formfields = $this->getDisplayFieldsData(); $headers = array('#'); foreach ($formfields as $formfield => $data) { if (!$data) { continue; } $headers[$formfield] = $data['header']; } $this->cols = array_keys($headers); switch ($style) { case 'xml': $post = " </reportData>\n</ihrisReport>\n"; array_shift($this->cols); $pre = $this->getXMLMetaData($headers); break; case 'tab': $post = ''; $pre = $this->processResultRowArray($headers); break; case 'csv': $post = ''; $pre = $this->processResultRowArray($headers); break; case 'rawjson': $post = '}'; unset($headers[0]); $pre = '{"headers":' . json_encode($headers) . ',"data":'; break; case 'json': $post = ']'; unset($headers[0]); $pre = '[' . json_encode(array_values($headers)); break; default: //html snippet $name = addslashes(str_replace(array(' ', "\n", "\t"), array('_', ' ', '_'), $this->config->display_name)); $pre = "<table id='" . addslashes($this->view) . " name='{$name}'>\n"; $post = '</table>'; $pre .= $this->processResultRowArray($headers); break; } $data = $this->getResults(); $out = $this->processResults($data, $resultsNode = null); $out = $pre . $out . $post; if ($style == 'xml' && $this->transform) { $xmlDoc = new DOMDocument(); if (!@$xmlDoc->loadXML($out)) { I2CE::raiseError("Could not load source document"); return $out; } $xslDoc = new DOMDocument(); if (!array_key_exists('xslts', $this->defaultOptions) || !is_array($this->defaultOptions['xslts']) || !@$xslDoc->loadXML($this->defaultOptions['xslts'][$this->transform]['definition'])) { I2CE::raiseError("Could not load transform"); return false; } $proc = new XSLTProcessor(); if (!@$proc->importStylesheet($xslDoc)) { I2CE::raiseError("Could not import style sheet"); return false; } if (($out = @$proc->transformToXML($xmlDoc)) === false) { I2CE::raiseError("Could not transform accoring to xsl"); return false; } } switch ($this->compression) { case 'bz2': return bzcompress($out); case 'gz': return gzencode($out, 9); case 'zip': if (!@class_exists('ZipArchive', false)) { I2CE::raiseError("zip not present"); $this->compression = false; break; } $zip = new ZipArchive(); $temp_file = tempnam(sys_get_temp_dir(), 'EXPORT_ZIP'); if ($zip->open($temp_file) !== true) { I2CE::raiseError("Could not ceaete zip on {$temp_file}"); $this->compression = false; break; } $filename = $this->getFileName(null, false); $zip->addFromString($filename, $out); $zip->close(); $out = file_get_contents($temp_file); break; default: break; } return $out; }
/** * Migrate field data from an old setMap reference to a new MAP form field type. * The old data should have been saved in a migrate_data magic data (see {@link storeMigrateData}). * @param string $form_name * @param array $field_list The list of fields that need to be changed as an array of field => map_form. * Optionally the field list can be: * array( "field" => array( "prev_field" => "prev_map_form" ) ) * The field will get the old value from the list of fields (with mapped forms) * for when the field name was changed. * @param string $migrate_path Where the migrate data has been saved. * @param I2CE_User $user The user to save the new form field. * @return boolean */ public static function migrateField($form_name, $field_list, $migrate_path, $user) { I2CE::longExecution(); $factory = I2CE_FormFactory::instance(); $factory->clearFieldData($form_name); $storage = self::getStorageMechanism($form_name, true); $migrate_node = I2CE::getConfig()->traverse($migrate_path, true, false); $field_node = $migrate_node->traverse("fields/{$form_name}"); if ($field_node instanceof I2CE_MagicDataNode) { foreach ($field_node as $id => $fields) { if (!$fields instanceof I2CE_MagicDataNode) { I2CE::raiseError("Invalid data stored in MagicData: {$migrate_path} fields/{$form_name}"); return false; } $obj = $factory->createContainer($form_name . '|' . $id, true); foreach ($field_list as $field => $map_form) { $new_value = self::getMigratedValue($migrate_node, $form_name, $id, $field, $map_form); if (is_array($new_value) && array_key_exists('old_value', $new_value) && !$new_value['old_value']) { // No old value so nothing to do here. continue; } if (is_array($new_value) && array_key_exists('new_value', $new_value) && $new_value['new_value']) { $fieldObj = $obj->getField($field); if (!$fieldObj instanceof I2CE_FormField) { I2CE::raiseError("Failed to get new field for {$form_name}+{$field} "); return false; } $fieldObj->setFromDB($new_value['new_value']); $fieldObj->setStaticAttribute("DBEntry_change_type", I2CE_FormStorage_Mechanism::CHANGE_UPDATE); if (!$storage->FF_save($fieldObj, false, $user)) { I2CE::raiseError("Failed to save new field for {$form_name} {$field} " . $new_value['new_value']); return false; } } else { I2CE::raiseError("Migrate: Failed to get new value for {$id} {$map_form} {$field}"); return false; } } $obj->cleanup(); unset($obj); $field_node->{$id}->unpopulate(true, true); } } $migrate_node->unpopulate(true, true); return true; }
protected function import($file, $ignore_ids = false) { $reader = new XMLReader(); $reader->open($file, null, 1 << 19); $save_ids = array(); $count = 0; $exec = array('max_execution_time' => 20 * 60, 'memory_limit' => 256 * 1048576); $importer = new I2CE_FormRelationship_Importer(); if (array_key_exists('HTTP_HOST', $_SERVER)) { $importer->setMessageCallback(array($this, 'pushMessage')); } $defaults = array('ignoreids' => $ignore_ids ? '1' : '0', 'nomatching' => '', 'invalid' => ''); $next = false; while ($next || $reader->read()) { $next = false; if ($reader->nodeType != XMLReader::ELEMENT) { continue; } switch ($reader->name) { case 'relationshipCollection': foreach ($defaults as $key => $val) { if (($v = $reader->getAttribute($key)) !== null) { $defaults[$key] = $v; } } while ($reader->read()) { //skip to a relationship sub-element if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'relationship') { break; } } //break; - purposefully do not break as we want to get process any relationship under a relationshipCollection //break; - purposefully do not break as we want to get process any relationship under a relationshipCollection case 'relationship': I2CE::longExecution($exec); $node = $reader->expand(); $doc = new DOMDocument(); $i_node = $doc->importNode($node, true); foreach ($defaults as $k => $v) { $i_node->setAttribute($k, $v); } $new_ids = $importer->loadFromXML($i_node); $save_ids = array_merge($save_ids, $new_ids); if (array_key_exists('HTTP_HOST', $_SERVER) && count($new_ids) > 0) { $this->pushMessage("Imported records with ids:\n" . implode(",", $new_ids)); } $count++; $reader->next(); $next = true; break; default: if (array_key_exists('HTTP_HOST', $_SERVER)) { $this->pushError("Unrecognized data type: " . $reader->name); } break; } } $summary = "Import Summary: (processed {$count} relationships)\n"; foreach ($save_ids as $save_id => $msg) { $summary .= str_replace("\n", "\n - ", $msg) . "\n"; } I2CE::raiseMessage($summary); $this->pushMessage($summary); return true; }
$versions = array('i2ce' => $main_version, 'manage' => $main_version, 'common' => $main_version, 'qualify' => $main_version, 'textlayout' => $main_version); foreach ($versions as $pkg => $vers) { $versions[$pkg] = $vers . '-release'; $packages[$pkg]['bzr'] = 'https://launchpad.net/' . $packages[$pkg]['pkg_name']; $packages[$pkg]['bzr_files'] = "http://bazaar.launchpad.net/~intrahealth+informatics/" . $packages[$pkg]['pkg_name'] . "/{$vers}-release/files/head:"; $packages[$pkg]['bzr_annotate_files'] = "http://bazaar.launchpad.net/~intrahealth+informatics/" . $packages[$pkg]['pkg_name'] . "/{$vers}-release/annotate/head:"; $packages[$pkg]['bzr_translate'] = "http://translations.launchpad.net/" . $packages[$pkg]['pkg_name'] . "/trunk/+pots/"; } } /************************************* * * processing of modules * *******************************************/ $found_modules = getAvailableModules(); I2CE::longExecution(); /*********************************************** * * go througgh each of the module and pull out the magic data nodes when/where they are defined. * ************************************/ function processConfigFile($module, $top_module, $file, &$md_nodes, &$child_nodes) { global $packages, $module_packages; $mod_file = basename($file); $current_pkg = false; foreach ($packages as $pkg => $info) { if ($top_module == $info['top_module']) { $module_packages[$module] = $pkg; $current_pkg = $pkg; break;
/** * Explode and execute a * @param string $sql a nuch of sql queries * @param boolean $transact defaults to true meaning that the whole script is executed in a transaction. If a string, it is the name of a savepoint to rollback to/release * @param MDB2 connection $db * @param string $delimiter. Defaults to ';'. Needs to be exactly one character * @returns boolean true on sucess or false */ public static function explodeAndExecuteSQLQueries($sql, $db, $transact = true, $delimiter = ';') { if (!is_string($sql)) { I2CE::raiseError("Invalid SQL script"); return false; } I2CE::longExecution(); if ($db->supports('transactions')) { if ($transact === true) { $db->beginTransaction(); I2CE::raiseError("Beginning transaction"); } else { if (is_string($transact)) { if ($db->in_transaction) { $db->query('SAVEPOINT $transact'); } else { //we aren't in a transaction, so don't use the savepoint $transact = true; $db->beginTransaction(); I2CE::raiseError("Beginning transaction"); } } } } $len = strlen($sql); $in_string_single = false; $in_string_double = false; $in_string_back = false; $in_comment = false; $in_comment_ml = false; $beg_qry = 0; $t_qry = ''; for ($i = 0; $i < $len; $i++) { switch ($sql[$i]) { case "\n": if ($in_comment) { $in_comment = false; $beg_qry = $i + 1; //beginning of query is next line } if ($in_comment || $in_comment_ml || $in_string_single !== false || $in_string_double || $in_string_back) { continue; } if (preg_match('/^DELIMITER (.)$/', trim(substr($sql, $beg_qry, $i - $beg_qry)), $matches)) { $delimiter = $matches[1]; $beg_qry = $i + 1; //beginning of query is next line } continue; case "-": if ($in_comment || $in_comment_ml || $in_string_single !== false || $in_string_double || $in_string_back) { continue; } if ($i > 0 && $sql[$i - 1] == '-') { $in_comment = true; $t_qry .= $t_qry . trim(substr($sql, $beg_qry, $i - 1 - $beg_qry)); $beg_qry = -1; } break; case "#": if ($in_comment || $in_comment_ml || $in_string_single !== false || $in_string_double || $in_string_back) { continue; } $in_comment = true; $t_qry .= $t_qry . trim(substr($sql, $beg_qry, $i - $beg_qry)); $beg_qry = $i + 1; break; case '*': if ($in_comment || $in_string_single !== false || $in_string_double || $in_string_back) { continue; } if ($in_comment_ml) { if ($i + 2 < $len && $sql[$i + 1] == '/') { $in_comment_ml = false; $beg_qry = $i + 2; } } else { if ($i > 0 && $sql[$i - 1] == '/') { $in_comment_ml = true; $t_qry .= $t_qry . trim(substr($sql, $beg_qry, $i - 1 - $beg_qry)); $beg_qry = $i + 1; } } continue; break; case "`": if ($in_comment || $in_comment_ml) { continue; } if ($in_string_back) { $in_escape_slash = false; $in_escape_back = false; if ($i > 0) { if ($sql[$i - 1] == '\\') { $in_escape_slash = true; //can't have a \ apearing in a table or field name } $j = $i - 1; while ($sql[$j] == '`') { $in_escape_back = !$in_escape_back; $j--; } } if (!$in_escape_slash && !$in_escape_back) { $in_string_back = false; } } else { if ($in_string_single === FALSE && !$in_string_double) { $in_string_back = true; } } continue; break; case '"': if ($in_comment || $in_comment_ml) { continue; } if ($in_string_double) { $in_escape_slash = false; $in_escape_double = false; if ($i > 9) { $j = $i - 1; while ($sql[$j] == '\\') { $in_escape_slash = !$in_escape_slash; $j--; } $j = $i - 1; while ($sql[$j] == '"') { $in_escape_double = !$in_escape_double; $j--; } } if (!$in_escape_slash && !$in_escape_double) { $in_string_double = false; } } else { if ($in_string_single === false && !$in_string_back) { $in_string_double = true; } } continue; break; case "'": if ($in_comment || $in_comment_ml) { continue; } if ($in_string_single !== false) { $in_escape_slash = false; if ($i > 0) { $j = $i - 1; while ($j > $in_string_single) { if ($sql[$j] == '\\') { $in_escape_slash = !$in_escape_slash; $j--; } else { break; } } } if (!$in_escape_slash) { $in_string_single = false; } } else { if (!$in_string_back && !$in_string_double) { $in_string_single = $i; } } continue; break; case $delimiter: if ($in_string_single !== false || $in_string_double || $in_string_back || $in_comment || $in_comment_ml) { continue; } $qry = trim($t_qry . trim(substr($sql, $beg_qry, $i - $beg_qry))); $beg_qry = $i + 1; $t_qry = ''; if (!$qry) { continue; } $result = $db->query($qry); if (I2CE::pearError($result, "Cannot execute query:\n{$qry}")) { if ($db->in_transaction) { if ($transact === true) { I2CE::raiseError("Rolling Back"); $db->rollback(); } else { if (is_string($transact)) { I2CE::raiseError("Rolling Back to savepoint {$transact}"); $db->query("ROLLBACK TO SAVEPOINT {$transact}"); } } } if ($transact) { I2CE::getConfig()->clearCache(); } return false; } continue; break; default: break; } } //now make sure we pick up the last query $qry = trim($t_qry . trim(substr($sql, $beg_qry))); if ($qry) { $result = $db->query($qry); if (I2CE::pearError($result, "Cannot execute query:\n{$qry}")) { if ($db->in_transaction) { if ($transact === true) { I2CE::raiseError("Rolling Back"); $db->rollback(); } else { if (is_string($transact)) { I2CE::raiseError("Rolling Back to savepoint {$transact}"); $db->query("ROLLBACK TO SAVEPOINT {$transact}"); } } } if ($transact) { I2CE::getConfig()->clearCache(); } return false; } } //we are done if ($db->in_transaction) { if ($transact === true) { I2CE::raiseError("Commiting"); return $db->commit() == MDB2_OK; } if (is_string($transact)) { $db->query("RELEASE SAVEPOINT {$transact}"); I2CE::raiseError("Released savepoint {$transact}"); } return true; } else { return true; } }
protected static function _updateModules($updates, $removals = array(), $optional_excludes = array(), $disables = array()) { I2CE::raiseError("Updating Modules"); //make sure everything is nice and fresh clearstatcache(); $mod_factory = I2CE_ModuleFactory::instance(); $exec = array('max_execution_time' => 20 * 60, 'memory_limit' => 256 * 1048576); I2CE::longExecution($exec); if (!is_array($updates)) { $updates = array($updates); } if (!is_array($removals)) { $removals = array($removals); } $msg = "Will attempt to update:\n"; foreach (array('Updates' => $updates, 'Removals' => $removals, 'Disables' => $disables) as $k => $v) { if (count($v) > 0) { $msg .= "\t{$k}:\n\t\t" . implode(',', $v) . "\n"; } } I2CE::raiseError($msg); $storage = I2CE::getConfig(); $tmp_storage = I2CE_MagicData::instance("temp_ModuleFactory"); $configurator = new I2CE_Configurator($tmp_storage); if ($storage->setIfIsSet($sitemodule, "config/site/module")) { I2CE::raiseError("Site is set at " . $storage->getPath() . ' to be ' . $sitemodule); //make sure the site direcotry is added in to the config path. $data = $configurator->checkRequirements($updates, $disables, $removals, $mod_factory->getEnabled(), $sitemodule); } else { I2CE::raiseError("Site is not set at " . $storage->getPath()); $data = $configurator->checkRequirements($updates, $disables, $removals, $mod_factory->getEnabled()); } //note that checkRequirements has the result of putting _all_ valid config module metadata under /config/data of $tmp_storage if (isset($data['failure'])) { $storage->clearCache(); I2CE::raiseError("Installation failed: " . $data['failure']); return false; } foreach (array_keys($data['removals']) as $shortname) { if (!$mod_factory->disable($shortname)) { $storage->clearCache(); I2CE::raiseError("Unable to disable {$shortname}", E_USER_NOTICE); return false; } } //now we remove from the requirements list anything that is already enabled and up-to-date if (count($data['moved']) > 0) { I2CE::raiseError("Found the following in another location. Attempting to move:" . implode(',', array_keys($data['moved']))); I2CE::setupFileSearch(array(), true); //reset the file search and clear its cache I2CE::getFileSearch()->addPath('MODULES', dirname(dirname(__FILE__)), 'EVEN_HIGHER'); } $skipped = array(); $moved = array(); foreach ($data['requirements'] as $shortname => $file) { if (!$mod_factory->isEnabled($shortname)) { continue; } if ($mod_factory->isUpToDate($shortname, $file) && $mod_factory->isUpToDateModule($shortname)) { //everything is in the correct place and up to date. $skipped[] = $shortname; $mod_factory->loadPaths($shortname, null, true); //for the loading of all categories for this module $storage->config->data->{$shortname}->file = $data['requirements'][$shortname]; I2CE::raiseError("Updated {$shortname} config file to be " . $data['requirements'][$shortname]); unset($data['requirements'][$shortname]); //this module is enabled and the config is up-to-date so we dont need to do anything continue; } //let us see if this module has been moved if (!$storage->__isset("config/data/{$shortname}")) { continue; } if (!$tmp_storage->__isset("config/data/{$shortname}")) { continue; } $meta = $storage->config->data->{$shortname}; $tmp_meta = $tmp_storage->config->data->{$shortname}; foreach (array("hash", "last_access") as $key) { if (!isset($meta->{$key}) || !isset($tmp_meta->{$key}) || $tmp_meta->{$key} !== $meta->{$key}) { continue 2; } } $class_file = null; $tmp_meta->setIfIsSet($class_file, "class/file"); if ($class_file && ($class_file = I2CE_FileSearch::realPath($class_file))) { if (!$meta->__isset("class/hash")) { continue; } if (!is_readable($class_file)) { continue; } $contents = file_get_contents($class_file); if (!$contents) { continue; } if ($meta->class->hash !== md5($contents)) { continue; } } $mtimes = array(); foreach (array("class/file", "file") as $f) { if (!isset($tmp_meta->{$f})) { continue; } @($mtimes[$f] = filemtime(I2CE_FileSearch::realPath($tmp_meta->{$f}))); if (!$mtimes[$f]) { continue 2; } } if (false == $mod_factory->checkLocalesUpToDate($shortname, $class_file)) { //the locales for this module are not up to date continue; } //we made it here. we can skip the update. I2CE::raiseError("Able to move config file for {$shortname} from:\n " . $meta->file . "\nto:\n " . $tmp_meta->file); foreach (array("class/file" => "class/last_access", "file" => "last_access") as $f => $a) { $val = null; $tmp_meta->setIfIsSet($val, $f); if ($val === null) { continue; } $meta->{$f} = $val; $meta->{$a} = $mtimes[$f]; $tmp_meta->{$a} = $mtimes[$f]; } unset($data['requirements'][$shortname]); //this module is enabled and the config is up-to-date so we dont need to do anything $mod_factory->loadPaths($shortname, null, true); //for the loading of all categories for this module $moved[] = $shortname; } if (count($skipped) > 0) { I2CE::raiseError("Skipping update on the following up-to-date modules:" . implode(',', $skipped)); } if (count($moved) > 0) { I2CE::raiseError("Moved the following modules:" . implode(',', $moved)); } I2CE::raiseError("Attempting to update/enable the following out of date modules: " . implode(',', array_keys($data['requirements']))); //make sure all of our class paths for existing moduels are loaded. $good_modules = array_diff($mod_factory->getEnabled(), $data['removals'], array_keys($data['requirements'])); I2CE::raiseError("The following modules class paths are being added:\n\t" . implode(',', $good_modules)); $mod_factory->loadPaths($good_modules, 'CLASSES', true); if (!array_key_exists('optional', $data) || !is_array($data['optional'])) { $data['optional'] = array(); } if (is_string($optional_excludes)) { $optional_excludes = array($optional_excludes); } if (!is_array($optional_excludes)) { $optional_excludes = array(); } $to_enable = array_merge($data['requirements'], $data['optional']); //while (count ($data['requirements']) > 0) { I2CE::raiseError("Trying to enable the following required:\n" . implode(" ", array_keys($data['requirements']))); I2CE::raiseError("Trying to enable the following optional:\n" . implode(" ", array_keys($data['optional']))); I2CE::raiseError("Trying to enable the following:\n" . implode(" ", array_keys($to_enable))); while (count($to_enable) > 0) { $shortname = key($to_enable); // reset ($data['requirements']); // $shortname = key($data['requirements']); if (!is_string($shortname) || strlen($shortname) == 0) { I2CE::raiseError("Invalid Shortname"); continue; } $file = array_shift($to_enable); if (array_key_exists($shortname, $data['optional']) && in_array($shortname, $optional_excludes)) { continue; } $old_vers = '0'; $storage->setIfIsSet($old_vers, "/config/data/{$shortname}/version"); $new_vers = null; $tmp_storage->setIfIsSet($new_vers, "/config/data/{$shortname}/version"); $mod_config = $tmp_storage->config->data->{$shortname}; $storage->__unset("/config/data/{$shortname}"); //set the module's metadata to the new stuff. $storage->config->data->{$shortname} = $mod_config; //keep the old version set around until we know that the module was upgraded $storage->config->data->{$shortname}->version = $old_vers; if (!$tmp_storage->__isset("/config/data/{$shortname}/class/name")) { //there is no class associated in the new version of this module. if ($storage->__isset("/config/data/{$shortname}/class/name")) { //there was a class previously assoicated to this module -- remove its hooks/fuzzy methods, $mod_factory->removeHooks($shortname); unset($storage->config->data->{$shortname}->class); } } foreach (array('conflict' => 'conflict_external', 'requirement' => 'requirement_external') as $type => $key) { if ($mod_config->is_parent($key)) { foreach ($mod_config->{$key} as $ext => $req_data) { if ($req_data instanceof I2CE_MagicDataNode) { $req_data = $req_data->getAsArray(); } else { $req_data = array(); } foreach ($req_data as $req_d) { if (!is_array($req_d) || !array_key_exists('eval', $req_d) || !$req_d['eval']) { continue; } $eval = null; @eval('$eval = ' . $req_d['eval'] . ';'); if (is_bool($eval) && !$eval) { if (self::failedRequiredUpdate($shortname, $data, "Could not verify external {$type} {$ext} for {$shortname}", $configurator)) { return false; } else { continue 4; } } } } } } $mod_storage = I2CE_MagicData::instance("temp_ModuleFactory_" . $shortname); I2CE::getFileSearch()->addPath('MODULES', dirname(dirname(__FILE__)), 'EVEN_HIGHER'); $r_file = I2CE_FileSearch::realPath($file); $mod_configurator = new I2CE_Configurator($mod_storage); $s = $mod_configurator->processConfigFile($r_file, false, true, true, false); if (!is_string($s)) { if (self::failedRequiredUpdate($shortname, $data, "Could load configuration file", $configurator)) { return false; } else { continue; } } if ($s != $shortname) { //be super safe if (self::failedRequiredUpdate($shortname, $data, "Configuration shortname mismatch ({$s}/{$shortname})", $configurator)) { return false; } else { continue; } } self::processErasers($mod_config, $old_vers); $loaded = self::loadModuleMagicData($shortname, $r_file, $old_vers, $new_vers, $mod_configurator); if ($loaded === false) { if (self::failedRequiredUpdate($shortname, $data, "Could not load magic data", $configurator)) { return false; } else { continue; } } $loaded_mod_config = $mod_storage->config->data->{$shortname}; self::processErasers($loaded_mod_config, $old_vers); if (!self::preUpgradeModule($shortname, $old_vers, $new_vers, $mod_storage)) { if (self::failedRequiredUpdate($shortname, $data, "Could not pre-update module", $configurator)) { return false; } else { continue; } } //if $loaded === true, then there was no magic data to update, so we can skip the store. if (is_array($loaded) && !self::storeModuleMagicData($shortname, $old_vers, $new_vers, $mod_configurator, $loaded)) { if (self::failedRequiredUpdate($shortname, $data, "Could not store magic data", $configurator)) { return false; } else { continue; } } if (!self::upgradeModule($shortname, $old_vers, $new_vers)) { if (self::failedRequiredUpdate($shortname, $data, "Could not upgrade module", $configurator)) { return false; } else { continue; } } if (!self::postUpdateModule($shortname, $old_vers, $new_vers)) { if (self::failedRequiredUpdate($shortname, $data, "Could not post update module", $configurator)) { return false; } else { continue; } } $mod_factory->setModuleHash($shortname); $mod_factory->setModuleClassHash($shortname, false); $mod_configurator->__destruct(); $mod_configurator = null; $mod_storage->erase(); $mod_storage = null; $storage = I2CE::getConfig(); //just to make sure that any upgrades did not change the storage. this happens with i2ce install for example $storage->config->data->{$shortname}->version = $new_vers; //we updated this module. update the permanent modules config data with the temporary $mod_factory->loadPaths($shortname, null, true); //for the loading of all categories for this module } I2CE::raiseError("Enabled Modules: " . implode(',', $mod_factory->getEnabled())); return true; }
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 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 process_saves($queue, $allowed_duplicates, $allowed_invalid) { $this->raiseError("Processing " . count($queue) . " forms"); $save_ids = array(); $this->raiseError("BEGIN QUEUE PROCESSING"); $exec = array('max_execution_time' => 20 * 60, 'memory_limit' => 256 * 1048576); foreach ($queue as $queue_entry) { I2CE::longExecution($exec); if (!is_array($queue_entry) || !($join_style = $queue_entry['join_style']) || !($form_obj = $queue_entry['form_obj']) instanceof I2CE_Form) { $this->raiseError("Skipping invalid queue entry"); continue; } $msg = "imported new record"; $relparent_form_obj = $queue_entry['relparent_form_obj']; $join_field = $queue_entry['join_field']; $do_save = $queue_entry['do_save']; $form = $form_obj->getName(); $matched_obj = false; if ($form_obj instanceof I2CE_List && $join_style == 'parent_field' && !in_array($form, $allowed_duplicates) && count($unique_fields = $this->get_unique_fields($form_obj)) > 0) { $matched_obj = $this->find_matching($form_obj); if ($matched_obj instanceof I2CE_Form) { } } switch ($join_style) { case 'primary_form': $msg .= ' - primary_form'; //do nothing special break; case 'child': if ($relparent_form_obj instanceof I2CE_Form) { $form_obj->setParent($relparent_form_obj); $msg .= ' - child of ' . $relparent_form_obj->getNameId(); } //need to specify that we need to use the relationship parent form node's object that was just saved //to get the id. break; case 'parent_field': //This is a join that you would do if $join_node corresponded to a position form and had person_position in the parent form node of the relationship //in this case, you want the $position_obj to save before the $person_position_obj so that you can //set $person_position_obj to have the parent id created for $position_obj if (!$matched_obj instanceof I2CE_Form) { break; } $nameid = $matched_obj->getNameID(); if (!$relparent_form_obj instanceof I2CE_Form || !$join_field || !($join_field_obj = $relparent_form_obj->getField($join_field)) instanceof I2CE_FormField_MAP) { break; } $msg .= " - joined from {$join_field} of " . $relparent_form_obj->getNameId(); $join_field_obj->setFromDB($nameid); //Note the join_field_obj is after the current queue entry on the list. this means it will be saved later in the loop break; default: $this->raiseError("Join style {$join_style} is not supported"); break; } if (!$matched_obj instanceof I2CE_Form) { //save a new form $this->raiseError("Form instance not found, validating. (" . $form_obj->getNameID() . ")"); if (!in_array($form, $allowed_invalid)) { $form_obj->validate(); } if ($form_obj->hasInvalid()) { $this->raiseError("Form instance invalid. (" . $form_obj->getNameID() . ")\n<pre>" . htmlspecialchars($form_obj->getXMLRepresentation(false)) . "</pre>"); $msgs = array(); foreach ($form_obj as $field_name => $field_obj) { if (!$field_obj->hasInvalid()) { continue; } $t_msg = $field_obj->getInvalid(); if (is_string($t_msg)) { $t_msg .= "\nValue = " . $field_obj->getDBValue(); $msgs[] = " [" . $field_obj->getName() . "] " . $t_msg; } else { if (is_array($t_msg)) { foreach ($t_msg as $i => $tt_msg) { if (is_string($tt_msg)) { continue; } unset($t_msg[$i]); } $msgs[] = " [" . $field_obj->name() . "]" . implode(",", $t_msg) . "\nValue = " . $field_obj->getDBValue(); } } } $md5 = md5($form_obj->getXMLRepresentation(false)); $msg = "Invalid form. will not attempt save. (" . $form_obj->getNameID() . ")\n" . implode("\n", $msgs); $this->raiseError($msg); $save_ids[$md5] = $msg; } else { if ($relparent_form_obj instanceof I2CE_Form && $relparent_form_obj->getID() == '0' && $join_style == 'child') { $md5 = md5($form_obj->getXMLRepresentation(false)); $msg = "related form (" . $relparent_form_obj->getNameID() . ") is unsaved so will not attempt save (" . $form_obj->getNameID() . ") "; $this->raiseError($msg); $save_ids[$md5] = $msg; } else { if ($do_save) { if (!$form_obj->save($this->user)) { $md5 = md5($form_obj->getXMLRepresentation()); $msg = "Could not save " . $form_obj->getNameID(); $this->raiseError($msg); $save_ids[$md5] = $msg; } else { $nameid = $form_obj->getNameID(); $this->raiseError("Saved {$nameid}"); if ($queue_entry['relationship'] && $queue_entry['hash'] && $join_style == 'primary_form') { self::markProcessed($nameid, $queue_entry['relationship'], $queue_entry['hash']); } $save_ids[$nameid] = $msg; if ($join_style == 'parent_field') { if (!$relparent_form_obj instanceof I2CE_Form || !$join_field || !($join_field_obj = $relparent_form_obj->getField($join_field)) instanceof I2CE_FormField_MAP) { break; } $msg .= " - joined from {$join_field} of " . $relparent_form_obj->getNameId(); $join_field_obj->setFromDB($nameid); //Note the join_field_obj is after the current queue entry on the list. this means it will be saved later in the loop } } } } } } } return $save_ids; }
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; } } }