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 .= '' . $templateInUseMessage . '
';
+ }
+
+ 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 .= '' . $templateInUseMessage . '
';
- }
+ 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();
+ }
}
}
}