diff --git a/redaxo/src/addons/structure/lib/linkmap/var_link.php b/redaxo/src/addons/structure/lib/linkmap/var_link.php
index 4d2cb8b40e..0c55655c36 100644
--- a/redaxo/src/addons/structure/lib/linkmap/var_link.php
+++ b/redaxo/src/addons/structure/lib/linkmap/var_link.php
@@ -36,7 +36,8 @@ protected function getOutput()
$value = self::getWidget($id, 'REX_INPUT_LINK[' . $id . ']', $value, $args);
} else {
if ($value && $this->hasArg('output') && 'id' != $this->getArg('output')) {
- return 'rex_getUrl(' . self::quote($value) . ')';
+ [$articleId, $hash] = array_pad(explode('#', $value, 2), 2, null);
+ return 'rex_getUrl(' . self::quote($articleId) . ')' . ($hash ? ' . \'#\' . ' . self::quote($hash) : '') . ';';
}
}
@@ -50,12 +51,16 @@ protected function getOutput()
public static function getWidget($id, $name, $value, array $args = [])
{
$artName = '';
- $art = rex_article::get($value);
+ [$articleId, $hash] = array_pad(explode('#', $value, 2), 2, null);
+ $art = rex_article::get((int) $articleId);
$category = rex_category::getCurrent() ? rex_category::getCurrent()->getId() : 0; // Aktuelle Kategorie vorauswählen
// Falls ein Artikel vorausgewählt ist, dessen Namen anzeigen und beim Öffnen der Linkmap dessen Kategorie anzeigen
if ($art instanceof rex_article) {
$artName = trim(sprintf('%s [%s]', $art->getName(), $art->getId()));
+ if (null !== $hash && '' !== $hash) {
+ $artName .= ' #' . $hash;
+ }
$category = $art->getCategoryId();
}
@@ -71,11 +76,12 @@ public static function getWidget($id, $name, $value, array $args = [])
$deleteFunc = '';
if (rex::requireUser()->getComplexPerm('structure')->hasStructurePerm()) {
$class = '';
- $escapedId = rex_escape($id, 'js');
+ $escapedId = rex_escape($id, 'js') ?? '';
$openFunc = 'openLinkMap(\'REX_LINK_' . $escapedId . '\', \'' . $openParams . '\');';
$deleteFunc = 'deleteREXLink(\'' . $escapedId . '\');';
}
+ $id = rex_escape((string) $id, 'html_attr') ?? '';
$e = [];
$e['field'] = '';
$e['functionButtons'] = '
diff --git a/redaxo/src/addons/structure/lib/linkmap/var_linklist.php b/redaxo/src/addons/structure/lib/linkmap/var_linklist.php
index 45640a13a5..fef44a7494 100644
--- a/redaxo/src/addons/structure/lib/linkmap/var_linklist.php
+++ b/redaxo/src/addons/structure/lib/linkmap/var_linklist.php
@@ -60,21 +60,27 @@ public static function getWidget($id, $name, $value, array $args = [])
if ('' == $link) {
continue;
}
- if ($article = rex_article::get((int) $link)) {
- $options .= '';
+ [$articleId, $hash] = array_pad(explode('#', $link, 2), 2, null);
+ if (null !== $articleId && '' !== $articleId && $article = rex_article::get((int) $articleId)) {
+ $label = trim(sprintf('%s [%s]', $article->getName(), $article->getId()));
+ if (null !== $hash && '' !== $hash) {
+ $label .= ' #' . $hash;
+ }
+ $options .= '';
}
}
$disabled = ' disabled';
$openFunc = '';
$deleteFunc = '';
- $quotedId = "'" . rex_escape($id, 'js') . "'";
+ $quotedId = "'" . rex_escape((string) $id, 'js') . "'";
if (rex::requireUser()->getComplexPerm('structure')->hasStructurePerm()) {
$disabled = '';
$openFunc = 'openREXLinklist(' . $quotedId . ', \'' . $openParams . '\');';
$deleteFunc = 'deleteREXLinklist(' . $quotedId . ');';
}
+ $id = rex_escape((string) $id, 'html_attr') ?? '';
$e = [];
$e['field'] = '
';
$e['moveButtons'] = '
-
+
- ';
+ ';
$e['functionButtons'] = '
';
diff --git a/redaxo/src/addons/structure/plugins/content/install.php b/redaxo/src/addons/structure/plugins/content/install.php
index 1a79130d17..7066fd0a62 100644
--- a/redaxo/src/addons/structure/plugins/content/install.php
+++ b/redaxo/src/addons/structure/plugins/content/install.php
@@ -49,16 +49,16 @@
->ensureColumn(new rex_sql_column('medialist8', 'text', true))
->ensureColumn(new rex_sql_column('medialist9', 'text', true))
->ensureColumn(new rex_sql_column('medialist10', 'text', true))
- ->ensureColumn(new rex_sql_column('link1', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link2', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link3', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link4', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link5', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link6', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link7', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link8', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link9', 'varchar(10)', true))
- ->ensureColumn(new rex_sql_column('link10', 'varchar(10)', true))
+ ->ensureColumn(new rex_sql_column('link1', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link2', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link3', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link4', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link5', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link6', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link7', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link8', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link9', 'varchar(255)', true))
+ ->ensureColumn(new rex_sql_column('link10', 'varchar(255)', true))
->ensureColumn(new rex_sql_column('linklist1', 'text', true))
->ensureColumn(new rex_sql_column('linklist2', 'text', true))
->ensureColumn(new rex_sql_column('linklist3', 'text', true))
diff --git a/redaxo/src/addons/structure/plugins/content/lib/article_slice.php b/redaxo/src/addons/structure/plugins/content/lib/article_slice.php
index abd234f1dd..84d32daf9c 100644
--- a/redaxo/src/addons/structure/plugins/content/lib/article_slice.php
+++ b/redaxo/src/addons/structure/plugins/content/lib/article_slice.php
@@ -384,13 +384,13 @@ public function getValueArray(int $index): ?array
/**
* @param int $index
- * @return int|null
+ * @return string|null
*/
public function getLink($index)
{
$link = $this->links[$index - 1];
- return null === $link ? null : (int) $link;
+ return $link ?? null;
}
/**
@@ -400,8 +400,9 @@ public function getLink($index)
public function getLinkUrl($index)
{
$link = $this->getLink($index);
+ [$articleId, $hash] = array_pad(explode('#', (string) $link, 2), 2, null);
- return null === $link ? null : rex_getUrl($link);
+ return null === $link ? null : ($hash ? rex_getUrl($articleId) . '#' . $hash : rex_getUrl($articleId));
}
/**