/**
  * 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;
 }
Ejemplo n.º 3
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;
 }
Ejemplo n.º 4
0
 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;
     }
 }
Ejemplo n.º 5
0
 /**
  * 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;
 }