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(); } }