From 8969b7161321c11777a232bbcc2c61ea3c2525c9 Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Fri, 23 May 2014 12:56:39 +0000 Subject: [PATCH] Replace "operator/translate.php" with a controller --- .../Controller/TranslationController.php | 244 ++++++++++++++++++ src/mibew/libs/routing.yml | 28 ++ src/mibew/operator/translate.php | 159 ------------ .../server_side/_menu.handlebars | 2 +- ...handlebars => translation_edit.handlebars} | 3 +- ...ist.handlebars => translations.handlebars} | 8 +- 6 files changed, 278 insertions(+), 166 deletions(-) create mode 100644 src/mibew/libs/classes/Mibew/Controller/TranslationController.php delete mode 100644 src/mibew/operator/translate.php rename src/mibew/styles/pages/default/templates_src/server_side/{translate.handlebars => translation_edit.handlebars} (95%) rename src/mibew/styles/pages/default/templates_src/server_side/{translate_list.handlebars => translations.handlebars} (86%) diff --git a/src/mibew/libs/classes/Mibew/Controller/TranslationController.php b/src/mibew/libs/classes/Mibew/Controller/TranslationController.php new file mode 100644 index 00000000..8e81d946 --- /dev/null +++ b/src/mibew/libs/classes/Mibew/Controller/TranslationController.php @@ -0,0 +1,244 @@ +attributes->get('_operator'); + + $source = $request->query->get('source'); + if (!preg_match("/^[\w-]{2,5}$/", $source)) { + $source = DEFAULT_LOCALE; + } + + $target = $request->query->get('target'); + if (!preg_match("/^[\w-]{2,5}$/", $target)) { + $target = CURRENT_LOCALE; + } + + $lang1 = load_messages($source); + $lang2 = load_messages($target); + + $page = array( + 'lang1' => $source, + 'lang2' => $target, + 'title1' => isset($lang1['localeid']) ? $lang1['localeid'] : $source, + 'title2' => isset($lang2['localeid']) ? $lang2['localeid'] : $target, + 'errors' => array(), + ); + + // Load list of all available locales. + $locales_list = array(); + $all_locales = get_available_locales(); + foreach ($all_locales as $loc) { + $locales_list[] = array("id" => $loc, "name" => getlocal_("localeid", $loc)); + } + + // Extract needed localization constants. + $show = $request->query->get('show'); + if (!in_array($show, array('all', 's1', 's2', 's3'))) { + $show = 'all'; + } + + $result = array(); + $all_keys = array_keys($lang1); + if ($show == 's1') { + $all_keys = array_intersect($all_keys, locale_load_id_list('level1')); + } elseif ($show == 's2') { + $all_keys = array_intersect($all_keys, locale_load_id_list('level2')); + } elseif ($show == 's3') { + $all_keys = array_diff($all_keys, locale_load_id_list('level1'), locale_load_id_list('level2')); + } + + // Prepare localization constants to display. + foreach ($all_keys as $key) { + $t_source = htmlspecialchars($lang1[$key]); + if (isset($lang2[$key])) { + $value = htmlspecialchars($lang2[$key]); + } else { + $value = "absent"; + } + $result[] = array( + 'id' => $key, + 'l1' => $t_source, + 'l2' => $value, + ); + } + + // Sort localization constants in the specified order. + $order = $request->query->get('sort'); + if (!in_array($order, array('id', 'l1'))) { + $order = 'id'; + } + + if ($order == 'id') { + usort( + $result, + function ($a, $b) { + return strcmp($a['id'], $b['id']); + } + ); + } elseif ($order == 'l1') { + usort( + $result, + function ($a, $b) { + return strcmp($a['l1'], $b['l1']); + } + ); + } + + $pagination = setup_pagination($result, 100); + $page['pagination'] = $pagination['info']; + $page['pagination.items'] = $pagination['items']; + $page['formtarget'] = $target; + $page['formsource'] = $source; + $page['availableLocales'] = $locales_list; + $page['availableOrders'] = array( + array('id' => 'id', 'name' => getlocal('translate.sort.key')), + array('id' => 'l1', 'name' => getlocal('translate.sort.lang')), + ); + $page['formsort'] = $order; + $page['showOptions'] = array( + array('id' => 'all', 'name' => getlocal('translate.show.all')), + array('id' => 's1', 'name' => getlocal('translate.show.forvisitor')), + array('id' => 's2', 'name' => getlocal('translate.show.foroperator')), + array('id' => 's3', 'name' => getlocal('translate.show.foradmin')), + ); + $page['formshow'] = $show; + $page['title'] = getlocal('page.translate.title'); + $page['menuid'] = 'translation'; + $page = array_merge($page, prepare_menu($operator)); + + return $this->render('translations', $page); + } + + /** + * Builds a page with form for edit localization constant. + * + * @param Request $request Incoming request. + * @return string Rendered page content. + */ + public function showEditFormAction(Request $request) + { + set_csrf_token(); + + $operator = $request->attributes->get('_operator'); + $string_id = $request->attributes->get('string_id'); + + $source = $request->query->get('source'); + if (!preg_match("/^[\w-]{2,5}$/", $source)) { + $source = DEFAULT_LOCALE; + } + + $target = $request->query->has('target') + ? $request->query->get('target') + : $request->request->get('target'); + if (!preg_match("/^[\w-]{2,5}$/", $target)) { + $target = CURRENT_LOCALE; + } + + $lang1 = load_messages($source); + $lang2 = load_messages($target); + + $page = array( + 'title1' => isset($lang1['localeid']) ? $lang1['localeid'] : $source, + 'title2' => isset($lang2['localeid']) ? $lang2['localeid'] : $target, + // Use errors list stored in the request. We need to do so to have + // an ability to pass the request from the "submitEditForm" action. + 'errors' => $request->attributes->get('errors', array()), + ); + + + $translation = isset($lang2[$string_id]) ? $lang2[$string_id] : ''; + // Override translation value from the request if needed. + if ($request->request->has('translation')) { + $translation = $request->request->get('translation'); + } + + $page['saved'] = false; + $page['key'] = $string_id; + $page['target'] = $target; + $page['formoriginal'] = isset($lang1[$string_id]) ? $lang1[$string_id] : ''; + $page['formtranslation'] = $translation; + $page['title'] = getlocal('page.translate.title'); + $page = array_merge( + $page, + prepare_menu($operator, false) + ); + + return $this->render('translation_edit', $page); + } + + /** + * Processes submitting of the form which is generated in + * {@link \Mibew\Controller\TranslateController::showEditFormAction()} + * method. + * + * @param Request $request Incoming request. + * @return string Rendered page content. + */ + public function submitEditFormAction(Request $request) + { + csrf_check_token($request); + + $operator = $request->attributes->get('_operator'); + $string_id = $request->attributes->get('string_id'); + $errors = array(); + + $target = $request->request->get('target'); + if (!preg_match("/^[\w-]{2,5}$/", $target)) { + $target = CURRENT_LOCALE; + } + + $translation = $request->request->get('translation'); + if (!$translation) { + $errors[] = no_field("form.field.translation"); + } + + if (count($errors) != 0) { + $request->attributes->set('errors', $errors); + + // The form should be rebuild. Invoke appropriate action. + return $this->showEditFormAction($request); + } + + save_message($target, $string_id, $translation); + + $page['saved'] = true; + $page['title'] = getlocal("page.translate.title"); + $page = array_merge( + $page, + prepare_menu($operator, false) + ); + + return $this->render('translation_edit', $page); + } +} diff --git a/src/mibew/libs/routing.yml b/src/mibew/libs/routing.yml index 92938002..fcafcbbf 100644 --- a/src/mibew/libs/routing.yml +++ b/src/mibew/libs/routing.yml @@ -323,6 +323,34 @@ statistics: requirements: type: by-date|by-operator|by-page +## Translation +translation_edit: + path: /operator/translation/{string_id}/edit + defaults: + _controller: Mibew\Controller\TranslationController::showEditFormAction + _access_check: Mibew\AccessControl\Check\PermissionsCheck + _access_permissions: [CAN_ADMINISTRATE] + requirements: + string_id: "[_\.\w]+" + methods: [GET] + +translation_edit_save: + path: /operator/translation/{string_id}/edit + defaults: + _controller: Mibew\Controller\TranslationController::submitEditFormAction + _access_check: Mibew\AccessControl\Check\PermissionsCheck + _access_permissions: [CAN_ADMINISTRATE] + requirements: + string_id: "[_\.\w]+" + methods: [POST] + +translations: + path: /operator/translation + defaults: + _controller: Mibew\Controller\TranslationController::indexAction + _access_check: Mibew\AccessControl\Check\PermissionsCheck + _access_permissions: [CAN_ADMINISTRATE] + ## Updates updates: path: /operator/updates diff --git a/src/mibew/operator/translate.php b/src/mibew/operator/translate.php deleted file mode 100644 index efb8aede..00000000 --- a/src/mibew/operator/translate.php +++ /dev/null @@ -1,159 +0,0 @@ - $source, - 'lang2' => $target, - 'title1' => (isset($lang1["localeid"]) ? $lang1["localeid"] : $source), - 'title2' => (isset($lang2["localeid"]) ? $lang2["localeid"] : $target), - 'errors' => array(), -); - -$page_style = new PageStyle(PageStyle::getCurrentStyle()); - -if ($string_id) { - $translation = isset($lang2[$string_id]) ? $lang2[$string_id] : ""; - if (isset($_POST['translation'])) { - - $translation = get_param('translation'); - if (!$translation) { - $page['errors'][] = no_field("form.field.translation"); - } - - if (count($page['errors']) == 0) { - save_message($target, $string_id, $translation); - - $page['saved'] = true; - $page['title'] = getlocal("page.translate.title"); - $page = array_merge( - $page, - prepare_menu($operator, false) - ); - $page_style->render('translate', $page); - exit; - } - } - - $page['saved'] = false; - $page['key'] = $string_id; - $page['target'] = $target; - $page['formoriginal'] = isset($lang1[$string_id]) ? $lang1[$string_id] : ""; - $page['formtranslation'] = $translation; - $page['title'] = getlocal("page.translate.title"); - $page = array_merge( - $page, - prepare_menu($operator, false) - ); - $page_style->render('translate', $page); - exit; -} - -$locales_list = array(); -$all_locales = get_available_locales(); -foreach ($all_locales as $loc) { - $locales_list[] = array("id" => $loc, "name" => getlocal_("localeid", $loc)); -} - -$show = verify_param("show", "/^(all|s1|s2|s3)$/", "all"); - -$result = array(); -$all_keys = array_keys($lang1); -if ($show == 's1') { - $all_keys = array_intersect($all_keys, locale_load_id_list('level1')); -} elseif ($show == 's2') { - $all_keys = array_intersect($all_keys, locale_load_id_list('level2')); -} elseif ($show == 's3') { - $all_keys = array_diff($all_keys, locale_load_id_list('level1'), locale_load_id_list('level2')); -} - -foreach ($all_keys as $key) { - $t_source = htmlspecialchars($lang1[$key]); - if (isset($lang2[$key])) { - $value = htmlspecialchars($lang2[$key]); - } else { - $value = "absent"; - } - $result[] = array( - 'id' => $key, - 'l1' => $t_source, - 'l2' => $value, - 'idToPage' => $key, - 'l1ToPage' => $t_source, - 'l2ToPage' => $value, - ); -} - -$order = verify_param("sort", "/^(id|l1)$/", "id"); -if ($order == 'id') { - usort( - $result, - function ($a, $b) { - return strcmp($a['id'], $b['id']); - } - ); -} elseif ($order == 'l1') { - usort( - $result, - function ($a, $b) { - return strcmp($a['l1'], $b['l1']); - } - ); -} - -$pagination = setup_pagination($result, 100); -$page['pagination'] = $pagination['info']; -$page['pagination.items'] = $pagination['items']; - -$page['formtarget'] = $target; -$page['formsource'] = $source; -$page['availableLocales'] = $locales_list; -$page['availableOrders'] = array( - array("id" => "id", "name" => getlocal("translate.sort.key")), - array("id" => "l1", "name" => getlocal("translate.sort.lang")), -); -$page['formsort'] = $order; -$page['showOptions'] = array( - array("id" => "all", "name" => getlocal("translate.show.all")), - array("id" => "s1", "name" => getlocal("translate.show.forvisitor")), - array("id" => "s2", "name" => getlocal("translate.show.foroperator")), - array("id" => "s3", "name" => getlocal("translate.show.foradmin")), -); -$page['formshow'] = $show; - -$page['title'] = getlocal("page.translate.title"); -$page['menuid'] = "translate"; - -$page = array_merge($page, prepare_menu($operator)); - -$page_style->render('translate_list', $page); diff --git a/src/mibew/styles/pages/default/templates_src/server_side/_menu.handlebars b/src/mibew/styles/pages/default/templates_src/server_side/_menu.handlebars index c1842199..55633764 100644 --- a/src/mibew/styles/pages/default/templates_src/server_side/_menu.handlebars +++ b/src/mibew/styles/pages/default/templates_src/server_side/_menu.handlebars @@ -32,7 +32,7 @@ {{l10n "leftMenu.client_agents"}} {{l10n "menu.groups"}} {{l10n "leftMenu.client_settings"}} - {{l10n "menu.translate"}} + {{l10n "menu.translate"}} {{l10n "menu.updates"}} {{/if}} {{#if currentopid}} diff --git a/src/mibew/styles/pages/default/templates_src/server_side/translate.handlebars b/src/mibew/styles/pages/default/templates_src/server_side/translation_edit.handlebars similarity index 95% rename from src/mibew/styles/pages/default/templates_src/server_side/translate.handlebars rename to src/mibew/styles/pages/default/templates_src/server_side/translation_edit.handlebars index c4eee921..727f51bf 100644 --- a/src/mibew/styles/pages/default/templates_src/server_side/translate.handlebars +++ b/src/mibew/styles/pages/default/templates_src/server_side/translation_edit.handlebars @@ -17,9 +17,8 @@ {{> _errors}} -
+ {{csrfTokenInput}} -
diff --git a/src/mibew/styles/pages/default/templates_src/server_side/translate_list.handlebars b/src/mibew/styles/pages/default/templates_src/server_side/translations.handlebars similarity index 86% rename from src/mibew/styles/pages/default/templates_src/server_side/translate_list.handlebars rename to src/mibew/styles/pages/default/templates_src/server_side/translations.handlebars index 32b2fd0d..c2341b5f 100644 --- a/src/mibew/styles/pages/default/templates_src/server_side/translate_list.handlebars +++ b/src/mibew/styles/pages/default/templates_src/server_side/translations.handlebars @@ -7,7 +7,7 @@

- +
@@ -79,13 +79,13 @@ {{#each [pagination.items]}} - {{idToPage}} + {{id}} - {{{l1ToPage}}} + {{{l1}}} - {{{l2ToPage}}} + {{{l2}}} {{else}}