forena-8.x-1.x-dev/src/AppService.php
src/AppService.php
<?php
/**
* Created by PhpStorm.
* User: metzlerd
* Date: 1/31/16
* Time: 8:41 PM
*/
namespace Drupal\forena;
use Drupal\Component\Discovery\YamlDiscovery;
use Drupal\Core\Link;
use Drupal\Core\Url;
class AppService {
protected static $instance;
public $base_path;
public $siteContext;
public $input_format;
public $default_skin;
public $doc_formats;
public $doc_defaults;
/**
* Singleton Factory
* @return \Drupal\forena\AppService
*/
public static function instance($force_new = FALSE) {
if ((static::$instance === null) || $force_new) static::$instance = new static();
return static::$instance;
}
public function alter($hook, &$var1, $var2=NULL) {
\Drupal::moduleHandler()->alter('forena_parameters', $var1, $var2);
}
public function correctModulePath($module, &$path) {
if (strpos($path, '/') !== 0 && strpos($path, '..') !== 0) {
$tmp_path = drupal_get_path('module', $module) . "/" . $path;
if (is_dir($tmp_path)) {
$path = $tmp_path;
}
}
}
/**
* Returns the list of Renderer plugins
* @return array
*/
public function getRendererPlugins() {
$render_map = [];
$pm = \Drupal::service('frxplugin.manager.renderer');
$plugins = $pm->getDefinitions();
foreach ($plugins as $renderer) {
// Find out if plugin is defined.
$id = $renderer['id'];
$class = $renderer['class'];
$render_map[$id] = $class;
}
return $render_map;
}
/**
* Returns the list of ajax plugins.
* @return array
*/
public function getAjaxPlugins() {
$plugin_map = [];
$pm = \Drupal::service('frxplugin.manager.ajax');
$plugins = $pm->getDefinitions();
foreach ($plugins as $plugin) {
// Find out if plugin is defined.
$id = $plugin['id'];
$class = $plugin['class'];
$plugin_map[$id] = $class;
}
return $plugin_map;
}
/**
* Returns the list of context plugins.
* @return array
*/
public function getContextPlugins() {
$plugin_map = [];
$pm = \Drupal::service('frxplugin.manager.context');
$plugins = $pm->getDefinitions();
foreach ($plugins as $plugin) {
// Find out if plugin is defined.
$id = $plugin['id'];
$class = $plugin['class'];
$plugin_map[$id] = $class;
}
return $plugin_map;
}
/**
* Returns a list of formatters that provide format methods.
* @return array
*/
public function getFormatterPlugins() {
$formatters = [];
$pm = \Drupal::service('frxplugin.manager.formatter');
$plugins = $pm->getDefinitions();
foreach ($plugins as $formatter) {
// Find out if plugin is defined.
$class = $formatter['class'];
$formatters[] = $class;
}
return $formatters;
}
/**
* Use host application specificy to find the location of a library.
*/
public function findLibrary($library) {
$libraries = array(
'dataTables' => 'dataTables/media/js/jquery.dataTables.min.js',
'mpdf' => 'mpdf/mpdf.php',
'SVGGraph' => 'SVGGraph/SVGGraph.php',
'prince' => 'prince/prince.php'
);
$path = isset($libraries[$library]) && file_exists('libraries/' . $libraries[$library]) ? 'libraries/' . $libraries[$library] : '';
return $path;
}
public function getDocumentPlugins() {
$type_map = [];
$pm = \Drupal::service('frxplugin.manager.document');
$enabled_types = \Drupal::config('forena.settings')->get('doc_formats');
$plugins = $pm->getDefinitions();
foreach ($enabled_types as $doc_type) {
// Find out if plugin is defined.
if (isset($plugins[$doc_type])) {
$def = $plugins[$doc_type];
$ext = $def['ext'];
$class = $def['class'];
$type_map[$ext] = $class;
}
}
return $type_map;
}
public function getDriverPlugins() {
$driver_plugins = [];
/** @var FrxDriverPluginManager $pm */
$pm = \Drupal::service('frxplugin.manager.driver');
$plugins = $pm->getDefinitions();
foreach ($plugins as $plugin) {
$id = $plugin['id'];
$class = $plugin['class'];
$driver_plugins[$id] = $class;
}
return $driver_plugins;
}
public function getForenaProviders() {
$discovery = new YamlDiscovery('forena', \Drupal::moduleHandler()->getModuleDirectories());
$providers = $discovery->findAll();
foreach ($providers as $module_name => $provider) {
// Adjust Report Directories based on module name
if (isset($provider['report directory'])) {
$this->correctModulePath($module_name, $providers[$module_name]['report directory']);
}
if (isset($provider['data'])) {
foreach($provider['data'] as $data_provider => $definition) {
$this->correctModulePath(
$module_name,
$providers[$module_name]['data'][$data_provider]['source']
);
}
}
}
\Drupal::moduleHandler()->alter('forena_providers', $providers);
return $providers;
}
/**
* Return Current site context.
* @return array
*/
public function __construct() {
$site = array();
global $language;
global $user;
global $theme_path;
global $base_root;
$site['base_path'] = $this->base_path = base_path();
$site['dir'] = rtrim(base_path(), '/');
$site['theme_path'] = base_path() . $theme_path;
$site['theme_dir'] = &$theme_path;
$site['base_url'] = &$base_root;
$user = \Drupal::currentUser();
$site['user_name'] = $user->id() ? $user->getAccountName() : '';
$site['uid'] = $user->id();
$site['language'] = &$language;
//@TODO: Current Page
//$site['page'] = base_path() . $_GET['q'];
$dest = drupal_get_destination();
$site['destination'] = $dest['destination'];
$this->siteContext = $site;
$config = \Drupal::config('forena.settings');
$this->input_format = $config->get('input_format');
$this->default_skin = $config->get('default_skin');
$this->doc_formats = $config->get('doc_formats');
$this->doc_defaults = $config->get('doc_defaults');
}
public function currentPath() {
$path = \Drupal::service('path.current')->getPath();
return $path;
}
/**
* Access test
* @param $right
* @return mixed
*/
public function access($right) {
return \Drupal::currentUser()->hasPermission($right);
}
/**
* Determine data directory.
* @return string
* Data Directory for overridden
*/
public function dataDirectory() {
// Determine writeable directory for data.
$path = \Drupal::config('forena_query.settings')->get('data_path');
if (!$path) {
$path = drupal_realpath("private://data/source");
if ($path) {
if (!file_exists($path)) @mkdir($path, null, TRUE);
}
}
return $path;
}
/**
* @param array $parmaters
* Parameter used to buidl the form.
* @return array
*/
public function buildParametersForm($parameters) {
if ($parameters) {
return \Drupal::formBuilder()->getForm('\Drupal\forena\Form\ParameterForm', $parameters);
}
else {
return [];
}
}
/**
* General wrapper procedure for reporting erros
*
* @param string $short_message Message that will be displayed to the users
* @param string $log Message that will be recorded in the logs.
*/
public function error($short_message='', $log='') {
if ($short_message) {
drupal_set_message($short_message, 'error', FALSE);
}
if ($log) {
\Drupal::logger('forena')->error($log);
}
}
/**
* Debug handler
* Enter description here ...
* @param string $short_message
* @param string $log
*/
public function debug($short_message='', $log='') {
if ($log) {
\Drupal::logger('forena')->notice($log, []);
}
if ($short_message) {
drupal_set_message($short_message);
}
}
/**
* @param $elements
* @return mixed
*/
public function drupalRender(&$elements) {
return \Drupal::service('renderer')->render($elements);
}
/**
*
* @param $text
* @param $fields
* @return mixed
*/
public function reportLink($text, $fields) {
//@TODO: Map the fields from teh report call to the options for URL.
$link ='';
$target = '';
$class = '';
$rel = '';
$add_query = '';
// Extract the above variables from the field definition
extract($fields);
$attributes = [];
// Get data attributes from the field definition
foreach($fields as $k => $v) {
if (strpos($k, 'data-') === 0) {
$attributes[$k] = $v;
}
}
// use the target attribute to open links in new tabs or as popups.
if (@strpos(strtolower($target), 'popup')===0) {
$options = "status=1";
$attributes = array('onclick' =>
'window.open(this.href, \'' . $target . '\', "' . $options . '"); return false;');
}
else {
if ($target) $attributes['target'] = $target;
}
// Rel
if ($rel) $attributes['rel'] = $rel;
// Class
if ($class) $attributes['class'] = explode(' ', $class);
// @TODO: Add libararies for modals.
@list($path, $query) = explode('?', $link);
@list($query, $queryFrag) = explode('#', $query);
@list($path, $fragment) = explode('#', $path);
$fragment = $fragment . $queryFrag;
$data = array();
parse_str($query, $data);
// Add items from query string if specified.
if ($add_query) {
$parms = $_GET;
$data = array_merge($parms, $data);
}
if (trim($path)) {
// Work with internal links.
if (!strpos($path, '://')) {
$path = "/$path";
$url = Url::fromUserInput(
$path,
[
'fragment' => $fragment,
'query' => $data,
'attributes' => $attributes,
'absolute' => TRUE
]
);
}
else {
$url = Url::fromUri(
$path,
[
'fragment' => $fragment,
'query' => $data,
'attributes' => $attributes,
'absolute' => TRUE
]
);
}
$link = Link::fromTextAndUrl($text, $url)->toRenderable();
$link_html = \Drupal::service('renderer')->render($link);
}
return $link_html;
}
public function url($path, $options) {
if (strpos($path,'/')!== 0 && strpos($path, 'http' == FALSE)) {
$path = "/$path";
}
return Url::fromUserInput($path, $options)->toString();
}
/**
* Render an application menu based on provided id and max depth.
*
* @param $menu_id
* @param $max_depth
* @return mixed
*/
public function renderMenu($menu_id, $options=[]) {
$menu_tree_service = \Drupal::service('menu.link_tree');
$menu_parameters = new \Drupal\Core\Menu\MenuTreeParameters();
$tree = $menu_tree_service->load($menu_id, $menu_parameters);
$manipulators = [
['callable' => 'menu.default_tree_manipulators:checkNodeAccess'],
['callable' => 'menu.default_tree_manipulators:checkAccess'],
['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
];
$tree = $menu_tree_service->transform($tree, $manipulators);
$content = $menu_tree_service->build($tree);
return (string) \Drupal::service('renderer')->render($content);
}
}