Skip to content

Commit

Permalink
Prüfung auf Verwendung und Dialog beim "inaktiv" setzen eines Templat…
Browse files Browse the repository at this point in the history
…es (#5366)
  • Loading branch information
pwechs committed Oct 14, 2022
1 parent e11541e commit 2f04c82
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 70 deletions.
12 changes: 1 addition & 11 deletions .tools/psalm/baseline.xml
Expand Up @@ -3076,10 +3076,7 @@
</PossiblyNullReference>
</file>
<file src="redaxo/src/addons/structure/plugins/content/pages/templates.php">
<InvalidScalarArgument occurrences="5">
<code>$aid</code>
<code>$clangId</code>
<code>$clangId</code>
<InvalidScalarArgument occurrences="2">
<code>$templatename</code>
<code>$templatename</code>
</InvalidScalarArgument>
Expand Down Expand Up @@ -3107,13 +3104,6 @@
<code>rex_escape($templatekey)</code>
<code>rex_escape($templatename)</code>
</NullOperand>
<PossiblyNullOperand occurrences="1">
<code>$aid</code>
</PossiblyNullOperand>
<PossiblyNullReference occurrences="2">
<code>getCode</code>
<code>getName</code>
</PossiblyNullReference>
</file>
<file src="redaxo/src/addons/structure/plugins/content/tests/article_content_test.php">
<MixedArgument occurrences="1">
Expand Down
2 changes: 2 additions & 0 deletions redaxo/src/addons/structure/plugins/content/lang/de_de.lang
Expand Up @@ -71,6 +71,8 @@ templates_not_found = Es wurden keine Templates gefunden
title_templates = Templates
cant_delete_template_because_its_in_use = Template <b>{0}</b> kann nicht gelöscht werden, da es noch von folgenden Artikeln genutzt wird:
cant_delete_template_because_its_default_template = Template <b>{0}</b> kann nicht gelöscht werden, da es als Standardtemplate festgelegt ist.
cant_inactivate_template_because_its_in_use = Template <b>{0}</b> kann nicht inaktiv gesetzt werden, da es noch von folgenden Artikeln genutzt wird:
cant_inactivate_template_because_its_default_template = Template <b>{0}</b> 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
Expand Down
2 changes: 2 additions & 0 deletions redaxo/src/addons/structure/plugins/content/lang/en_gb.lang
Expand Up @@ -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.
Expand Down
53 changes: 53 additions & 0 deletions redaxo/src/addons/structure/plugins/content/lib/api_template.php
Expand Up @@ -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 .= '<li><a href="' . rex_url::backendPage('content', ['article_id' => $aid, 'clang' => $clangId]) . '">' . rex_escape($label) . '</a></li>';
$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 .= '<ul>' . $templateInUseMessage . '</ul>';
}

return $error;
}
}
107 changes: 48 additions & 59 deletions redaxo/src/addons/structure/plugins/content/pages/templates.php
Expand Up @@ -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 .= '<li><a href="' . rex_url::backendPage('content', ['article_id' => $aid, 'clang' => $clangId]) . '">' . rex_escape($label) . '</a></li>';
$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 .= '<ul>' . $templateInUseMessage . '</ul>';
}
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, [
Expand Down Expand Up @@ -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();
}
}
}
}
Expand Down

0 comments on commit 2f04c82

Please sign in to comment.