/** * Hooked method to marks a form as dirty (needs to be cached). * @param mixed $args. an array of two elements whose first element is a form object, the second is the user */ public function globalUpdate_hook($args) { if (!is_array($args) || !array_key_exists('form', $args)) { return; } $form = $args['form']; if ($form instanceof I2CE_Form) { $form = $form->getName(); } if (!is_string($form)) { return; } $reports = I2CE_CustomReport::getReports(); foreach ($reports as $report) { try { $rep = new I2CE_CustomReport($report); } catch (Exception $e) { continue; } if (I2CE_CustomReport::getStatus($report) == 'not_generated') { continue; } $forms = $rep->getFormsRequiredByReport(); if (!in_array($form, $forms)) { continue; } I2CE::raiseError("Dropping {$report} as it uses {$form} which has been changed in a global update"); $rep->dropTable(); } }
protected function actionGenerate($force) { /* Why not allow multiple reports to generate at once? if (count($this->request_remainder) > 1 ) { I2CE::raiseError("Requested generation of invalid report " . implode('/', $this->request_remainder)); return false; } */ if (count($this->request_remainder) == 0) { $config = I2CE::getConfig()->modules->CustomReports; $config->generate_all->volatile(true); $timeConfig = I2CE::getConfig()->traverse('/modules/CustomReports/times', true); $timeConfig->volatile(true); $fail_time = null; $timeConfig->setIfIsSet($fail_time, 'fail'); if (!is_integer($fail_time)) { $fail_time = 600; } $fail_time = (int) ((int) $fail_time * 60); $generation = 0; $timeConfig->setIfIsSet($generation, "generate_all/time"); if (!(is_integer($generation) || ctype_digit($generation)) || (int) $generation < 1) { $generation = 0; } $generation = (int) $generation; $config->setIfIsSet($status, 'generate_all/status'); if ($status === 'in_progress' && (!$force || time() - $generation < $fail_time)) { I2CE::raiseError("In progress"); return true; } $config->generate_all->status = 'in_progress'; $config->generate_all->time = time(); //update the time $reports = I2CE::getConfig()->modules->CustomReports->reports->getKeys(); $all = true; } else { $reports = $this->request_remainder; $all = false; } // //generate caches. // $wrangler = new I2CE_Wrangler(); // $cachedFormPage = $wrangler->getPage('CachedForms','cacheAll'); // if ($cachedFormPage instanceof I2CE_Page) { // $cachedFormPage->cacheAll(); // } $errors = array(); foreach ($reports as $report) { if (!I2CE_CustomReport::reportExists($report)) { I2CE::raiseError("Requested generation of report {$report} which does not exist"); $errors[] = "Requested generation of report {$report} which does not exist"; continue; } try { $reportObj = new I2CE_CustomReport($report); } catch (Exception $e) { $errors[] = "Could not instantiate the report {$report}"; continue; } if (!$reportObj->generateCache($force)) { $errors[] = "Could not generate report for {$report}"; } } foreach ($errors as $error) { $this->userMessage($error, 'notice'); } if ($all) { if (count($errors) > 0) { $config->generate_all->status = 'failed'; } else { $config->generate_all->status = 'done'; } $config->generate_all->time = time(); } return count($errors) == 0; }
/** * Create a data tree from a report of the selectable forms. Deisgned to be fed into tree select * @param array $fields * @param array $forms An unorderd array of form names whose values we allow to be selected * @param array $displayed The displayed forms for the tree * @param array $limits An array with keys form names and value limit data * @param array $orders An array with keys form names and values array of field orders for that form. * If the form name has no orders, we use default ordering for that form based on its displayed firelds * @param int $show_hidden 0=non-hidden, 1=All, 2=hidden only. Defaults to 0 * @param string $report A report name to use for the query instead of building it from form cache or directly. * @return array */ public static function buildReportTree($fields, $forms, $displayed, $limits, $orders = array(), $show_hidden = 0, $report = null) { if (!is_array($report) || !array_key_exists('report', $report)) { return array(); } $report_table = I2CE_CustomReport::getCachedTableName($report['report']); if (!$report_table) { return array(); } $map = array(); if (array_key_exists('map', $report)) { $map = $report['map']; } $where = array(); $displays = array(); $report_alias = array(); $formObjs = array(); $use_link = ''; foreach ($fields as $formfield) { list($form, $link_field) = $formfield; $ff = $form . ($link_field ? "+{$link_field}" : ""); if (array_key_exists($ff, $map)) { $report_alias[$ff] = $map[$ff]; } elseif (array_key_exists($form, $map)) { $report_alias[$form] = $map[$form]; $report_alias[$ff] = $map[$form]; } else { $report_alias[$form] = $form; $report_alias[$ff] = $form; } //if ( array_key_exists( $ff, $limits ) ) { //$limit = $limits[$ff]; //} else if (array_key_exists($report_alias[$ff], $limits)) { $limit = $limits[$report_alias[$ff]]; } elseif (array_key_exists($form, $limits)) { $limit = $limits[$form]; } else { $limit = array(); } self::addFormIdToLimit($form, $limit); $limit = self::showHiddenLimit($limit, $show_hidden); /* if ( !$show_hidden ) { $hidden = $report_alias[$ff] . '+i2ce_hidden'; $where[] = "( `$hidden` = 0 OR ISNULL( `$hidden` ) )"; } */ $disp_fields = I2CE_List::getDisplayFields($form); if (array_key_exists($form, $orders)) { $order = $orders[$form]; } else { $order = I2CE_List::getSortFields($form); } $sort_list = array(); //if ( array_key_exists( $form, $displayed ) && $displayed[$form] ) { if (array_key_exists($form, $displayed)) { $alias_form = $report_alias[$ff]; if ($displayed[$form]) { $displays[$alias_form]['form'] = $form; if ($use_link == '') { $displays[$alias_form]['link_field'] = $link_field == '' ? $link_field : "{$alias_form}+{$link_field}"; } else { $displays[$alias_form]['link_field'] = $use_link; $use_link = ''; } foreach ($disp_fields as $disp) { $displays[$alias_form]['fields'][$disp] = $alias_form . "+{$disp}"; } foreach ($order as $i => $ord) { if (!is_string($ord)) { unset($order[$i]); continue; } if ($ord[0] == '-') { $field = substr($ord, 1); $all_orders[] = "`{$alias_form}+{$field}` DESC"; } else { $field = $ord; $all_orders[] = "`{$alias_form}+{$field}` ASC"; } } } elseif ($use_link == '') { $use_link = $link_field == '' ? $link_field : "{$alias_form}+{$link_field}"; } } if (!array_key_exists($form, $formObjs)) { $formObjs[$form] = I2CE_FormFactory::instance()->createContainer($form); if (!$formObjs[$form] instanceof I2CE_Form) { I2CE::raiseError("Could not instantiate {$form}"); return array(); } } self::$curr_alias = $report_alias[$ff]; $where[] = $formObjs[$form]->generateWhereClause($limit, array("I2CE_DataTree", "getSQLField")); } $where_clause = ""; $order_by = ""; if (count($where) > 0) { $where_clause = " WHERE " . implode(' AND ', $where); } if (count($all_orders) > 0) { $order_by = " ORDER BY " . implode(',', $all_orders); } $qry = "SELECT * FROM {$report_table} {$where_clause} {$order_by}"; $db = MDB2::singleton(); I2CE::raiseMessage($qry); $res = $db->query($qry); if (I2CE::pearError($res, "Invalid report data tree query: ")) { return array(); } $phonebook = array(); $results = array(); $display_string = array(); $display_copy = $displays; while ($data = $res->fetchRow()) { foreach ($displays as $alias => $disp_data) { $id_field = strtolower($alias . "+id"); if ($data->{$id_field} == null || array_key_exists($data->{$id_field}, $phonebook)) { continue; } $curr = array(); $add_this = false; if (in_array($disp_data['form'], $forms)) { $curr['value'] = $data->{$id_field}; $add_this = true; } if (!$add_this) { $check_ok = false; foreach ($display_copy as $alias_copy => $disp_data_copy) { if ($alias_copy == $alias) { $check_ok = true; continue; } if (!$check_ok) { continue; } if (array_key_exists('link_field', $disp_data_copy) && $disp_data_copy['link_field'] != '') { $link_field_copy = $disp_data_copy['link_field']; if ($data->{$id_field} == $data->{$link_field_copy}) { $add_this = true; break; } } } } if (!$add_this) { continue; } if (!array_key_exists($disp_data['form'], $display_string)) { $display_string[$disp_data['form']] = I2CE_List::getDisplayString($disp_data['form']); } $disp_array = array(); $disp_str = $display_string[$disp_data['form']]; $disp_str_arr = explode('%s', $disp_str); $fo = $formObjs[$disp_data['form']]; $disp_count = 0; foreach ($disp_data['fields'] as $field => $dbfield) { $disp_count++; if ($dbfield == $disp_data['link_field']) { // Don't include the data from the link field since it will already be there. if ($disp_count == 1) { unset($disp_str_arr[$disp_count]); } else { unset($disp_str_arr[$disp_count - 1]); } continue; } $dbfield = strtolower($dbfield); $fieldObj = $fo->getField($field); if (!$fieldObj instanceof I2CE_FormField) { I2CE::raiseError("Could not get field {$field}"); continue; } if (isset($data->{$dbfield})) { $fieldObj->setFromDB($data->{$dbfield}); $disp_array[$field] = $fieldObj->getDisplayValue(); } else { $disp_array[$field] = null; } } $disp_str = implode('%s', $disp_str_arr); $display = vsprintf($disp_str, $disp_array); $curr['display'] = $display; $phonebook[$data->{$id_field}] =& $curr; if ($disp_data['link_field'] != '') { $link_field = $disp_data['link_field']; if (array_key_exists($data->{$link_field}, $phonebook)) { $add_to =& $phonebook[$data->{$link_field}]; if (!array_key_exists('children', $phonebook[$data->{$link_field}])) { $phonebook[$data->{$link_field}]['children'] = array(); } $phonebook[$data->{$link_field}]['children'][] =& $curr; } else { //I2CE::raiseMessage( "Couldn't find $link_field " . $data->$link_field . " in phonebook " ); } } else { $results[] =& $curr; } unset($curr); } } return $results; }
protected static function hooman($key) { if (count(self::$hooman) == 0) { self::$hooman = array('does_not_exist' => 'Does not exist', 'not_generated' => 'Not generated', 'stale' => 'Stale', 'failed' => 'Failed', 'in_progress' => 'In Progress', 'generated' => 'Generated'); if (($statusConfig = I2CE::getConfig()->traverse("/modules/CustomReports/text/report_status")) instanceof I2CE_MagicDataNode) { foreach (self::$hooman as $k => &$v) { $statusConfig->setIfIsSet($v, $k); } } } if (array_key_exists($key, self::$hooman)) { return self::$hooman[$key]; } else { return $key; } }
/** * Perform any actions for the page * * @returns boolean. true on sucess */ public function action() { $view = false; if (count($this->request_remainder) > 0) { $view = current($this->request_remainder); } $run_reports_in_bg = !array_key_exists('run_reports_in_background', $this->args) || $this->args['run_reports_in_background']; if ($run_reports_in_bg) { $use_reports = array(); if ($view) { $use_reports = array($view); } else { $report_config = I2CE::getConfig()->traverse("/modules/CustomReports", true); $bkg_time = 0; $report_config->setIfIsSet($bkg_time, "times/background"); foreach ($report_config->search_reports as $report => $report_info) { // if background generation of reports is turned off, then don't run this unless // overridden by the search report setting // When the background process runs each report will check it's own staleness // before running. $force = $report_info->traverse("force"); if ((!is_numeric($bkg_time) || $bkg_time <= 0) && !$force) { continue; } $use_reports[] = $report; } } $stale_reports = array(); foreach ($use_reports as $report) { if (!I2CE_CustomReport::isStale($report)) { continue; } $stale_reports[] = $report; } if (count($stale_reports) > 0) { $this->launchBackgroundPage("/CustomReports/generate/" . implode("/", $stale_reports)); } } $this->template->setDisplayData("limit_description", false); if ($view) { return $this->actionSearch($view); } else { return $this->actionMenu(); } //parent handles the show action return parent::action(); }
protected function displayExistingReports($contentNode, $transientOptions, $action) { $categories = $this->getReportsByCategory(); //now display the reports by category $catsNode = $this->template->appendFileById('customReports_reports_categories.html', 'div', 'existing_reports', false, $contentNode); if (!$catsNode instanceof DOMNode) { I2CE::raiseError("Could not add report categories template"); return false; } foreach ($categories as $cat => $reports) { $catNode = $this->template->appendFileById('customReports_reports_category.html', 'div', 'existing_reports_categories', false, $catsNode); if (!$catNode instanceof DOMNode) { I2CE::raiseError("Could not add report category template"); return false; } if (strlen($cat) == 0) { $cat = 'Uncategorized'; } $this->template->setDisplayDataImmediate('report_category', $cat, $catNode); foreach ($reports as $shortname) { $swissReport = $this->getChild($shortname); if (!$swissReport instanceof I2CE_Swiss_CustomReports_Report) { continue; } $name = $swissReport->getDisplayName(); $desc = $swissReport->getDescription(); if (!$name) { $name = $shortname; } $repNode = $this->template->appendFileById('customReports_reports_category_report.html', 'li', 'existing_reports_category', false, $catNode); if (!$repNode instanceof DOMNode) { I2CE::raiseError("Could not add report category template"); return false; } $reportStatus = I2CE_CustomReport::getStatus($shortname); if ($reportStatus == 'generated') { $reportLastGenerated = strftime("%c", I2CE_CustomReport::getLastGenerationTime($shortname)); } else { $reportLastGenerated = ''; } $reportHoomanStatus = I2CE_CustomReport::getStatus($shortname, true); $this->template->setDisplayDataImmediate('report_edit_link', $this->getURLRoot($action) . '/' . $shortname, $repNode); $this->template->setDisplayDataImmediate('report_save_link', $this->getURLRoot('export') . '/../' . $shortname . '?pipe=2', $repNode); $this->template->setDisplayDataImmediate('report_delete_link', $this->getURLRoot('delete') . '/../' . $shortname, $repNode); $this->template->setDisplayDataImmediate('report_generate_link', $this->getURLRoot('generate') . '/../' . $shortname, $repNode); $this->template->setDisplayDataImmediate('report_generate_force_link', $this->getURLRoot('generate_force') . '/../' . $shortname, $repNode); $this->template->setDisplayDataImmediate('report_name', $name, $repNode); $this->template->setDisplayDataImmediate('report_description', $desc, $repNode); $this->template->setDisplayDataImmediate('report_status', $reportHoomanStatus, $repNode); $this->template->setDisplayDataImmediate('report_last_generated', $reportLastGenerated, $repNode); } } return true; }
protected function displayMetaInfo($contentNode) { if (!$this->template instanceof I2CE_Template) { //this is not a web page -- maybe its xml i.e. only an instanceof I2CE_TemplateMeister I2CE::raiseError("Unexpected template type " . get_class($this->template)); return false; } $form = $this->template->query(".//*[@id='limit_form']", $contentNode); if ($form->length == 1) { //$form = $form->item(0)->setAttribute('action',$this->getBasePage() . "/show/{$this->view}/{$this->display}"); // The above was causing problems with having /show/show in the URL so I took it out. $form = $form->item(0)->setAttribute('action', $this->getBasePage() . "/{$this->view}/{$this->display}"); } else { I2CE::raiseError("Could not form node"); return false; } $formWormOptions = array('optionsMenuPositionVert' => 'mouse_above'); $this->template->addFormWorm('limit_form', $formWormOptions); $fileSearch = I2CE::getFileSearch(); if ($fileSearch->search('CSS', "customReports_display.css")) { $this->template->addHeaderLink("customReports_display.css"); } if ($fileSearch->search('CSS', "customReports_display_{$this->display}.css")) { $this->template->addHeaderLink("customReports_display_{$this->display}.css"); } $this->template->setDisplayDataImmediate('report_view_display_name', $this->config->display_name, $contentNode); $this->template->setDisplayDataImmediate('report_view_description', $this->config->description, $contentNode); $this->template->setDisplayDataImmediate('limit_paginated', $this->defaultOptions['limit_paginated'], $contentNode); $this->template->setDisplayDataImmediate('limit_page', $this->defaultOptions['limit_page'], $contentNode); $this->template->setDisplayDataImmediate('limit_per_page', $this->defaultOptions['limit_per_page'], $contentNode); $this->template->setDisplayDataImmediate('limit_offset', $this->defaultOptions['limit_offset'], $contentNode); $this->template->setDisplayDataImmediate('limit_amount', $this->defaultOptions['limit_amount'], $contentNode); $this->template->setDisplayDataImmediate('sort_order', $this->defaultOptions['sort_order'], $contentNode); $time = I2CE_CustomReport::getLastGenerationTime($this->config->report); if ($time) { $cache_msg = "Report was generated at: " . strftime("%c", $time); } else { $cache_msg = "Report has not been generated"; } $this->template->setDisplayDataImmediate('report_time', $cache_msg); $has_relations = ''; if ($this->config->setIfIsSet($related_views, 'related_views')) { $related_views = explode(',', $related_views); $related = array(); foreach ($related_views as $related_view) { if (!I2CE_MagicDataNode::checkKey($related_view)) { continue; } if (!$this->config->is_parent("../{$related_view}")) { continue; } $view_name = $related_view; $this->config->setIfIsSet($view_name, "../{$related_view}/display_name"); $disabled = false; $this->config->setIfIsSet($disabled, "../{$related_view}/disable"); if ($disabled) { continue; } $related[$related_view] = $view_name; } if (count($related) > 0 && ($node = $this->template->getElementById('related_views_list', $contentNode)) instanceof DOMNode) { $has_relations = 1; foreach ($related as $related_view => $view_name) { $liNode = $this->template->createElement('li'); $linkNode = $this->template->createElement('a', array('href' => "CustomReports/show/{$related_view}"), $view_name); $liNode->appendChild($linkNode); $node->appendChild($liNode); } } } $this->template->setDisplayDataImmediate('related_views', $has_relations, $contentNode); return true; }