diff options
author | Simon Rettberg | 2016-05-11 19:00:30 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-05-11 19:00:30 +0200 |
commit | 1cc1c2ed092c46eb35893c1d85accb24cf43d7f9 (patch) | |
tree | 95c1302f4a1ae441e174a1dca64133e2873f8297 | |
parent | Add PhpStorm prefs (diff) | |
download | slx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.tar.gz slx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.tar.xz slx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.zip |
Still working in modularization cleanup and refinement
45 files changed, 308 insertions, 184 deletions
diff --git a/Mustache/Engine.php b/Mustache/Engine.php index ca909bca..e1f6b8cf 100644 --- a/Mustache/Engine.php +++ b/Mustache/Engine.php @@ -444,6 +444,7 @@ class Mustache_Engine } catch (InvalidArgumentException $e) {
// If the named partial cannot be found, return null.
}
+ return null;
}
/**
@@ -557,6 +558,7 @@ class Mustache_Engine if ($this->cache) {
return sprintf('%s/%s.php', $this->cache, $this->getTemplateClassName($source));
}
+ return false;
}
/**
diff --git a/inc/database.inc.php b/inc/database.inc.php index 735b2181..c3901453 100644 --- a/inc/database.inc.php +++ b/inc/database.inc.php @@ -113,6 +113,7 @@ class Database return false; Util::traceError("Database Error: \n" . $e->getMessage()); } + return false; } /** diff --git a/inc/message.inc.php b/inc/message.inc.php index d6a62f4e..15e89041 100644 --- a/inc/message.inc.php +++ b/inc/message.inc.php @@ -55,6 +55,7 @@ class Message */ public static function renderList() { + self::$flushed = true; if (empty(self::$list)) return; // Ajax @@ -75,11 +76,10 @@ class Message foreach ($item['params'] as $index => $text) { $message = str_replace('{{' . $index . '}}', '<b>' . htmlspecialchars($text) . '</b>', $message); } - Render::addTemplate('messagebox-' . $item['type'], array('message' => $message),'main'); + Render::addTemplate('messagebox-' . $item['type'], array('message' => $message), 'main'); self::$alreadyDisplayed[] = $item; } self::$list = array(); - self::$flushed = true; } /** diff --git a/inc/module.inc.php b/inc/module.inc.php index 261c2990..894bc0f6 100644 --- a/inc/module.inc.php +++ b/inc/module.inc.php @@ -178,4 +178,9 @@ class Module return Dictionary::getCategoryName($this->category); } + public function getDir() + { + return 'modules/' . $this->name; + } + } diff --git a/inc/property.inc.php b/inc/property.inc.php index 0cb57f81..13e3c66d 100644 --- a/inc/property.inc.php +++ b/inc/property.inc.php @@ -66,6 +66,7 @@ class Property EventLog::info('Server IP changed from ' . self::getServerIp() . ' to ' . $value . ($automatic ? ' (auto detected)' : '')); self::set('server-ip', $value); Event::serverIpChanged(); + return true; } public static function getBootMenu() diff --git a/inc/render.inc.php b/inc/render.inc.php index e3a23f23..5fc5be92 100644 --- a/inc/render.inc.php +++ b/inc/render.inc.php @@ -18,7 +18,7 @@ class Render private static $mustache = false; private static $body = ''; private static $header = ''; - private static $dashboard = ''; + private static $dashboard = false; private static $footer = ''; private static $title = ''; private static $templateCache = array(); @@ -28,7 +28,16 @@ class Render { if (self::$mustache !== false) Util::traceError('Called Render::init() twice!'); - self::$mustache = new Mustache_Engine; + $options = array(); + $tmp = '/tmp/bwlp-cache'; + $dir = is_dir($tmp); + if (!$dir) { + @mkdir($tmp, 0755, false); + } + if (($dir || is_dir($tmp)) && is_writable($tmp)) { + $options['cache'] = $tmp; + } + self::$mustache = new Mustache_Engine($options); } /** @@ -40,7 +49,6 @@ class Render $zip = isset($_SERVER['HTTP_ACCEPT_ENCODING']) && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false); if ($zip) ob_start(); - $page = strtolower($_GET['do']); echo '<!DOCTYPE html> <html> @@ -63,7 +71,7 @@ class Render ' </head> <body> ', - self::$dashboard, + (self::$dashboard !== false ? self::parse('main-menu', self::$dashboard, 'main') : ''), '<div class="main" id="mainpage"><div class="container-fluid"> ', self::$body @@ -168,18 +176,20 @@ class Render /** * Parse template with given params and return; do not add to body * @param string $template name of template, relative to templates/, without .html extension + * @param array $params tags to render into template + * @param string $module name of module to load template from; defaults to currently active module * @return string Rendered template */ public static function parse($template, $params = false, $module = false) { + if ($module === false) { + $module = Page::getModule()->getIdentifier(); + } // Load html snippet - $html = self::getTemplate($template,$module); + $html = self::getTemplate($template, $module); if ($html === false) { return '<h3>Template ' . htmlspecialchars($template) . '</h3>' . nl2br(htmlspecialchars(print_r($params, true))) . '<hr>'; } - if($module === false) { - $module = Page::getModule()->getIdentifier(); - } if (!is_array($params)) { $params = array(); } @@ -201,8 +211,10 @@ class Render } // Always add token to parameter list $params['token'] = Session::get('token'); - // Likewise, add currently selected language (its two letter code) to params - $params['current_lang'] = LANG; + if (defined('LANG')) { + // Likewise, add currently selected language (its two letter code) to params + $params['current_lang'] = LANG; + } // Add desired password field type $params['password_type'] = Property::getPasswordFieldType(); // Return rendered html @@ -242,20 +254,18 @@ class Render /** * Private helper: Load the given template and return it */ - private static function getTemplate($template, $module = false) + private static function getTemplate($template, $module) { - if (isset(self::$templateCache[$template])) { - return self::$templateCache[$template]; - } - // Select current module - if(!$module){ - $module = strtolower(empty($_REQUEST['do']) ? 'Main' : $_REQUEST['do']); + $id = "$template/$module"; + if (isset(self::$templateCache[$id])) { + return self::$templateCache[$id]; } // Load from disk $data = @file_get_contents('modules/' . $module . '/templates/' . $template . '.html'); - if ($data === false) - $data = '<b>Non-existent template ' . $template . ' requested!</b>'; - self::$templateCache[$template] = & $data; + if ($data === false) { + $data = '<b>Non-existent/unreadable template ' . $template . ' requested!</b>'; + } + self::$templateCache[$id] =& $data; return $data; } @@ -264,7 +274,7 @@ class Render */ public static function setDashboard($params) { - self::$dashboard = self::parse('main-menu', $params, 'main'); + self::$dashboard = $params; } } diff --git a/inc/request.inc.php b/inc/request.inc.php index 604a2b0e..f46210af 100644 --- a/inc/request.inc.php +++ b/inc/request.inc.php @@ -5,11 +5,12 @@ */ class Request { - + /** - * + * * @param string $key Key of field to get from $_GET * @param string $default Value to return if $_GET does not contain $key + * @param string $type if the parameter exists, cast it to given type * @return mixed Field from $_GET, or $default if not set */ public static function get($key, $default = false, $type = false) diff --git a/inc/session.inc.php b/inc/session.inc.php index a0f8ab4c..b4299e06 100644 --- a/inc/session.inc.php +++ b/inc/session.inc.php @@ -41,6 +41,7 @@ class Session if (self::readSessionData()) return true; // Loading session data failed self::delete(); + return false; } public static function get($key) diff --git a/inc/taskmanagercallback.inc.php b/inc/taskmanagercallback.inc.php index cec763fb..7d4e79f3 100644 --- a/inc/taskmanagercallback.inc.php +++ b/inc/taskmanagercallback.inc.php @@ -124,6 +124,10 @@ class TaskmanagerCallback */ public static function cbConfModCreated($task, $args) { + $mod = Module::get('sysconfig'); + if ($mod === false) + return; + $mod->activate(); if (Taskmanager::isFailed($task)) { ConfigModule::generateFailed($task, $args); } else { @@ -139,6 +143,10 @@ class TaskmanagerCallback */ public static function cbConfTgzCreated($task, $args) { + $mod = Module::get('sysconfig'); + if ($mod === false) + return; + $mod->activate(); if (Taskmanager::isFailed($task)) { ConfigTgz::generateFailed($task, $args); } else { diff --git a/inc/up_json_encode.php b/inc/up_json_encode.php index c33cb012..0f5776c2 100644 --- a/inc/up_json_encode.php +++ b/inc/up_json_encode.php @@ -164,7 +164,7 @@ function up_json_encode($var, $options = 0, $_indent = "") } elseif (is_float($var)) { if (is_nan($var) || is_infinite($var)) { ${'.json_last_error'} = JSON_ERROR_INF_OR_NAN; - return; + return false; } else { $json = "$var"; } @@ -174,7 +174,7 @@ function up_json_encode($var, $options = 0, $_indent = "") else { trigger_error("up_json_encode: don't know what a '" . gettype($var) . "' is.", E_USER_WARNING); ${'.json_last_error'} = JSON_ERROR_UNSUPPORTED_TYPE; - return; + return false; } #-- done diff --git a/inc/validator.inc.php b/inc/validator.inc.php index 6eac80f9..23debd2c 100644 --- a/inc/validator.inc.php +++ b/inc/validator.inc.php @@ -32,6 +32,7 @@ class Validator default: Util::traceError('Unknown validation method: ' . $data[0]); } + return false; // make code inspector happy - doesn't know traceError doesn't return } /** @@ -20,17 +20,17 @@ abstract class Page protected function doPreprocess() { - + } protected function doRender() { - + } protected function doAjax() { - + } public static function preprocess() @@ -51,7 +51,7 @@ abstract class Page { self::$instance->doAjax(); } - + public static function getModule() { return self::$module; @@ -61,7 +61,7 @@ abstract class Page * @var \Page */ private static $instance = false; - + /** * @var \Module */ @@ -83,9 +83,6 @@ abstract class Page } -// Error reporting (hopefully goind to stderr, not being printed on pages) -error_reporting(E_ALL); - // Set variable if this is an ajax request if ((isset($_REQUEST['async'])) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')) { define('AJAX', true); @@ -95,15 +92,27 @@ if ((isset($_REQUEST['async'])) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && define('API', false); // Autoload classes from ./inc which adhere to naming scheme <lowercasename>.inc.php -function slxAutoloader($class) -{ +spl_autoload_register(function ($class) { $file = 'inc/' . preg_replace('/[^a-z0-9]/', '', mb_strtolower($class)) . '.inc.php'; if (!file_exists($file)) return; require_once $file; -} +}); + -spl_autoload_register('slxAutoloader'); +if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) { + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + global $SLX_ERRORS; + $SLX_ERRORS[] = array( + 'errno' => $errno, + 'errstr' => $errstr, + 'errfile' => $errfile, + 'errline' => $errline, + //'stack' => debug_backtrace(), // TODO + ); + return false; // Return false so the default error handler will kick in after this + }); +} // Now determine which module to run Page::init(); @@ -134,16 +143,59 @@ if (AJAX) { // Normal mode - preprocess first.... Page::preprocess(); -// Generate Main menu -Dashboard::createMenu(); - +// Render queued up messages at the top Message::renderList(); // Render page. If the module wants to output anything, it will be done here... Page::render(); +// We're still executing - generate Main menu +Dashboard::createMenu(); + if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) { - Message::addWarning('main.debug-mode'); + if (empty($SLX_ERRORS)) { + Message::addWarning('main.debug-mode'); + } else { + /** + * Map an error code into an Error word. + * + * @param int $code Error code to map + * @return array Array of error word. + */ + function mapErrorCode($code) + { + switch ($code) { + case E_PARSE: + case E_ERROR: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + return 'Fatal Error'; + case E_WARNING: + case E_USER_WARNING: + case E_COMPILE_WARNING: + case E_RECOVERABLE_ERROR: + return 'Warning'; + case E_NOTICE: + case E_USER_NOTICE: + return 'Notice'; + case E_STRICT: + return 'Strict'; + case E_DEPRECATED: + case E_USER_DEPRECATED: + return 'Deprecated'; + default : + return '??Error'; + } + } + $dir = preg_quote(dirname(__FILE__), '#'); + foreach ($SLX_ERRORS as &$err) { + $err['errlevel'] = mapErrorCode($err['errno']); + $err['errfile'] = preg_replace('#^' . $dir . '#', '', $err['errfile']); + } + unset($err, $dir); + Render::addTemplate('php-errors', array('errors' => $SLX_ERRORS), 'main'); + } } if (defined('CONFIG_FOOTER')) { diff --git a/modules-available/baseconfig/lang/de/template-tags.json b/modules-available/baseconfig/lang/de/template-tags.json index 0f4819b4..de2007d9 100644 --- a/modules-available/baseconfig/lang/de/template-tags.json +++ b/modules-available/baseconfig/lang/de/template-tags.json @@ -2,10 +2,8 @@ "lang_basicConfiguration": "Basiskonfiguration", "lang_catUser": "Benutzerverwaltung", "lang_clientRelatedConfig": "Die Optionen auf dieser Seite beziehen sich auf das Verhalten der bwLehrpool-Clients.", - "lang_close": "Schlie\u00dfen", "lang_create": "Schaffen", "lang_delete": "L\u00f6schen", - "lang_help": "Hilfe", "lang_newUser": "Neuer Benutzer", "lang_partitionMountPoint": "Mount Point", "lang_reset": "Zur\u00fccksetzen", diff --git a/modules-available/baseconfig/lang/en/template-tags.json b/modules-available/baseconfig/lang/en/template-tags.json index 3609f6fa..369fa081 100644 --- a/modules-available/baseconfig/lang/en/template-tags.json +++ b/modules-available/baseconfig/lang/en/template-tags.json @@ -3,11 +3,9 @@ "lang_catPartition": "Partition Managment", "lang_catUser": "User Managment", "lang_clientRelatedConfig": "The options on this page are related to the bwLehrpool client machines.", - "lang_close": "Close", "lang_confirm": "Would you like to save the settings on [ \/srv\/openslx\/www\/boot\/config ] ?", "lang_create": "Create", "lang_delete": "Delete", - "lang_help": "Help", "lang_helpId": "Partition Id", "lang_helpMountPoint": "Must be a directory: \/example\/directory\/", "lang_helpOptions": "Currently, only option 'bootable' is available", diff --git a/modules-available/baseconfig/lang/pt/template-tags.json b/modules-available/baseconfig/lang/pt/template-tags.json index 1ab41b16..f6037d65 100644 --- a/modules-available/baseconfig/lang/pt/template-tags.json +++ b/modules-available/baseconfig/lang/pt/template-tags.json @@ -2,11 +2,9 @@ "lang_basicConfiguration": "Configura\u00e7\u00e3o B\u00e1sica", "lang_catPartition": "Gerenciamento de Parti\u00e7\u00f5es", "lang_catUser": "Gerenciamente de Usu\u00e1rios", - "lang_close": "Fechar", "lang_confirm": "Voc\u00ea deseja salvar configura\u00e7\u00f5es em [ \/srv\/openslx\/www\/boot\/default\/config ] ?", "lang_create": "Criar", "lang_delete": "Deletar", - "lang_help": "Ajuda", "lang_helpId": "Id da parti\u00e7\u00e3o", "lang_helpMountPoint": "Precisa ser um diret\u00f3rio: \/exemplo\/diret\u00f3rio\/", "lang_helpOptions": "Atualmente, apenas a op\u00e7\u00e3o 'bootable' est\u00e1 dispon\u00edvel", diff --git a/modules-available/main/lang/de/global-tags.json b/modules-available/main/lang/de/global-tags.json index c36347fe..39236fd4 100644 --- a/modules-available/main/lang/de/global-tags.json +++ b/modules-available/main/lang/de/global-tags.json @@ -1,4 +1,11 @@ { + "lang_back": "Zur\u00fcck", + "lang_cancel": "Abbrechen", + "lang_close": "Schlie\u00dfen", + "lang_delete": "L\u00f6schen", + "lang_hint": "Hinweis", + "lang_next": "Weiter", + "lang_save": "Speichern", "lang_today": "Heute", "lang_yesterday": "Gestern" }
\ No newline at end of file diff --git a/modules-available/main/lang/de/template-tags.json b/modules-available/main/lang/de/template-tags.json index e9b829e8..8a3120d3 100644 --- a/modules-available/main/lang/de/template-tags.json +++ b/modules-available/main/lang/de/template-tags.json @@ -10,7 +10,6 @@ "lang_logout": "Abmelden", "lang_minilinuxMissing": "Wichtige Dateien der MiniLinux-Installation fehlen.", "lang_needsSetup": "Einrichtung unvollst\u00e4ndig", - "lang_next": "Weiter", "lang_noExistingAccount": "Es existiert noch kein Administrator-Zugang f\u00fcr diesen Satelliten-Server.", "lang_numerOfImagesMarkedForDeletion": "Zur L\u00f6schung markierte Abbilder", "lang_register": "Registrieren", diff --git a/modules-available/main/lang/en/global-tags.json b/modules-available/main/lang/en/global-tags.json index f5fbed61..10581ae2 100644 --- a/modules-available/main/lang/en/global-tags.json +++ b/modules-available/main/lang/en/global-tags.json @@ -1,4 +1,11 @@ { + "lang_back": "Back", + "lang_cancel": "Cancel", + "lang_close": "Close", + "lang_delete": "Delete", + "lang_hint": "Hint", + "lang_next": "Next", + "lang_save": "Save", "lang_today": "Today", "lang_yesterday": "Yesterday" }
\ No newline at end of file diff --git a/modules-available/main/lang/en/template-tags.json b/modules-available/main/lang/en/template-tags.json index 3483bcfe..aeebc998 100644 --- a/modules-available/main/lang/en/template-tags.json +++ b/modules-available/main/lang/en/template-tags.json @@ -10,7 +10,6 @@ "lang_logout": "Logout", "lang_minilinuxMissing": "Important files from the mini Linux installation are missing.", "lang_needsSetup": "Setup incomplete", - "lang_next": "Next", "lang_noExistingAccount": "No account has been created yet. Sign up to become the administrator.", "lang_numerOfImagesMarkedForDeletion": "Images marked for deletion", "lang_register": "Register", diff --git a/modules-available/main/lang/pt/global-tags.json b/modules-available/main/lang/pt/global-tags.json new file mode 100644 index 00000000..7c1311ec --- /dev/null +++ b/modules-available/main/lang/pt/global-tags.json @@ -0,0 +1,4 @@ +{ + "lang_close": "Fechar", + "lang_next": "Pr\u00f3ximo" +}
\ No newline at end of file diff --git a/modules-available/main/lang/pt/template-tags.json b/modules-available/main/lang/pt/template-tags.json index d9acf58b..79e0184e 100644 --- a/modules-available/main/lang/pt/template-tags.json +++ b/modules-available/main/lang/pt/template-tags.json @@ -5,7 +5,6 @@ "lang_login": "Entrar", "lang_logout": "Sair", "lang_needsSetup": "Instala\u00e7\u00e3o incompleta", - "lang_next": "Pr\u00f3ximo", "lang_noExistingAccount": "Nenhuma conta foi criada ainda. Registre-se para se tornar administrador.", "lang_register": "Registrar", "lang_translations": "Tradu\u00e7\u00f5es", diff --git a/modules-available/main/templates/php-errors.html b/modules-available/main/templates/php-errors.html new file mode 100644 index 00000000..a9932039 --- /dev/null +++ b/modules-available/main/templates/php-errors.html @@ -0,0 +1,12 @@ +<div class="alert alert-warning"> + <div class="slx-bold"> + <span class="glyphicon glyphicon-warning" aria-hidden="true"></span> + {{lang_warningDebug}} + </div> + <hr> + {{#errors}} + <div> + <b>{{errlevel}}</b>: {{errstr}} – {{errfile}} : {{errline}} + </div> + {{/errors}} +</div> diff --git a/modules-available/sysconfig/addmodule.inc.php b/modules-available/sysconfig/addmodule.inc.php index 913a37c1..30ca1d2c 100644 --- a/modules-available/sysconfig/addmodule.inc.php +++ b/modules-available/sysconfig/addmodule.inc.php @@ -100,8 +100,9 @@ abstract class AddModule_Base if (self::$instance === false) { Util::traceError('No step instance yet'); } - if (self::$instance->edit !== false) + if (self::$instance->edit !== false) { Message::addInfo('replacing-module', self::$instance->edit->title()); + } self::$instance->renderInternal(); } diff --git a/modules-available/sysconfig/addmodule_adauth.inc.php b/modules-available/sysconfig/addmodule_adauth.inc.php index cb7bfb4e..1e76f108 100644 --- a/modules-available/sysconfig/addmodule_adauth.inc.php +++ b/modules-available/sysconfig/addmodule_adauth.inc.php @@ -25,7 +25,7 @@ class AdAuth_Start extends AddModule_Base $data['server'] = $out[1]; } $data['step'] = 'AdAuth_CheckConnection'; - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-start', $data); + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-start', $data); } } @@ -88,7 +88,7 @@ class AdAuth_CheckConnection extends AddModule_Base } else { $data['next'] = 'AdAuth_CheckCredentials'; } - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad_ldap-checkconnection', $data); + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad_ldap-checkconnection', $data); } } @@ -165,7 +165,7 @@ class AdAuth_SelfSearch extends AddModule_Base } else { $data['next'] = 'AdAuth_CheckCredentials'; } - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-selfsearch', + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-selfsearch', array_merge($this->taskIds, $data)); } @@ -218,7 +218,7 @@ class AdAuth_HomeAttrCheck extends AddModule_Base protected function renderInternal() { - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-selfsearch', array_merge($this->taskIds, array( + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-selfsearch', array_merge($this->taskIds, array( 'edit' => Request::post('edit'), 'title' => Request::post('title'), 'server' => Request::post('server'), @@ -289,7 +289,7 @@ class AdAuth_CheckCredentials extends AddModule_Base protected function renderInternal() { - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad_ldap-checkcredentials', array_merge($this->taskIds, array( + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad_ldap-checkcredentials', array_merge($this->taskIds, array( 'edit' => Request::post('edit'), 'title' => Request::post('title'), 'server' => Request::post('server') . ':' . Request::post('port'), @@ -407,7 +407,7 @@ class AdAuth_Finish extends AddModule_Base protected function renderInternal() { - Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-finish', $this->taskIds); + Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-finish', $this->taskIds); } } diff --git a/inc/configmodule.inc.php b/modules-available/sysconfig/inc/configmodule.inc.php index 909136ee..7b92ff89 100644 --- a/inc/configmodule.inc.php +++ b/modules-available/sysconfig/inc/configmodule.inc.php @@ -28,7 +28,7 @@ abstract class ConfigModule if (self::$moduleTypes !== false) return; self::$moduleTypes = array(); - foreach (glob('inc/configmodule/*.inc.php') as $file) { + foreach (glob(dirname(__FILE__) . '/configmodule/*.inc.php', GLOB_NOSORT) as $file) { require_once $file; } } diff --git a/inc/configmodule/adauth.inc.php b/modules-available/sysconfig/inc/configmodule/adauth.inc.php index efc8afd7..a03be43c 100644 --- a/inc/configmodule/adauth.inc.php +++ b/modules-available/sysconfig/inc/configmodule/adauth.inc.php @@ -1,16 +1,17 @@ <?php ConfigModule::registerModule( - 'AdAuth', // ID - Dictionary::translate('config-module', 'adAuth_title'), // Title - Dictionary::translate('config-module', 'adAuth_description'), // Description - Dictionary::translate('config-module', 'group_authentication'), // Group + ConfigModule_AdAuth::MODID, // ID + Dictionary::translateFile('config-module', 'adAuth_title'), // Title + Dictionary::translateFile('config-module', 'adAuth_description'), // Description + Dictionary::translateFile('config-module', 'group_authentication'), // Group true // Only one per config? ); class ConfigModule_AdAuth extends ConfigModule { + const MODID = 'AdAuth'; const VERSION = 1; private static $REQUIRED_FIELDS = array('server', 'searchbase', 'binddn'); diff --git a/inc/configmodule/branding.inc.php b/modules-available/sysconfig/inc/configmodule/branding.inc.php index b2f28c2f..479b406c 100644 --- a/inc/configmodule/branding.inc.php +++ b/modules-available/sysconfig/inc/configmodule/branding.inc.php @@ -2,9 +2,9 @@ ConfigModule::registerModule( ConfigModule_Branding::MODID, // ID - Dictionary::translate('config-module', 'branding_title'), // Title - Dictionary::translate('config-module', 'branding_description'), // Description - Dictionary::translate('config-module', 'group_branding'), // Group + Dictionary::translateFile('config-module', 'branding_title'), // Title + Dictionary::translateFile('config-module', 'branding_description'), // Description + Dictionary::translateFile('config-module', 'group_branding'), // Group true // Only one per config? ); @@ -45,6 +45,7 @@ class ConfigModule_Branding extends ConfigModule if ($key !== 'tmpFile' || !is_string($value) || !file_exists($value)) return false; $this->tmpFile = $value; + return true; } public function getData($key) diff --git a/inc/configmodule/customodule.inc.php b/modules-available/sysconfig/inc/configmodule/customodule.inc.php index 31796e9c..09b621cc 100644 --- a/inc/configmodule/customodule.inc.php +++ b/modules-available/sysconfig/inc/configmodule/customodule.inc.php @@ -2,9 +2,9 @@ ConfigModule::registerModule( ConfigModule_CustomModule::MODID, // ID - Dictionary::translate('config-module', 'custom_title'), // Title - Dictionary::translate('config-module', 'custom_description'), // Description - Dictionary::translate('config-module', 'group_generic'), // Group + Dictionary::translateFile('config-module', 'custom_title'), // Title + Dictionary::translateFile('config-module', 'custom_description'), // Description + Dictionary::translateFile('config-module', 'group_generic'), // Group false, // Only one per config? 100 // Sort order ); @@ -45,6 +45,7 @@ class ConfigModule_CustomModule extends ConfigModule if ($key !== 'tmpFile' || !file_exists($value)) return false; $this->tmpFile = $value; + return true; } public function getData($key) diff --git a/inc/configmodule/ldapauth.inc.php b/modules-available/sysconfig/inc/configmodule/ldapauth.inc.php index 67b1997a..0f386033 100644 --- a/inc/configmodule/ldapauth.inc.php +++ b/modules-available/sysconfig/inc/configmodule/ldapauth.inc.php @@ -1,16 +1,17 @@ <?php ConfigModule::registerModule( - 'LdapAuth', // ID - Dictionary::translate('config-module', 'ldapAuth_title'), // Title - Dictionary::translate('config-module', 'ldapAuth_description'), // Description - Dictionary::translate('config-module', 'group_authentication'), // Group + ConfigModule_LdapAuth::MODID, // ID + Dictionary::translateFile('config-module', 'ldapAuth_title'), // Title + Dictionary::translateFile('config-module', 'ldapAuth_description'), // Description + Dictionary::translateFile('config-module', 'group_authentication'), // Group true // Only one per config? ); class ConfigModule_LdapAuth extends ConfigModule { + const MODID = 'LdapAuth'; const VERSION = 1; private static $REQUIRED_FIELDS = array('server', 'searchbase'); diff --git a/inc/configmodule/sshconfig.inc.php b/modules-available/sysconfig/inc/configmodule/sshconfig.inc.php index 853acf6a..b1d58153 100644 --- a/inc/configmodule/sshconfig.inc.php +++ b/modules-available/sysconfig/inc/configmodule/sshconfig.inc.php @@ -2,9 +2,9 @@ ConfigModule::registerModule( ConfigModule_SshConfig::MODID, // ID - Dictionary::translate('config-module', 'sshconfig_title'), // Title - Dictionary::translate('config-module', 'sshconfig_description'), // Description - Dictionary::translate('config-module', 'group_sshconfig'), // Group + Dictionary::translateFile('config-module', 'sshconfig_title'), // Title + Dictionary::translateFile('config-module', 'sshconfig_description'), // Description + Dictionary::translateFile('config-module', 'group_sshconfig'), // Group true // Only one per config? ); diff --git a/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php index b51d2787..b51d2787 100644 --- a/inc/configtgz.inc.php +++ b/modules-available/sysconfig/inc/configtgz.inc.php diff --git a/lang/de/config-module.json b/modules-available/sysconfig/lang/de/config-module.json index 4e178b65..4e178b65 100644 --- a/lang/de/config-module.json +++ b/modules-available/sysconfig/lang/de/config-module.json diff --git a/lang/en/config-module.json b/modules-available/sysconfig/lang/en/config-module.json index efe6f697..efe6f697 100644 --- a/lang/en/config-module.json +++ b/modules-available/sysconfig/lang/en/config-module.json diff --git a/lang/pt/config-module.json b/modules-available/sysconfig/lang/pt/config-module.json index c44dc44f..c44dc44f 100644 --- a/lang/pt/config-module.json +++ b/modules-available/sysconfig/lang/pt/config-module.json diff --git a/modules-available/sysconfig/page.inc.php b/modules-available/sysconfig/page.inc.php index d4fe4a37..3f14a95d 100644 --- a/modules-available/sysconfig/page.inc.php +++ b/modules-available/sysconfig/page.inc.php @@ -54,8 +54,8 @@ class Page_SysConfig extends Page $action = Request::any('action', 'list'); // Load all addmodule classes, as they populate the $moduleTypes array - require_once 'modules/sysconfig/addmodule.inc.php'; - foreach (glob('modules/sysconfig/addmodule_*.inc.php') as $file) { + require_once Page::getModule()->getDir() . '/addmodule.inc.php'; + foreach (glob(Page::getModule()->getDir() . '/addmodule_*.inc.php') as $file) { require_once $file; } @@ -375,10 +375,10 @@ class Page_SysConfig extends Page private function initAddModule() { ConfigModule::loadDb(); - require_once 'modules/sysconfig/addmodule.inc.php'; - $step = Request::any('step', 'AddModule_Start'); + require_once Page::getModule()->getDir() . '/addmodule.inc.php'; + $step = Request::any('step', 'AddModule_Start', 'string'); if (!class_exists($step) && preg_match('/^([a-zA-Z0-9]+)_/', $step, $out)) { - require_once 'modules/sysconfig/addmodule_' . strtolower($out[1]) . '.inc.php'; + require_once Page::getModule()->getDir() . '/addmodule_' . strtolower($out[1]) . '.inc.php'; } AddModule_Base::setStep($step); } @@ -386,7 +386,7 @@ class Page_SysConfig extends Page private function initAddConfig() { ConfigModule::loadDb(); - require_once 'modules/sysconfig/addconfig.inc.php'; + require_once Page::getModule()->getDir() . '/addconfig.inc.php'; $step = Request::any('step', 0); if ($step === 0) $step = 'AddConfig_Start'; diff --git a/modules-available/translation/lang/de/template-tags.json b/modules-available/translation/lang/de/template-tags.json index 9b4da6bd..83871e46 100644 --- a/modules-available/translation/lang/de/template-tags.json +++ b/modules-available/translation/lang/de/template-tags.json @@ -1,8 +1,6 @@ { "lang_adminInfo": "Dies ist eine Liste aller Templates. Die \"Status\"-Spalte zeigt an, wenn f\u00fcr ein Template \u00fcbersetzungen fehlen, oder veraltete Tags definiert sind.", - "lang_back": "Zur\u00fcck", "lang_createTag": "Tag erstellen", - "lang_deleteTAG": "L\u00f6schen", "lang_editConfigModule": "Konfigurationsmodulbezeichnungsphrasen editieren", "lang_editHardcoded": "Hardcoded-Texte bearbeiten", "lang_editMessages": "Nachrichten bearbeiten", @@ -11,7 +9,6 @@ "lang_editTemplates": "Template-Texte bearbeiten", "lang_global": "Global", "lang_globalTooltip": "Dieser Tag ist global verf\u00fcgbar und braucht normalerweise nicht explizit f\u00fcr dieses Modul \u00fcbersetzt zu werden", - "lang_hint": "Hinweis", "lang_langAdministration": "Templates", "lang_mainHeading": "\u00dcbersetzungen verwalten", "lang_messages": "Benachrichtigungen", @@ -19,7 +16,6 @@ "lang_module": "Modul", "lang_otherStrings": "Andere Texte", "lang_sample": "Beispiel", - "lang_save": "Speichern", "lang_status": "Status", "lang_tag": "Tag", "lang_tags": "Tags", @@ -29,5 +25,5 @@ "lang_translation": "\u00dcbersetzung", "lang_translationHeading": "Verwalten der \u00dcbersetzungen", "lang_unused": "Ungenutzt", - "lang_unusedUnreliableHint": "Die Erkennung von ungenutzten Tags bezieht nur aktivierte Module mit ein. Es k\u00f6nnte sein, dass ein ungenutzt gemeldeter Tag in einem nicht aktivierten Modul verwendet wird." + "lang_unusedUnreliableHint": "Die Erkennung ungenutzter Tags bezieht nur aktivierte Module mit ein. Es k\u00f6nnte sein, dass ein ungenutzt gemeldeter Tag in einem nicht aktivierten Modul verwendet wird." }
\ No newline at end of file diff --git a/modules-available/translation/lang/en/template-tags.json b/modules-available/translation/lang/en/template-tags.json index 1b5e6dc8..75564bc3 100644 --- a/modules-available/translation/lang/en/template-tags.json +++ b/modules-available/translation/lang/en/template-tags.json @@ -1,8 +1,6 @@ { "lang_adminInfo": "This is a list of all templates. The \"status\"-column tells if there are translations missing, or unused tags are defined.", - "lang_back": "Back", "lang_createTag": "Create TAG", - "lang_deleteTAG": "Delete", "lang_editConfigModule": "Edit config module strings", "lang_editHardcoded": "Edit hardcoded strings", "lang_editMessages": "Edit Messages", @@ -11,7 +9,6 @@ "lang_editTemplates": "Edit template strings", "lang_global": "Global", "lang_globalTooltip": "This tag is global; usually there is no need to translate it explicitly for this module", - "lang_hint": "Notice", "lang_langAdministration": "Templates", "lang_mainHeading": "Translation management", "lang_messages": "Messages", @@ -19,7 +16,6 @@ "lang_module": "Module", "lang_otherStrings": "Other strings", "lang_sample": "Sample", - "lang_save": "Save", "lang_status": "Status", "lang_tag": "Tag", "lang_tags": "Tags", @@ -27,6 +23,7 @@ "lang_templateHint": "Hint: Yellow lines indicate a translation is missing and red lines indicate a tag is not being used by the template.", "lang_templates": "Templates", "lang_translation": "Translation", + "lang_translationHeading": "Manage translations", "lang_unused": "Unused", "lang_unusedUnreliableHint": "Detection of unused tags only includes currently activated modules. It's possible that a tag marked \"unused\" is actually refered to in a module not activated." }
\ No newline at end of file diff --git a/modules-available/translation/page.inc.php b/modules-available/translation/page.inc.php index f3474acd..1fc3a0fe 100644 --- a/modules-available/translation/page.inc.php +++ b/modules-available/translation/page.inc.php @@ -205,6 +205,7 @@ class Page_Translation extends Page 'module' => $this->module->getIdentifier(), 'moduleName' => $this->module->getDisplayName() )); + Render::openTag('div', array('class' => 'row')); // Templates $this->showModuleTemplates(); // Messages @@ -213,6 +214,7 @@ class Page_Translation extends Page $this->showModuleStrings(); // Module specific $this->showModuleCustom(); + Render::closeTag('div'); } private function showModuleTemplates() @@ -403,8 +405,13 @@ class Page_Translation extends Page if ($module === false) { $module = $this->module; } + $allFiles = $this->getAllFiles('modules', '.php'); + if ($module->getIdentifier() === 'main') { + $allFiles = array_merge($allFiles, $this->getAllFiles('apis', '.php'), $this->getAllFiles('inc', '.php')); + $allFiles[] = 'index.php'; + } $tags = $this->loadTagsFromPhp('/Message\s*::\s*add\w+\s*\(\s*[\'"](?<module>[^\'"\.]*)\.(?<tag>[^\'"]*)[\'"]\s*(?<data>\)|\,.*)/i', - $this->getAllFiles('modules', '.php')); + $allFiles); // Filter out tags that don't refer to this module foreach (array_keys($tags) as $tag) { // Figure out if this is a message from this module or not @@ -869,6 +876,7 @@ class Page_Translation extends Page } Message::addError('invalid-section', $this->section); $this->redirect(1); + return false; } /** @@ -878,7 +886,7 @@ class Page_Translation extends Page { $this->ensureValidDestLanguage(); if ($this->module === false) { - Message::addError('main.no-module-given'); + Message::addError('no-module-given'); $this->redirect(); } $file = $this->getJsonFile(); @@ -906,7 +914,7 @@ class Page_Translation extends Page $translation = Request::post('new-text', array(), 'array'); foreach (Request::post('new-id', array(), 'array') as $k => $tag) { - if (empty($translation[$k])) + if (empty($translation[$k]) || empty($tag)) continue; $data[(string)$tag] = (string)$translation[$k]; } diff --git a/modules-available/translation/templates/custom-list.html b/modules-available/translation/templates/custom-list.html index 42ee98ad..ee9463f0 100644 --- a/modules-available/translation/templates/custom-list.html +++ b/modules-available/translation/templates/custom-list.html @@ -1,21 +1,23 @@ -<div class="panel panel-default"> - <div class="panel-heading"> - {{subsection}} - </div> - <div class="panel-body"> - <div class="row"> - <div class="col-sm-6"> - {{#langs}} - <a href="?do=Translation&module={{module}}&section=custom&subsection={{subsection}}&destlang={{cc}}">{{name}} »</a> - <ul> - <li>{{lang_missing}}: {{missing}}</li> - <li>{{lang_unused}}: {{unused}}</li> - </ul> - {{/langs}} - </div> - <div class="col-sm-6"> - {{lang_tags}}: {{tagcount}} +<div class="col-lg-6"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{subsection}} + </div> + <div class="panel-body"> + <div class="row"> + <div class="col-sm-6"> + {{#langs}} + <a href="?do=Translation&module={{module}}&section=custom&subsection={{subsection}}&destlang={{cc}}">{{name}} »</a> + <ul> + <li>{{lang_missing}}: {{missing}}</li> + <li>{{lang_unused}}: {{unused}}</li> + </ul> + {{/langs}} + </div> + <div class="col-sm-6"> + {{lang_tags}}: {{tagcount}} + </div> </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/modules-available/translation/templates/edit.html b/modules-available/translation/templates/edit.html index af176c03..082e2cb5 100644 --- a/modules-available/translation/templates/edit.html +++ b/modules-available/translation/templates/edit.html @@ -14,7 +14,7 @@ <input type="hidden" name="subsection" value="{{subsection}}"> <input type="hidden" name="token" value="{{token}}"> <a class="btn btn-primary" href='?do=Translation' >{{lang_back}}</a> - <button class="btn btn-primary" type="button" onclick="addTag()" >{{lang_createTag}}</button> + <button class="btn btn-primary" type="button" onclick="slxAddTag()" >{{lang_createTag}}</button> <button type="submit" class="btn btn-primary" name="update" value="true">{{lang_save}}</button> <div class="row"> <div class="col-xs-4 col-sm-3">{{lang_tag}}</div> @@ -54,7 +54,7 @@ <div class="col-xs-2 col-sm-2 col-lg-1"> <button type="button" class="btn btn-danger btn-xs" onclick="slxDelTag({{tagid}})" tabindex="-1"> <span class="glyphicon glyphicon-remove"></span> - <span class="hidden-xs">{{lang_deleteTAG}}</span> + <span class="hidden-xs">{{lang_delete}}</span> </button> </div> </div> @@ -81,7 +81,7 @@ ' <div class="hidden-xs col-sm-4">' + ' </div>' + ' <div class="col-xs-2 col-sm-1">' + - ' <button type="button" class="btn btn-danger btn-xs" onclick="slxDelNew(' + slxNewTagCounter + ')"><span class="glyphicon glyphicon-remove"></span> {{lang_deleteTAG}}</button>' + + ' <button type="button" class="btn btn-danger btn-xs" onclick="slxDelNew(' + slxNewTagCounter + ')" tabindex="-1"><span class="glyphicon glyphicon-remove"></span> {{lang_delete}}</button>' + ' </div>' + '</div>' ); diff --git a/modules-available/translation/templates/message-list.html b/modules-available/translation/templates/message-list.html index 06cb4964..7e611a05 100644 --- a/modules-available/translation/templates/message-list.html +++ b/modules-available/translation/templates/message-list.html @@ -1,30 +1,32 @@ -<div class="panel panel-default"> - <div class="panel-heading"> - {{lang_messages}} - </div> - <div class="panel-body"> - <div class="row"> - <div class="col-sm-6"> - {{#langs}} - <a href="?do=Translation&module={{module}}&section=messages&destlang={{cc}}">{{name}} »</a> - <ul> - <li>{{lang_missing}}: {{missing}}</li> - <li>{{lang_unused}}: {{unused}}</li> - </ul> - {{/langs}} - </div> - <div class="col-sm-6"> - <div>{{lang_messages}}: {{messagecount}}</div> - <ul> - {{#files}} - <li>{{file}}</li> - {{/files}} - </ul> - <div> - <span class="label label-info">{{lang_hint}}</span> - {{lang_unusedUnreliableHint}} +<div class="col-lg-6"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{lang_messages}} + </div> + <div class="panel-body"> + <div class="row"> + <div class="col-sm-6"> + {{#langs}} + <a href="?do=Translation&module={{module}}&section=messages&destlang={{cc}}">{{name}} »</a> + <ul> + <li>{{lang_missing}}: {{missing}}</li> + <li>{{lang_unused}}: {{unused}}</li> + </ul> + {{/langs}} </div> + <div class="col-sm-6 slx-textpreview-200"> + <div>{{lang_messages}}: {{messagecount}}</div> + <ul> + {{#files}} + <li>{{file}}</li> + {{/files}} + </ul> + </div> + </div> + <div> + <span class="label label-info">{{lang_hint}}</span> + {{lang_unusedUnreliableHint}} </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/modules-available/translation/templates/string-list.html b/modules-available/translation/templates/string-list.html index f1301494..064e0ccf 100644 --- a/modules-available/translation/templates/string-list.html +++ b/modules-available/translation/templates/string-list.html @@ -1,21 +1,23 @@ -<div class="panel panel-default"> - <div class="panel-heading"> - {{lang_otherStrings}} - </div> - <div class="panel-body"> - <div class="row"> - <div class="col-sm-6"> - {{#langs}} - <a href="?do=Translation&module={{module}}&section=module&destlang={{cc}}">{{name}} »</a> - <ul> - <li>{{lang_missing}}: {{missing}}</li> - <li>{{lang_unused}}: {{unused}}</li> - </ul> - {{/langs}} - </div> - <div class="col-sm-6"> - {{lang_tags}}: {{tagcount}} +<div class="col-lg-6"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{lang_otherStrings}} + </div> + <div class="panel-body"> + <div class="row"> + <div class="col-sm-6"> + {{#langs}} + <a href="?do=Translation&module={{module}}&section=module&destlang={{cc}}">{{name}} »</a> + <ul> + <li>{{lang_missing}}: {{missing}}</li> + <li>{{lang_unused}}: {{unused}}</li> + </ul> + {{/langs}} + </div> + <div class="col-sm-6"> + {{lang_tags}}: {{tagcount}} + </div> </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/modules-available/translation/templates/template-list.html b/modules-available/translation/templates/template-list.html index 5d3689ad..2de7c2f8 100644 --- a/modules-available/translation/templates/template-list.html +++ b/modules-available/translation/templates/template-list.html @@ -1,26 +1,28 @@ -<div class="panel panel-default"> - <div class="panel-heading"> - {{lang_templates}} - </div> - <div class="panel-body"> - <div class="row"> - <div class="col-sm-6"> - {{#langs}} - <a href="?do=Translation&module={{module}}&section=template&destlang={{cc}}">{{name}} »</a> - <ul> - <li>{{lang_missing}}: {{missing}}</li> - <li>{{lang_unused}}: {{unused}}</li> - </ul> - {{/langs}} - </div> - <div class="col-sm-6"> - {{lang_tags}}: {{tagcount}} - <ul> - {{#templates}} - <li>{{template}}</li> - {{/templates}} - </ul> +<div class="col-lg-6"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{lang_templates}} + </div> + <div class="panel-body"> + <div class="row"> + <div class="col-sm-6"> + {{#langs}} + <a href="?do=Translation&module={{module}}&section=template&destlang={{cc}}">{{name}} »</a> + <ul> + <li>{{lang_missing}}: {{missing}}</li> + <li>{{lang_unused}}: {{unused}}</li> + </ul> + {{/langs}} + </div> + <div class="col-sm-6"> + {{lang_tags}}: {{tagcount}} + <ul> + {{#templates}} + <li>{{template}}</li> + {{/templates}} + </ul> + </div> </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/modules-available/usermanagement/lang/de/module.json b/modules-available/usermanagement/lang/de/module.json new file mode 100644 index 00000000..49d72a69 --- /dev/null +++ b/modules-available/usermanagement/lang/de/module.json @@ -0,0 +1,3 @@ +{ + "module_name": "Benutzerverwaltung" +}
\ No newline at end of file diff --git a/style/default.css b/style/default.css index 12c67918..74997381 100644 --- a/style/default.css +++ b/style/default.css @@ -257,12 +257,16 @@ input[readonly] { margin: 3px; } -.slx-textpreview { +.slx-textpreview, .slx-textpreview-200 { max-height: 60px; overflow-y: auto; overflow-x: hidden; } +.slx-textpreview-200 { + max-height: 200px; +} + /* * Sidebar */ |