You are here

function forena_save_report in Forena Reports 7.3

Same name and namespace in other branches
  1. 8 forena.common.inc \forena_save_report()
  2. 6.2 forena.admin.inc \forena_save_report()
  3. 6 forena.admin.inc \forena_save_report()
  4. 7.5 forena.common.inc \forena_save_report()
  5. 7 forena.admin.inc \forena_save_report()
  6. 7.2 forena.admin.inc \forena_save_report()
  7. 7.4 forena.common.inc \forena_save_report()

Save the report file to disk

Parameters

string $name File name to save report to:

unknown_type $data:

12 calls to forena_save_report()
forena_add_param_form_submit in ./forena.admin.inc
forena_add_report_form_submit in ./forena.admin.inc
forena_admin_params_form_submit in ./forena.admin.inc
forena_create_trans_form_submit in ./forena.admin.inc
forena_data_block_add in ./forena.admin.inc
submit handler for forena_data_block_form. This adds the datablock to an existing report.

... See full list

File

./forena.common.inc, line 308
Common functions used throughout the project but loaded in this file to keep the module file lean.

Code

function forena_save_report($report_name, $report, $save_file = FALSE, $altered = 0) {
  static $save_count = 0;
  if ($report && !is_object($report)) {
    try {
      $report = new SimpleXMLElement($report);
    } catch (Exception $e) {
      FrxReportGenerator::instance()->app
        ->error(t('Could not save %s because XML was malformed', array(
        '%s' => $report_name,
      )), "<p>Invalid XML</p><pre>XML:" . htmlspecialchars($report) . "\n" . $e
        ->getMessage() . "</pre>");
      return;
    }
  }
  if (!_forena_verify_directory($report_name)) {
    drupal_set_message(t('Error creating directory.  Check Permissions'), 'error');
    return 0;
  }
  $report_path = forena_report_path();
  $r = new FrxReport($report);
  $data['title'] = $r->title;
  $data['category'] = $r->category;
  $data['options'] = $r->options;
  $data['descriptor'] = $r->descriptor;
  $data['name'] = $report_name;
  $data['altered'] = $altered;
  $r_xml = $report
    ->asXML();
  $name = $data['name'];
  $filepath = $report_path . '/' . $report_name . '.frx';

  // If we need to save this to the file system
  if ($save_file) {
    if (!file_exists($filepath) || is_writeable($filepath)) {

      // Serialize the report for saving
      file_put_contents($filepath, $r_xml);
    }
    else {
      Frx::error(t('Insufficient privileges to write file.'));
    }
  }

  // Get the security caches from the reports
  if ($report) {
    $cache = forena_load_cache($report);
  }
  else {
    $cache = '';
  }
  $rpt_cache = '';
  if ($cache) {
    $rpt_cache = serialize($cache);
  }

  // Set default interpretations of data
  $data['enabled'] = isset($data['enabled']) && $data['enabled'] ? 1 : 0;
  if (isset($data['options']['hidden']) && (string) $data['options']['hidden']) {
    $data['hidden'] = $data['options']['hidden'] && $data['options']['hidden'] != 'N' && $data['options']['hidden'] != '0' ? 1 : 0;
    if (!$data['category']) {
      $data['category'] = 'All';
    }
  }
  else {

    // Set hidden based on category
    $data['hidden'] = $data['category'] ? 0 : 1;
  }

  // Save language info
  $lang = 'en';
  if (module_exists('locale')) {
    @(list($tlang, $tname) = explode('/', $name, 2));
    if (array_key_exists($tlang, language_list())) {
      $lang = $tlang;
      $name = $tname;
    }
  }

  // Save to the Database
  if (file_exists($filepath)) {
    $modified = filemtime($filepath);
    $result = db_query("SELECT report_name FROM {forena_reports} WHERE report_name=:report_name AND language=:language", array(
      ':report_name' => $name,
      'language' => $lang,
    ));
    $path = isset($cache['menu']) ? @$cache['menu']['path'] : '';
    if ($rpt = $result
      ->fetchObject()) {
      db_update('forena_reports')
        ->condition('report_name', $name)
        ->condition('language', $lang)
        ->fields(array(
        'title' => $data['title'],
        'descriptor' => $data['descriptor'],
        'category' => $data['category'],
        'hidden' => $data['hidden'],
        'cache' => $rpt_cache,
        'altered' => $data['altered'],
        'modified' => $modified,
        'path' => $path,
      ))
        ->execute();
    }
    else {
      db_insert('forena_reports')
        ->fields(array(
        'report_name' => $name,
        'language' => $lang,
        'title' => $data['title'],
        'descriptor' => $data['descriptor'],
        'category' => $data['category'],
        'hidden' => $data['hidden'],
        'cache' => $rpt_cache,
        'altered' => $data['altered'],
        'modified' => $modified,
        'path' => $path,
      ))
        ->execute();
    }
    $save_count++;
  }
  $r = NULL;
  $result = NULL;
  $r_xml = NULL;
  $report = NULL;
  $data = NULL;
  $rpt = NULL;
  $cache = NULL;
  $rpt_cache = NULL;

  // Destroy object to clear memory leaks.
  if ($r) {
    $r
      ->__destruct();
    unset($r);
  }
  return $save_count;
}