PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/app/modules/admin/AdminWebModule.php

http://github.com/modolabs/Kurogo-Mobile-Web
PHP | 317 lines | 258 code | 41 blank | 18 comment | 31 complexity | 2d932dee283315ae6d4f2d5902f7bf93 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1
  1. <?php
  2. /*
  3. * Copyright © 2010 - 2013 Modo Labs Inc. All rights reserved.
  4. *
  5. * The license governing the contents of this file is located in the LICENSE
  6. * file located at the root directory of this distribution. If the LICENSE file
  7. * is missing, please contact sales@modolabs.com.
  8. *
  9. */
  10. /**
  11. * @package Module
  12. * @subpackage Admin
  13. */
  14. /**
  15. * @package Module
  16. * @subpackage Admin
  17. */
  18. class AdminWebModule extends WebModule {
  19. protected $id = 'admin';
  20. protected $canBeRemoved = false;
  21. protected $canAllowRobots = false;
  22. protected $canGenerateNativeWebTemplates = false;
  23. protected function includeCommonCSS() {
  24. return $this->pagetype != 'tablet';
  25. }
  26. private function getNavSections() {
  27. $navSections = array(
  28. array(
  29. 'id'=>'site',
  30. 'title'=>$this->getLocalizedString('ADMIN_SITE_TITLE'),
  31. 'description'=>'',
  32. 'url'=>$this->buildURL('site',array()),
  33. ),
  34. array(
  35. 'id'=>'modules',
  36. 'title'=>$this->getLocalizedString('ADMIN_MODULES_TITLE'),
  37. 'description'=>'',
  38. 'url'=>$this->buildURL('modules',array()),
  39. ),
  40. array(
  41. 'id'=>'credits',
  42. 'title'=>$this->getLocalizedString('ADMIN_CREDITS_TITLE'),
  43. 'description'=>'',
  44. 'url'=>$this->buildURL('credits',array()),
  45. ),
  46. );
  47. return $navSections;
  48. }
  49. private function getSiteAdminConfig($type) {
  50. static $configData;
  51. if (!isset($configData[$type])) {
  52. $files = array(
  53. APP_DIR . "/common/config/admin-{$type}.json",
  54. SHARED_APP_DIR . "/common/config/admin-{$type}.json",
  55. SITE_APP_DIR . "/common/config/admin-{$type}.json"
  56. );
  57. $data = array();
  58. foreach ($files as $file) {
  59. if (is_file($file)) {
  60. if ($json = json_decode(file_get_contents($file), true)) {
  61. $data = self::mergeConfigData($data, $json);
  62. } else {
  63. throw new KurogoDataException($this->getLocalizedString('ERROR_PARSING_FILE', $file));
  64. }
  65. }
  66. }
  67. $configData[$type] = $data;
  68. }
  69. return $configData[$type];
  70. }
  71. private function getSubNavSections($section) {
  72. $subNavSections = array();
  73. switch ($section) {
  74. case 'site':
  75. $configData = $this->getSiteAdminConfig($section);
  76. foreach ($configData as $id=>$data) {
  77. $subNavSections[$id] = array(
  78. 'id'=>$id,
  79. 'title'=>isset($data['titleKey']) ?$this->getLocalizedString($data['titleKey']) : $data['title'],
  80. 'url'=>$this->buildURL($section, array('section'=>$id))
  81. );
  82. }
  83. break;
  84. case 'modules':
  85. $subNavSections['overview'] = array(
  86. 'id'=>'overview',
  87. 'title'=>$this->getLocalizedString('ADMIN_MODULES_OVERVIEW_TITLE'),
  88. 'url'=>$this->buildURL($section, array('section'=>'overview'))
  89. );
  90. $subNavSections['homescreen'] = array(
  91. 'id'=>'homescreen',
  92. 'title'=>$this->getLocalizedString("ADMIN_MODULES_HOMESCREEN_TITLE"),
  93. 'url'=>$this->buildURL($section, array('section'=>'homescreen'))
  94. );
  95. $modules = array();
  96. $homeModuleID = $this->getHomeModuleID();
  97. if ($iconSet = $this->getOptionalThemeVar('navigation_icon_set')) {
  98. $iconSetSize = $this->getOptionalThemeVar('navigation_icon_size');
  99. $imgPrefix = "/common/images/iconsets/{$iconSet}/{$iconSetSize}/";
  100. } else {
  101. $imgPrefix = "/modules/{$homeModuleID}/images/";
  102. }
  103. foreach ($this->getAllModules() as $module) {
  104. $icon = $module->getOptionalModuleVar('icon', $module->getConfigModule(), 'module');
  105. $subNavSections[$module->getConfigModule()] = array(
  106. 'id'=>$module->getConfigModule(),
  107. 'title'=>$module->getModuleName(),
  108. 'img'=> sprintf("%s%s%s", $imgPrefix, $icon, $this->imageExt),
  109. 'url'=>$this->buildURL('modules', array('module'=>$module->getConfigModule()))
  110. );
  111. $modules[$module->getConfigModule()] = array(
  112. 'icon'=>$icon,
  113. 'type'=>$module->getID(),
  114. 'id'=>$module->getConfigModule(),
  115. 'title'=>$module->getModuleName(),
  116. 'home'=>$module->isOnHomeScreen(),
  117. 'disabled'=>$module->getOptionalModuleVar('disabled', false, 'module'),
  118. 'protected'=>$module->getOptionalModuleVar('protected', false, 'module'),
  119. 'secure'=>$module->getOptionalModuleVar('secure', false, 'module'),
  120. 'search'=>$module->getOptionalModuleVar('search', false, 'module'),
  121. 'canDisable'=>$module->canBeDisabled(),
  122. 'canRemove'=>$module->canBeRemoved(),
  123. 'url'=>$this->buildURL('modules', array('module'=>$module->getConfigModule()))
  124. );
  125. }
  126. $this->assign('modules', $modules);
  127. break;
  128. }
  129. return $subNavSections;
  130. }
  131. private function getModules() {
  132. $modulesNavData = $this->getAllModuleNavigationData();
  133. $modules = array(
  134. 'primary'=>array(),
  135. 'secondary'=>array(),
  136. 'unused'=>array()
  137. );
  138. foreach ($modulesNavData as $type=>$typeModules) {
  139. foreach ($typeModules as $moduleID=>$moduleNavData) {
  140. $modules[$type][$moduleID] = $moduleNavData['title'];
  141. }
  142. }
  143. $usedModules = array_merge($modules['primary'], $modules['secondary']);
  144. $allModules = $this->getAllModules();
  145. $unusedModules = array_diff(array_keys($allModules), array_keys($usedModules));
  146. if ($iconSet = $this->getOptionalThemeVar('navigation_icon_set')) {
  147. $iconSetSize = $this->getOptionalThemeVar('navigation_icon_size');
  148. $imgPrefix = "/common/images/iconsets/{$iconSet}/{$iconSetSize}/";
  149. } else {
  150. $imgPrefix = "/modules/{$homeModuleID}/images/";
  151. }
  152. foreach ($unusedModules as $moduleID) {
  153. $module = $allModules[$moduleID];
  154. if ($module->canBeAddedToHomeScreen()) {
  155. $modules['unused'][$moduleID] = $module->getModuleName();
  156. }
  157. }
  158. foreach ($modules as $type=>&$m) {
  159. foreach ($m as $id=>$title) {
  160. if ($module = Kurogo::arrayVal($allModules, $id)) {
  161. $icon = $module->getOptionalModuleVar('icon', $module->getConfigModule(), 'module');
  162. $modules[$type][$id] = array(
  163. 'title' => $title,
  164. 'img'=> sprintf("%s%s%s", $imgPrefix, $icon, $this->imageExt),
  165. );
  166. } else {
  167. unset($modules[$type][$id]);
  168. }
  169. }
  170. }
  171. return $modules;
  172. }
  173. protected function initialize() {
  174. $this->requiresAdmin();
  175. }
  176. protected function initializeForPage() {
  177. //make sure that only desktop/tablet devices can use the module
  178. $deviceClassifier = Kurogo::deviceClassifier();
  179. if ($this->page != 'index' && !($deviceClassifier->isComputer() || $deviceClassifier->isTablet())) {
  180. $this->redirectTo('index');
  181. }
  182. $navSections = $this->getNavSections();
  183. $section = '';
  184. $this->assign('navSections', $navSections);
  185. $this->addJQuery();
  186. $this->addJQueryUI();
  187. switch ($this->page)
  188. {
  189. case 'modules':
  190. $subNavSections = $this->getSubNavSections($this->page);
  191. $this->assign('subNavSections', $subNavSections);
  192. $defaultSubNavSection = key($subNavSections);
  193. $section = $this->getArg('section', $defaultSubNavSection);
  194. $moduleID = $this->getArg('module');
  195. if ($moduleID) {
  196. $this->setTemplatePage('module');
  197. try {
  198. if ($module = WebModule::factory($moduleID)) {
  199. $this->assign('moduleName', $module->getModuleName());
  200. $this->assign('moduleID', $module->getConfigModule());
  201. $this->assign('moduleIcon', $module->getOptionalModuleVar('icon', $module->getConfigModule(), 'module'));
  202. $section = $moduleID;
  203. $moduleSection = $this->getArg('section','general');
  204. $this->assign('moduleSection',$moduleSection);
  205. }
  206. } catch (KurogoException $e) {
  207. $this->redirectTo($this->page, array());
  208. }
  209. } elseif ($section == $defaultSubNavSection) {
  210. $moduleClasses = WebModule::getAllModuleClasses();
  211. $this->assign('moduleClasses', $moduleClasses);
  212. $this->setTemplatePage($section);
  213. } elseif ($section == 'homescreen') {
  214. $this->setTemplatePage($section);
  215. $modules = $this->getModules();
  216. $this->assign('modules', $modules);
  217. } else {
  218. $this->redirectTo($this->page, array());
  219. }
  220. break;
  221. case 'site':
  222. $subNavSections = $this->getSubNavSections($this->page);
  223. $this->assign('subNavSections', $subNavSections);
  224. $defaultSubNavSection = key($subNavSections);
  225. $section = $this->getArg('section', $defaultSubNavSection);
  226. if (!isset($subNavSections[$section])) {
  227. $this->redirectTo($this->page, array());
  228. }
  229. break;
  230. case 'credits':
  231. $section = $this->getArg('section', 'credits');
  232. $subNavSections = array(
  233. 'credits'=>array(
  234. 'id'=>'credits',
  235. 'title'=>$this->getLocalizedString("ADMIN_CREDITS_CREDITS_TITLE"),
  236. 'url'=>$this->buildURL($this->page, array('section'=>'credits'))
  237. ),
  238. 'license'=>array(
  239. 'id'=>'license',
  240. 'title'=>$this->getLocalizedString("ADMIN_CREDITS_LICENSE_TITLE"),
  241. 'url'=>$this->buildURL($this->page, array('section'=>'license'))
  242. )
  243. );
  244. $this->assign('subNavSections', $subNavSections);
  245. if (isset($subNavSections[$section])) {
  246. switch ($section)
  247. {
  248. case 'license':
  249. $licenseFile = ROOT_DIR . "/LICENSE";
  250. if (is_file($licenseFile)) {
  251. $this->assign('license', file_get_contents($licenseFile));
  252. } else {
  253. die($licenseFile);
  254. throw new KurogoException("Unable to load LICENSE file, you may have a compromised Kurogo Installation");
  255. }
  256. }
  257. $this->setTemplatePage($section);
  258. } else {
  259. $this->redirectTo('section', array());
  260. }
  261. break;
  262. case 'index':
  263. //redirect desktop devices to the "default page"
  264. $deviceClassifier = Kurogo::deviceClassifier();
  265. if ($deviceClassifier->isComputer() || $deviceClassifier->isTablet()) {
  266. $defaultSection = current($navSections);
  267. $this->redirectTo($defaultSection['id'], array());
  268. }
  269. break;
  270. default:
  271. $this->redirectTo('index', array());
  272. break;
  273. }
  274. $this->assign('section', $section);
  275. }
  276. }