forena-8.x-1.x-dev/src/ReportManager.php

src/ReportManager.php
<?php
/**
 * @file
 * Implements \Drupal\forena\File\ReportFileSystem
 */

namespace Drupal\forena;


use Drupal\forena\File\ReportFileSystem;

/**
 * Access to Report rendering engine.
 */
class ReportManager {

  private static $instance;

  /**
   * Singleton Factory
   * @return \Drupal\forena\ReportManager
   */
  public static function instance() {
    if (static::$instance === NULL) {
      static::$instance = new static();
    }
    return static::$instance;
  }

  /**
   * Determine doucment format from path and extract it if necessary.
   * @param $report_name
   * @return string 
   *   Document type from path. 
   */
  public function formatFromPath(&$report_name) {
    $format = 'drupal';
    $parts = explode('.', $report_name);
    if ($parts) {
      $ext = strtolower(array_pop($parts));
      $document_types = DocManager::instance()->getDocTypes();
      if(array_search($ext, $document_types)!==FALSE) {
        $report_name = implode('.', $parts);
        $format = $ext;
      }
    };
    return $format;
  }

  /**
   * Check access on areport.
   * @param $security
   * @return bool
   */
  public function checkAccess($security) {
    $access = empty($security);
    foreach ($security as $provider => $rights) {
      $m = DataManager::instance()->repository($provider);
      foreach ($rights as $right) {
        if ($m && $m->access($right)) {
          $access = TRUE;
        };
      }
    }
    return $access;
  }

  /**
   * Generate a forena report
   * @param $base_name
   * @return array | string
   *   Report or doucment. 
   */
  public function report($report_name, $parms = []) {
    $format = $this->formatFromPath($report_name);
    $base_name = $report_name;
    //@TODO: report loading based on language
    $content = NULL;
    $file_name = str_replace('.', '/', $report_name) . '.frx';
    $r = ReportFileSystem::instance();
    // Find out if the report exists
    if ($r->exists($file_name)) {
      $metaData = $r->getMetaData($file_name);
      $frx = $r->contents($file_name);
      $r = new Report($frx);
      if ($this->checkAccess($r->access)) {

        DocManager::instance()->setDocument($format);
        $dataSvc = DataManager::instance()->dataSvc;
        $dataSvc->setContext('report', $metaData);
        $dataSvc->setContext('site', AppService::instance()->siteContext);
        if (isset($_COOKIE)) {
          $dataSvc->setContext('cookie', $_COOKIE);
        }
        $doc = DocManager::instance()->getDocument();
        $doc->clear();
        $doc->header();
        $parms = array_merge($r->getDefaultParameters(), $parms);
        $dataSvc->push($parms, 'parm');
        $doc->setSkin($r->skin);
        DocManager::instance()->setFilename($base_name);
        $r->render($format);
        $doc->title=$r->title;
        $doc->footer();
        $dataSvc->pop();
        $r->buildParametersForm();
        $content = $doc->flush();
      }
      else {
        $content = FALSE;
      }

    }

    return $content;
  }

  /**
   * Generate a forena report
   * @param $base_name
   */
  public function reportInclude($report_name) {
    $format = $this->formatFromPath($report_name);
    $base_name = $report_name;
    //@TODO: report loading based on language
    $file_name = str_replace('.', '/', $report_name) . '.frx';
    $r = ReportFileSystem::instance();
    // Find out if the report exists
    if ($r->exists($file_name)) {
      $frx = $r->contents($file_name);
      $r = new Report($frx);
      $r->render($format);
    }
  }

  /**
   * Return the list of skins available.
   */
  public function skins() {
    // Determine the list of skins.
    return ReportFileSystem::instance()->skins();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc