forena-8.x-1.x-dev/src/Menu.php
src/Menu.php
<?php /** * @file Menu.inc * Drupal menu builder * @author davidmetzler * */ namespace Drupal\forena; use Drupal\forena\FrxAPI; class Menu { private static $instance; // public $doc_defaults; // Default Dcoument formats to inlcude public $doc_formats; // Supported document formats public $name; // Report name wihout frx extention public $language; // Language public $format; //format of report public $filename; //Name of file; public $ext; // Extention of file to be returned. public $directory; // name of directory; public $link; //Link to report in current language public $i_Link; //Link to language chaning report name private $teng; /** * Singleton Factory * @return \Drupal\forena\Menu */ public static function instance() { if (static::$instance === NULL) { static::$instance = new static(); } return static::$instance; } public function __construct() { $docs = \Drupal::config('forena.settings')->get('doc_defaults'); // Load settings array into normal array if ($docs) foreach ($docs as $doc => $enabled) { if ($enabled) $this->doc_defaults[] = $doc; } else { $this->doc_formats = array('web'); } // Load settings array into normal array $docs = \Drupal::config('forena.settings')->get('doc_formats'); if ($docs) foreach ($docs as $doc => $enabled) { if ($enabled) $this->doc_formats[] = $doc; } } /** * Convert url into file paths based report name. Load all link data for the * reprot. Most report urls look like a java lassname, so urls are of the form * lang.subdir.anothersubdir.report.doctype. This function parses the url * into it's components and store them in the menu object so that we can use * this name. * @param string $url * path style name * @return array * Descriptioin of the url. */ public function parseURL($url) { global $language; $name = $url; $tlang = ''; // Determine if the report has an extention that is one of the docuemnt types $p = pathinfo($url); if (isset($p['extension']) && array_search($p['extension'], $this->doc_formats)!==FALSE) { $name = $p['dirname'] == '.' ? $p['filename'] : $p['dirname'] . '/' . $p['filename']; $format = $p['extension']; } else { $format = 'web'; $ext = ''; } // Convert class names to directory names. $base_name = str_replace('.', '/', $name); $name = $base_name; $i_name = $base_name; // Determine lanugage from url or drupal language interface. $lang = $language->language; if (\Drupal::moduleHandler()->moduleExists('locale')) { //First check to see if the report allready has a language in it @list($tlang, $tbase_name) = explode('/', $base_name, 2); // FInd out if the starting name of the report is an installed language. $lang_list = locale_translatable_language_list(); if (array_key_exists($tlang, $lang_list )) { $base_name = $tbase_name; if ($lang != $tlang) { $lang = $tlang; $language = $lang_list[$lang]; $i_name = $tlang . '/' . $base_name; } if ($tlang == 'en') { $name = $base_name = $tbase_name; } } else { if ($lang != 'en') { $def_language = language_default('language'); if (FrxAPI::File()->exists("$lang/$name.frx")) { $name = "$lang/$name"; } elseif($def_language != 'en' && FrxAPI::File()->exists("$def_language/$name.frx")) { $name = "$def_language/$name"; $lang = $def_language; } } } } //$name = trim(str_replace('.', '/', $base_name), '/'); $filename = $name . '.frx'; $desc['name'] = $this->name = $name; $desc['directory'] = FrxAPI::File()->directory($filename); $desc['filename'] = $filename; $desc['base_name'] = $this->base_name = $base_name; $desc['exists'] = FrxAPI::File()->exists($filename); $desc['link'] = $this->link = 'reports/' . str_replace('/' , '.', $name); $desc['i_link']= 'reports/' . $this->i_link = str_replace('/', '.', $i_name); $desc['language'] = $this->language = $lang; $desc['format'] = $this->format = $format; return $desc; } /** * Generate dcoument links based on report name. * @param array $docs */ public function doclinks($docs = array()) { // Default documents. if (!$docs) { $docs = $this->doc_defaults; } } /** * Extract tokens from path * @param $path string path with FrxAPI Tokens in them */ public function tokens($path) { return $this->teng->tokens($path); } /** * Add menu items to the items array * @param $items array of menu items. */ public function addMenuItems(&$items) { GLOBAL $language; $result = FrxAPI::File()->menuReports(); $reports = array(); foreach ($result AS $row) { $access = TRUE; $cache = $row->cache; if ($cache) { // Load menu item defaults $menu = @$cache['menu']; $path = $menu['path']; $path_args = @$menu['args']; $type = @$menu['type']; $title = isset($menu['title']) ? $menu['title']: $row->cache['title']; $weight = @$menu['weight']; $parent_path = ''; //Default type switch ($type) { case 'normal-item': $menu_type = MENU_NORMAL_ITEM; break; case 'default-local-task': $menu_type = MENU_DEFAULT_LOCAL_TASK; break; case 'local-task': $menu_type = MENU_LOCAL_TASK; break; default: $menu_type = MENU_CALLBACK; } //Replace the tokens with drupal menu wildcards $tokens = $this->tokens($path); $new_path = $path; foreach ($tokens as $i => $token) { $new_path = str_replace(':' . $token, '%', $new_path); $args[] = $i; } // Now generate the callback arguments $parts = explode( '/', $new_path); $page_args = array_keys($parts, '%'); $path_args = $path_args ? rtrim($path,'/') . '/' . ltrim($path_args, '/') : $path; $page_args = array_merge(array($path_args, $row->name), $page_args); // Set the access callback $access_callback = isset($cache['access']) ? 'forena_check_all_access' : TRUE; if ($menu_type == MENU_DEFAULT_LOCAL_TASK) { $parts = explode('/', $new_path); array_pop($parts); $parent_path = implode('/', $parts); // build the parent menu because we are also building the local task // but onlu do so if another report doesn't define the parent. if (!isset($items[$parent_path])) { $items[$parent_path] = array( 'type' => MENU_CALLBACK, 'title' => $row->cache['title'], 'access callback' => $access_callback, 'access arguments' => array($cache['access']), 'page callback' => 'forena_report_menu_callback', 'page arguments' => $page_args, ); if (isset($row->cache['menu']['menu_name'])) $items['parent_path']['menu_name'] = $row->cache['menu']['menu_name']; if (isset($row->cache['menu']['tab_parent'])) $items['parent_path']['tab_parent'] = $row->cache['menu']['tab_parent']; if (isset($row->cache['menu']['tab_root'])) $items['parent_path']['tab_root'] = $row->cache['menu']['tab_root']; if (isset($row->cache['menu']['weight'])) $items['parent_path']['weight'] = $row->cache['menu']['weight']; if (isset($row->cache['menu']['weight'])) $items['parent_path']['weight'] = $row->cache['menu']['weight']; if (\Drupal::moduleHandler()->moduleExists('locale')) { $items[$parent_path]['title callback'] = 'forena_report_title_callback'; $items[$parent_path]['title arguments'] = array($row->name, FALSE); } if ($access_callback === 'forena_check_all_access') $items[$parent_path]['access arguments'][] = $cache['access']; } } $items[$new_path] = array( 'type' => $menu_type, 'title' => $title, 'access callback' => $access_callback, 'access arguments' => array(@$cache['access']), 'page callback' => 'forena_report_menu_callback', 'page arguments' => $page_args, ); //if ($parent) $items[$new_path]['parent'] = $parent; if (isset($menu['weight'])) $items[$new_path]['weight'] = $menu['weight']; if (!$parent_path) { if (isset($menu['menu_name'])) $items[$new_path]['menu_name'] = $menu['menu_name']; if (isset($menu['tab_parent'])) $items[$new_path]['tab_parent'] = $menu['tab_parent']; if (isset($menu['tab_root'])) $items[$new_path]['tab_root'] = $menu['tab_root']; if (isset($menu['plid'])) $items[$new_path]['plid'] = (int)$menu['plid']; } if (\Drupal::moduleHandler()->moduleExists('locale')) { $items[$new_path]['title callback'] = 'forena_report_title_callback'; $items[$new_path]['title arguments'] = array($row->name, TRUE); } if ($access_callback === 'forena_check_all_access') $items[$new_path]['access arguments'][] = $cache['access']; } } } }