From a4428eb7c10c91ac4288449fc2376fc154309a57 Mon Sep 17 00:00:00 2001 From: Axel Guckelsberger Date: Wed, 25 Oct 2017 09:28:57 +0200 Subject: [PATCH] fixed multilingual category editing problem (#3834) * fixed multilingual category editing problem * updated changelog entry --- CHANGELOG-1.5.md | 1 + .../Controller/NodeController.php | 7 ++--- .../Form/Type/CategoryType.php | 27 +++++++++++++++++++ .../Resources/views/Category/edit.html.twig | 4 +-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/CHANGELOG-1.5.md b/CHANGELOG-1.5.md index 82542f4454..296f132ca7 100644 --- a/CHANGELOG-1.5.md +++ b/CHANGELOG-1.5.md @@ -10,6 +10,7 @@ CHANGELOG - ZIKULA 1.5.x - Added missing action icons to admin menu sub entries and admin panel module links. - Fixed locale determination in legacy url creation. - Fixed admin category creation issues (#3826, #3827). + - Fixed multilingual category editing problem. - Vendor updates: - composer/ca-bundle updated from 1.0.7 to 1.0.8 diff --git a/src/system/CategoriesModule/Controller/NodeController.php b/src/system/CategoriesModule/Controller/NodeController.php index 44072a2c41..a80fc3d9e3 100644 --- a/src/system/CategoriesModule/Controller/NodeController.php +++ b/src/system/CategoriesModule/Controller/NodeController.php @@ -62,8 +62,9 @@ public function contextMenuAction(Request $request, $action = 'edit', CategoryEn $category = $newCategory; // intentionally no break here case 'edit': + $localeApi = $this->get('zikula_settings_module.locale_api'); if (!isset($category)) { - $category = new CategoryEntity($this->get('zikula_settings_module.locale_api')->getSupportedLocales()); + $category = new CategoryEntity($localeApi->getSupportedLocales()); $parentId = $request->request->get('parent'); $mode = 'new'; if (!empty($parentId)) { @@ -78,7 +79,7 @@ public function contextMenuAction(Request $request, $action = 'edit', CategoryEn } $form = $this->createForm(CategoryType::class, $category, [ 'translator' => $this->get('translator.default'), - 'locales' => $this->get('zikula_settings_module.locale_api')->getSupportedLocales(), + 'locales' => $localeApi->getSupportedLocales(), ]); $form->get('after')->setData($request->request->get('after', null)); if ($form->handleRequest($request)->isValid()) { @@ -99,7 +100,7 @@ public function contextMenuAction(Request $request, $action = 'edit', CategoryEn } $response = [ 'result' => $this->renderView('@ZikulaCategoriesModule/Category/edit.html.twig', [ - 'locales' => $this->get('zikula_settings_module.locale_api')->getSupportedLocaleNames(null, $request->getLocale()), + 'locales' => $localeApi->getSupportedLocaleNames(null, $request->getLocale()), 'form' => $form->createView() ]), 'action' => $action, diff --git a/src/system/CategoriesModule/Form/Type/CategoryType.php b/src/system/CategoriesModule/Form/Type/CategoryType.php index 1e807085fb..dee3bdd9d4 100644 --- a/src/system/CategoriesModule/Form/Type/CategoryType.php +++ b/src/system/CategoriesModule/Form/Type/CategoryType.php @@ -91,18 +91,45 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'mapped' => false, 'required' => false ]) + ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) { + // ensure all display name and description exist for all locales + /** @var CategoryEntity $category */ + $category = $event->getData(); + + $name = $category->getName(); + + $displayName = $category->getDisplay_name(); + $displayDesc = $category->getDisplay_desc(); + + foreach ($options['locales'] as $code) { + if (!isset($displayName[$code]) || !$displayName[$code]) { + $displayName[$code] = $options['translator']->__(/** @Ignore */$name, 'zikula', $code); + } + if (!isset($displayDesc[$code])) { + $displayDesc[$code] = ''; + } + } + + $category->setDisplay_name($displayName); + $category->setDisplay_desc($displayDesc); + + $event->setData($category); + }) ->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) use ($options) { // ensure all locales have a display name /** @var CategoryEntity $category */ $category = $event->getData(); + $name = $category->getName(); $displayName = $category->getDisplay_name(); + foreach ($options['locales'] as $code) { if (!isset($displayName[$code]) || !$displayName[$code]) { $displayName[$code] = $options['translator']->__(/** @Ignore */$name, 'zikula', $code); } } $category->setDisplay_name($displayName); + $event->setData($category); }) ; diff --git a/src/system/CategoriesModule/Resources/views/Category/edit.html.twig b/src/system/CategoriesModule/Resources/views/Category/edit.html.twig index c368cd7a96..8ef94cb1fd 100644 --- a/src/system/CategoriesModule/Resources/views/Category/edit.html.twig +++ b/src/system/CategoriesModule/Resources/views/Category/edit.html.twig @@ -25,8 +25,8 @@
{% for name, code in locales %}
- {{ form_row(form.display_name[code], {'label': form.display_name.vars.label ~ ' (' ~ code ~ ')' }) }} - {{ form_row(form.display_desc[code], {'label': form.display_desc.vars.label ~ ' (' ~ code ~ ')' }) }} + {{ form_row(form.display_name[code], {label: form.display_name.vars.label ~ ' (' ~ code ~ ')' }) }} + {{ form_row(form.display_desc[code], {label: form.display_desc.vars.label ~ ' (' ~ code ~ ')' }) }}
{% endfor %}