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)); } /**