From 2f04c82ada89e0ee667e6c503142b12e0915cc51 Mon Sep 17 00:00:00 2001 From: Paola Wechs <47451524+pwechs@users.noreply.github.com> Date: Fri, 14 Oct 2022 18:17:15 +0200 Subject: [PATCH] =?UTF-8?q?Pr=C3=BCfung=20auf=20Verwendung=20und=20Dialog?= =?UTF-8?q?=20beim=20"inaktiv"=20setzen=20eines=20Templates=20(#5366)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tools/psalm/baseline.xml | 12 +- .../structure/plugins/content/lang/de_de.lang | 2 + .../structure/plugins/content/lang/en_gb.lang | 2 + .../plugins/content/lib/api_template.php | 53 +++++++++ .../plugins/content/pages/templates.php | 107 ++++++++---------- 5 files changed, 106 insertions(+), 70 deletions(-) diff --git a/.tools/psalm/baseline.xml b/.tools/psalm/baseline.xml index c866d06c74..845542e05f 100644 --- a/.tools/psalm/baseline.xml +++ b/.tools/psalm/baseline.xml @@ -3076,10 +3076,7 @@ - - $aid - $clangId - $clangId + $templatename $templatename @@ -3107,13 +3104,6 @@ rex_escape($templatekey) rex_escape($templatename) - - $aid - - - getCode - getName - diff --git a/redaxo/src/addons/structure/plugins/content/lang/de_de.lang b/redaxo/src/addons/structure/plugins/content/lang/de_de.lang index db16807963..401614acbe 100644 --- a/redaxo/src/addons/structure/plugins/content/lang/de_de.lang +++ b/redaxo/src/addons/structure/plugins/content/lang/de_de.lang @@ -71,6 +71,8 @@ templates_not_found = Es wurden keine Templates gefunden title_templates = Templates cant_delete_template_because_its_in_use = Template {0} kann nicht gelöscht werden, da es noch von folgenden Artikeln genutzt wird: cant_delete_template_because_its_default_template = Template {0} kann nicht gelöscht werden, da es als Standardtemplate festgelegt ist. +cant_inactivate_template_because_its_in_use = Template {0} kann nicht inaktiv gesetzt werden, da es noch von folgenden Artikeln genutzt wird: +cant_inactivate_template_because_its_default_template = Template {0} kann nicht inaktiv gesetzt werden, da es als Standardtemplate festgelegt ist. template_deleted = Template wurde gelöscht. template_added = Template wurde hinzugefügt template_updated = Template wurde aktualisiert diff --git a/redaxo/src/addons/structure/plugins/content/lang/en_gb.lang b/redaxo/src/addons/structure/plugins/content/lang/en_gb.lang index fa67fb3344..a006148d06 100644 --- a/redaxo/src/addons/structure/plugins/content/lang/en_gb.lang +++ b/redaxo/src/addons/structure/plugins/content/lang/en_gb.lang @@ -71,6 +71,8 @@ templates_not_found = Templates not found title_templates = Templates cant_delete_template_because_its_in_use = Template '{0}' cannot be deleted because it is used by following articles: cant_delete_template_because_its_default_template = Template '{0}' cannot be deleted because it its the default template. +cant_inactivate_template_because_its_in_use = Template '{0}' cannot be inactivated because it is used by following articles: +cant_inactivate_template_because_its_default_template = Template '{0}' cannot be inactivated because it its the default template. template_deleted = Template deleted. template_added = Template added. template_updated = Template updated. diff --git a/redaxo/src/addons/structure/plugins/content/lib/api_template.php b/redaxo/src/addons/structure/plugins/content/lib/api_template.php index c4bddb373c..7dd52ddceb 100644 --- a/redaxo/src/addons/structure/plugins/content/lib/api_template.php +++ b/redaxo/src/addons/structure/plugins/content/lib/api_template.php @@ -236,4 +236,57 @@ public function getCtypes(): array { return rex_ctype::forTemplate($this->id); } + + /** + * @return false|string + */ + public static function templateIsInUse(int $templateId, string $msgKey) + { + $check = rex_sql::factory(); + $check->setQuery(' + SELECT article.id, article.clang_id, template.name + FROM ' . rex::getTable('article') . ' article + LEFT JOIN ' . rex::getTable('template') . ' template ON article.template_id=template.id + WHERE article.template_id=? + LIMIT 20 + ', [$templateId]); + + if (!$check->getRows()) { + return false; + } + $templateInUseMessage = ''; + $error = ''; + $templatename = $check->getRows() ? $check->getValue('template.name') : null; + while ($check->hasNext()) { + $aid = (int) $check->getValue('article.id'); + $clangId = (int) $check->getValue('article.clang_id'); + $article = rex_article::get($aid, $clangId); + if (null == $article) { + continue; + } + $label = $article->getName() . ' [' . $aid . ']'; + if (rex_clang::count() > 1) { + $clang = rex_clang::get($clangId); + if (null == $clang) { + continue; + } + $label .= ' [' . $clang->getCode() . ']'; + } + + $templateInUseMessage .= '
  • ' . rex_escape($label) . '
  • '; + $check->next(); + } + + if (null == $templatename) { + $check->setQuery('SELECT name FROM '.rex::getTable('template'). ' WHERE id = '.$templateId); + $templatename = $check->getValue('name'); + } + + if ('' != $templateInUseMessage && null != $templatename) { + $error .= rex_i18n::msg($msgKey, (string) $templatename); + $error .= ''; + } + + return $error; + } } diff --git a/redaxo/src/addons/structure/plugins/content/pages/templates.php b/redaxo/src/addons/structure/plugins/content/pages/templates.php index caeb617171..436d488399 100644 --- a/redaxo/src/addons/structure/plugins/content/pages/templates.php +++ b/redaxo/src/addons/structure/plugins/content/pages/templates.php @@ -28,45 +28,20 @@ $error = rex_i18n::msg('csrf_token_invalid'); } else { $del = rex_sql::factory(); - $del->setQuery(' - SELECT article.id, article.clang_id, template.name - FROM ' . rex::getTable('article') . ' article - LEFT JOIN ' . rex::getTable('template') . ' template ON article.template_id=template.id - WHERE article.template_id=? - LIMIT 20 - ', [$templateId]); - - if ($del->getRows() > 0 || rex_template::getDefaultId() == $templateId) { - $templateInUseMessage = ''; - $templatename = $del->getRows() ? $del->getValue('template.name') : null; - while ($del->hasNext()) { - $aid = $del->getValue('article.id'); - $clangId = $del->getValue('article.clang_id'); - $OOArt = rex_article::get($aid, $clangId); - - $label = $OOArt->getName() . ' [' . $aid . ']'; - if (rex_clang::count() > 1) { - $label .= ' [' . rex_clang::get($clangId)->getCode() . ']'; - } - - $templateInUseMessage .= '
  • ' . rex_escape($label) . '
  • '; - $del->next(); - } + $templateIsInUseError = rex_template::templateIsInUse($templateId, 'cant_delete_template_because_its_in_use'); + if (false !== $templateIsInUseError) { + $error .= $templateIsInUseError; + } - if ('' != $templateInUseMessage) { - $error .= rex_i18n::msg('cant_delete_template_because_its_in_use', $templatename); - $error .= ''; - } + if (rex_template::getDefaultId() == $templateId) { + $del = rex_sql::factory(); + $del->setQuery('SELECT name FROM '.rex::getTable('template').' WHERE id = '.$templateId); + $templatename = $del->getValue('name'); - if (rex_template::getDefaultId() == $templateId) { - if ('' == $templatename) { - $del->setQuery('SELECT name FROM '.rex::getTable('template'). ' WHERE id = '.$templateId); - $templatename = $del->getValue('name'); - } - $error .= rex_i18n::msg('cant_delete_template_because_its_default_template', $templatename); - } - } else { - $del->setQuery('DELETE FROM ' . rex::getTablePrefix() . 'template WHERE id = "' . $templateId . '" LIMIT 1'); // max. ein Datensatz darf loeschbar sein + $error .= rex_i18n::msg('cant_delete_template_because_its_default_template', $templatename); + } + if ('' == $error) { + $del->setQuery('DELETE FROM '.rex::getTablePrefix().'template WHERE id = "'.$templateId.'" LIMIT 1'); // max. ein Datensatz darf loeschbar sein rex_template_cache::delete($templateId); $success = rex_i18n::msg('template_deleted'); $success = rex_extension::registerPoint(new rex_extension_point('TEMPLATE_DELETED', $success, [ @@ -172,29 +147,43 @@ } } } else { - $TPL->setWhere(['id' => $templateId]); - $TPL->addGlobalUpdateFields(); + $templateIsInUseError = rex_template::templateIsInUse($templateId, 'cant_inactivate_template_because_its_in_use'); + if (false !== $templateIsInUseError) { + $error .= $templateIsInUseError; + } + if (rex_template::getDefaultId() == $templateId) { + $query = rex_sql::factory(); + $query->setQuery('SELECT name FROM '.rex::getTable('template').' WHERE id = '.$templateId); + $templatename = $query->getValue('name'); - try { - $TPL->update(); - rex_template_cache::delete($templateId); - $success = rex_i18n::msg('template_updated'); - $success = rex_extension::registerPoint(new rex_extension_point('TEMPLATE_UPDATED', $success, [ - 'id' => $templateId, - 'key' => $templatekey, - 'name' => $templatename, - 'content' => $template, - 'active' => $active, - 'ctype' => $ctypes, - 'modules' => $modules, - 'categories' => $categories, - ])); - } catch (rex_sql_exception $e) { - if (rex_sql::ERROR_VIOLATE_UNIQUE_KEY == $e->getErrorCode()) { - $error = rex_i18n::msg('template_key_exists'); - $save = 'nein'; - } else { - $error = $e->getMessage(); + $error .= rex_i18n::msg('cant_inactivate_template_because_its_default_template', $templatename); + } + + if ('' == $error) { + $TPL->setWhere(['id' => $templateId]); + $TPL->addGlobalUpdateFields(); + + try { + $TPL->update(); + rex_template_cache::delete($templateId); + $success = rex_i18n::msg('template_updated'); + $success = rex_extension::registerPoint(new rex_extension_point('TEMPLATE_UPDATED', $success, [ + 'id' => $templateId, + 'key' => $templatekey, + 'name' => $templatename, + 'content' => $template, + 'active' => $active, + 'ctype' => $ctypes, + 'modules' => $modules, + 'categories' => $categories, + ])); + } catch (rex_sql_exception $e) { + if (rex_sql::ERROR_VIOLATE_UNIQUE_KEY == $e->getErrorCode()) { + $error = rex_i18n::msg('template_key_exists'); + $save = 'nein'; + } else { + $error = $e->getMessage(); + } } } }