From fc1303affd0e9b35253b6cc311567c992a8d060e Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Tue, 28 Apr 2026 09:25:32 +0200 Subject: [PATCH] moved menu url to backend; minimized getMenu response size --- .../controllers/api/frontend/v1/CisMenu.php | 90 ++++++++++++++++--- public/js/components/Cis/Menu/Entry.js | 43 ++------- 2 files changed, 84 insertions(+), 49 deletions(-) diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php index 4f4f2573e..163c337ae 100644 --- a/application/controllers/api/frontend/v1/CisMenu.php +++ b/application/controllers/api/frontend/v1/CisMenu.php @@ -16,12 +16,13 @@ * along with this program. If not, see . */ -if (! defined('BASEPATH')) exit('No direct script access allowed'); +if (!defined('BASEPATH')) + exit('No direct script access allowed'); class CisMenu extends FHCAPI_Controller { - + /** * Object initialization */ @@ -31,28 +32,95 @@ class CisMenu extends FHCAPI_Controller 'getMenu' => self::PERM_LOGGED, ]); - + } //------------------------------------------------------------------------------------------------------------------ // Public methods - /** + /** * fetches the menu for CIS from the database based on the userLanguage */ - public function getMenu() + public function getMenu() { $this->load->model('content/Content_model', 'ContentModel'); $this->load->config('cis'); - $cis4_content_id =$this->config->item('cis_menu_root_content_id'); - $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage()); + $cis4_content_id = $this->config->item('cis_menu_root_content_id'); + $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(), getUserLanguage()); $result = $this->getDataOrTerminateWithError($result); $menu = $result->childs ?? []; - $this->terminateWithSuccess($menu); - } - - + $menu = $this->generateUrlsForMenuItems($menu); + $this->terminateWithSuccess($menu); + } + + private function generateUrlsForMenuItems($menuItems) + { + return array_map( + function ($menuItem) { + return $this->generateUrlForMenuItem($menuItem); + }, + $menuItems + ); + } + + private function generateUrlForMenuItem($menuItem) + { + $menuItem->url = $this->menuItemUrlHelper($menuItem); + unset($menuItem->content); + + if ($menuItem->childs && count($menuItem->childs)) { + $menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs); + } + + return $menuItem; + } + + private function menuItemUrlHelper($menuItem) + { + if ($menuItem->template_kurzbz !== 'redirect') { + return site_url("/CisVue/Cms/content/" . $menuItem->content_id); + } + + if (!$menuItem->content || !mb_strlen($menuItem->content)) { + return ''; + } + + $doc = new DOMDocument(); + $doc->loadXML($menuItem->content); + $urlElem = $doc->getElementsByTagName('url')->item(0); + + if (!$urlElem) { + return ''; + } + + $url = $urlElem->textContent; + + if (strpos($url, '../cms/news.php') !== false) { + $newsRegex = '/^\.\.\/cms\/news\.php/'; + $url = preg_replace($newsRegex, site_url("/CisVue/Cms/news"), $url); + } + + if (strpos($url, '../cms/content.php?') !== false) { + $contentRegex = '/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/'; + $matches = []; + preg_match($contentRegex, $url, $matches); + $url = site_url('/CisVue/Cms/content/' . $matches[1]); + } + + if (strpos($url, '../index.ci.php') !== false) { + $indexRegex = '/^\.\.\/index\.ci\.php/'; + $url = preg_replace($indexRegex, site_url(), $url); + } + + if (strpos($url, '../') !== false) { + $relativeRegex = '/^\.\.\//'; + $url = preg_replace($relativeRegex, base_url(), $url); + } + + return $url; + } + } diff --git a/public/js/components/Cis/Menu/Entry.js b/public/js/components/Cis/Menu/Entry.js index cc4ad2df5..a48173d8d 100644 --- a/public/js/components/Cis/Menu/Entry.js +++ b/public/js/components/Cis/Menu/Entry.js @@ -68,41 +68,8 @@ export default { return false; } }, - link() { - if (this.entry.template_kurzbz == 'redirect') { - if (!this.entry.content) - return ''; - let xmlDoc = (new DOMParser()).parseFromString(this.entry.content,"text/xml"); - let url = xmlDoc.getElementsByTagName('url')[0]; - - if (!url) - return ''; - // TODO(chris): replace get params - url = url.childNodes[0].nodeValue + ""; - if (url.includes("../cms/news.php")) { - let news_regex = new RegExp("^\.\./cms/news\.php"); - url = url.replace(news_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/news'); - } - else if (url.includes("../cms/content.php?")) { - let content_regex = new RegExp("^\.\./cms/content.php\\?content_id=([0-9]+)"); - let content_regex_result = content_regex.exec(url); - // content_regex_result[1] will be the first matched group - return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content/' + content_regex_result[1]; - } - else if(url.includes("../index.ci.php")){ - let index_regex = new RegExp("^\.\./index\.ci\.php"); - url = url.replace(index_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router); - } - else if (url.includes("../")) { - let relative_regex = new RegExp("^\.\./"); - url = url.replace(relative_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root); - } - return url; - } - return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content/' + this.entry.content_id; - }, hasFullLink() { - return this.link.startsWith(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router) + return this.entry.url.startsWith(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router) }, target() { if (this.entry.template_kurzbz == 'redirect') { @@ -145,7 +112,7 @@ export default { this.addUrlCount(count); }, checkActiveUrl(url){ - this.getUrlMatchPoints(url,this.link); + this.getUrlMatchPoints(url,this.entry.url); let url_hash_spaceSymbol_regex = new RegExp("%20","gi"); let url_hash_sharpSymbol_regex = new RegExp("^#"); @@ -155,7 +122,7 @@ export default { // if the url hash contains the titel of the menu // or if the url equals the link of a menu // then set the menu active - if (url_hash == this.entry.titel || url.href == this.link) { + if (url_hash == this.entry.titel || url.href == this.entry.url) { this.setActiveEntry(this.entry.content_id); } }, @@ -204,7 +171,7 @@ export default {