From ad956bef8ebb56a1eb418387d11fa4eee8362f03 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Fri, 12 Apr 2024 14:38:01 +0200 Subject: [PATCH 1/9] adds pagination logic to C4 news --- application/controllers/CisHmvc/Cms.php | 7 ++- application/controllers/CisHtml/Cms.php | 8 ++- application/controllers/CisVue/Cms.php | 7 ++- application/libraries/CmsLib.php | 36 ++++++------- application/models/content/News_model.php | 66 +++++++++++++---------- 5 files changed, 70 insertions(+), 54 deletions(-) diff --git a/application/controllers/CisHmvc/Cms.php b/application/controllers/CisHmvc/Cms.php index 7f2a03a0f..d15f398a4 100644 --- a/application/controllers/CisHmvc/Cms.php +++ b/application/controllers/CisHmvc/Cms.php @@ -1,6 +1,7 @@ cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar); + $page = intval($this->input->get('page', true)); + $pagination_size = 10; + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); if (isError($news)) return $this->load->view('CisHmvc/Error', ['error' => getError($news)]); diff --git a/application/controllers/CisHtml/Cms.php b/application/controllers/CisHtml/Cms.php index 96057559f..2dd05dbae 100644 --- a/application/controllers/CisHtml/Cms.php +++ b/application/controllers/CisHtml/Cms.php @@ -1,6 +1,7 @@ cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar); + $page = intval($this->input->get('page', true)); + $pagination_size = 10; + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); if (isError($news)) return $this->load->view('CisHtml/Error', ['error' => getError($news)]); diff --git a/application/controllers/CisVue/Cms.php b/application/controllers/CisVue/Cms.php index 96057559f..0f3fc061a 100644 --- a/application/controllers/CisVue/Cms.php +++ b/application/controllers/CisVue/Cms.php @@ -1,6 +1,7 @@ cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar); + $page = intval($this->input->get('page', true)); + $pagination_size = 10; + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); if (isError($news)) return $this->load->view('CisHtml/Error', ['error' => getError($news)]); diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index 4e27b94af..dfe8d5e4f 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -1,6 +1,7 @@ ci->ContentgruppeModel->loadWhere(['content_id' => $content_id]); if (isError($islocked)) return $islocked; - + if (getData($islocked)) { $uid = getAuthUID(); $isberechtigt = $this->ci->ContentgruppeModel->berechtigt($content_id, $uid); @@ -72,11 +73,9 @@ class CmsLib return $content; // Legt einen Logeintrag für die Klickstatistik an - if (defined('LOG_CONTENT') && LOG_CONTENT) - { + if (defined('LOG_CONTENT') && LOG_CONTENT) { // Nur eingeloggte User werden geloggt, das sonst auch alle Infoscreenaufrufe und dgl. mitgeloggt werden - if (isLogged()) - { + if (isLogged()) { $request_data = 'content_id=' . $content_id; if ($version !== null) $request_data .= '&version=' . $version; @@ -185,13 +184,12 @@ class CmsLib * * @return void */ - public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10) { $this->ci->load->model('crm/Student_model', 'StudentModel'); $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - if (!$infoscreen && ($studiengang_kz === null || $semester === null)) - { + if (!$infoscreen && ($studiengang_kz === null || $semester === null)) { //Zum anzeigen der Studiengang-Details neben den News $student = $this->ci->StudentModel->loadWhere(['student_uid' => get_uid()]); if (isError($student)) @@ -209,7 +207,7 @@ class CmsLib $xml = ''; $this->ci->load->model('content/News_model', 'NewsModel'); - $news = $this->ci->NewsModel->getNewsWithContent(getSprache(), $studiengang_kz, $semester, null, $sichtbar, 0, 0, $all, $mischen); + $news = $this->ci->NewsModel->getNewsWithContent(getSprache(), $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen); if (isError($news)) return $news; @@ -225,17 +223,14 @@ class CmsLib $xml .= "" . $newsobj->content . $datum . $id . ""; } - if ($studiengang_kz != 0) - { + if ($studiengang_kz != 0) { $stg_obj = $this->ci->StudiengangModel->load($studiengang_kz); if (isError($stg_obj)) return $stg_obj; $stg_obj = current(getData($stg_obj) ?: []); - if ($stg_obj) - { - if (!$edit && !$infoscreen) - { + if ($stg_obj) { + if (!$edit && !$infoscreen) { $extras = $this->getNewsExtras($stg_obj, $semester); if (isError($extras)) return $extras; @@ -245,8 +240,7 @@ class CmsLib } } - if ($titel != '') - { + if ($titel != '') { $xml .= '' . $titel . ''; } @@ -260,7 +254,7 @@ class CmsLib $XML = new DOMDocument(); $XML->loadXML($xml); - + $xsltemplate = new DOMDocument(); $xsltemplate->loadXML($template->xslt_xhtml_c4); diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index 3199a0ac3..51ef16053 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -23,10 +23,21 @@ class News_model extends DB_Model text IS NOT NULL AND datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date) ORDER BY datum DESC - LIMIT '. $this->escape($limit) + LIMIT ' . $this->escape($limit) ); } + private function getMaxPageCount($page_size) + { + $this->addSelect(['Count(*)']); + $count = $this->load(); + $count = hasData($count) ? getData($count)[0]->count : null; + $floatMaxPageCount = $count / $page_size; + + // ceil, to include remaining rows into the last page + return ceil($floatMaxPageCount); + } + /** * @param string $sprache * @param string $studiengang_kz @@ -34,7 +45,7 @@ class News_model extends DB_Model * @param string $fachbereich_kurzbz * @param boolean $sichtbar * @param integer $maxalter - * @param integer $maxnews + * @param integer $page_size * @param boolean $all * @param boolean $mischen * @@ -42,46 +53,52 @@ class News_model extends DB_Model * * @return stdObj */ - public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $maxnews = 0, $all = false, $mischen = true) + public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) { + if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size)) { + if ($page > 0 && $page_size > 0) { + $maxPageCount = $this->getMaxPageCount($page_size); + if ($maxPageCount) { + $page = $page % $maxPageCount; + } + $offset = $page * $page_size; + $this->addLimit($page_size, $offset); + } + } else { + $this->addLimit($page_size); + } + + $this->addOrder('datum', 'DESC'); + $studiengang_kz = trim($studiengang_kz); $fachbereich_kurzbz = trim($fachbereich_kurzbz); $where = []; $params = []; - if (trim($maxalter) != '0') - { + if (trim($maxalter) != '0') { $where[] = "(now()-datum) < interval ? days"; $params[] = $maxalter; } - if (!$all) - { + if (!$all) { $where[] = "datum <= now()"; $where[] = "(datum_bis >= now()::date OR datum_bis IS NULL)"; } - if ($fachbereich_kurzbz != '*') - { - if ($fachbereich_kurzbz == '') - { + if ($fachbereich_kurzbz != '*') { + if ($fachbereich_kurzbz == '') { $where[] = "fachbereich_kurzbz IS NULL"; - } - else - { + } else { $where[] = "fachbereich_kurzbz = ?"; $params[] = $fachbereich_kurzbz; } } - if ($studiengang_kz == '0') - { + if ($studiengang_kz == '0') { $where[] = "studiengang_kz = ?"; $params[] = $studiengang_kz; if ($semester === NULL) $where[] = "semester IS NULL"; elseif ($semester === 0) $where[] = "semester = 0"; - } - elseif ($studiengang_kz != '') - { + } elseif ($studiengang_kz != '') { $add = $mischen === true ? " OR (studiengang_kz = 0 AND semester IS NULL)" : ""; $where[] = "((studiengang_kz = ? AND semester = ?) OR (studiengang_kz = ? AND semester = 0) OR (studiengang_kz = 0 AND semester = ?)" . $add . ")"; $params[] = $studiengang_kz; @@ -90,14 +107,14 @@ class News_model extends DB_Model $params[] = $semester; } $this->addJoin('campus.tbl_contentsprache cs', 'content_id'); - + $where[] = "cs.sichtbar = " . ($sichtbar ? "true" : "false"); - + $where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=?) THEN ? ELSE ? END)"; $params[] = $sprache; $params[] = $sprache; $params[] = DEFAULT_LANGUAGE; - + $where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=?) THEN ? ELSE ? END))"; $params[] = $sprache; $params[] = $sprache; @@ -105,11 +122,6 @@ class News_model extends DB_Model $where = implode(" AND ", $where); - $this->addOrder('datum', 'DESC'); - if ($maxnews) - $this->addLimit($maxnews); - - $this->db->where($where, NULL, FALSE); $sql = $this->db->get_compiled_select($this->dbTable); From d77499b73b3f8f709b578ca2e9935b7699ff627a Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Mon, 15 Apr 2024 13:35:33 +0200 Subject: [PATCH 2/9] implementing frontend pagination for components --- application/controllers/CisHtml/Cms.php | 13 +++-- application/models/content/News_model.php | 16 +++--- application/views/CisHtml/Cms/Content.php | 7 +-- public/js/apps/Cis/Cms.js | 54 ++++++++++++------- public/js/apps/api/cms.js | 14 +++++ public/js/apps/api/fhcapifactory.js | 4 +- public/js/components/Cis/Cms/Content.js | 28 ++++++++++ public/js/components/Pagination/Pagination.js | 26 +++++++++ 8 files changed, 128 insertions(+), 34 deletions(-) create mode 100644 public/js/apps/api/cms.js create mode 100644 public/js/components/Cis/Cms/Content.js create mode 100644 public/js/components/Pagination/Pagination.js diff --git a/application/controllers/CisHtml/Cms.php b/application/controllers/CisHtml/Cms.php index 2dd05dbae..4cca6bc38 100644 --- a/application/controllers/CisHtml/Cms.php +++ b/application/controllers/CisHtml/Cms.php @@ -60,14 +60,19 @@ class Cms extends FHC_Controller * @return void */ public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) + { + $this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]); + } + + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { $page = intval($this->input->get('page', true)); $pagination_size = 10; $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); - if (isError($news)) - return $this->load->view('CisHtml/Error', ['error' => getError($news)]); - - $this->load->view('CisHtml/Cms/Content', ['content' => getData($news)]); + if (isError($news)) { + echo json_encode(getError($news)); + } + echo json_encode(getData($news)); } } diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index 51ef16053..88d97bd09 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -55,15 +55,15 @@ class News_model extends DB_Model */ public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) { - if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size)) { - if ($page > 0 && $page_size > 0) { - $maxPageCount = $this->getMaxPageCount($page_size); - if ($maxPageCount) { - $page = $page % $maxPageCount; - } - $offset = $page * $page_size; - $this->addLimit($page_size, $offset); + if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size) && $page > 0 && $page_size > 0) { + + $maxPageCount = $this->getMaxPageCount($page_size); + if ($maxPageCount) { + $page = $page % $maxPageCount; } + $offset = $page * $page_size; + $this->addLimit($page_size, $offset); + } else { $this->addLimit($page_size); } diff --git a/application/views/CisHtml/Cms/Content.php b/application/views/CisHtml/Cms/Content.php index e750ea5a5..a27128d23 100644 --- a/application/views/CisHtml/Cms/Content.php +++ b/application/views/CisHtml/Cms/Content.php @@ -1,5 +1,6 @@ true, 'customJSModules' => ['public/js/apps/Cis/Cms.js'], 'customCSSs' => [ 'public/css/Cis4/Cms.css', @@ -11,8 +12,8 @@ $this->load->view('templates/CISHTML-Header', $includesArray); ?>
- + +
-load->view('templates/CISHTML-Footer', $includesArray); ?> - +load->view('templates/CISHTML-Footer', $includesArray); ?> \ No newline at end of file diff --git a/public/js/apps/Cis/Cms.js b/public/js/apps/Cis/Cms.js index 8f006ec27..cd2b5f6e9 100644 --- a/public/js/apps/Cis/Cms.js +++ b/public/js/apps/Cis/Cms.js @@ -1,20 +1,38 @@ import BsConfirm from "../../components/Bootstrap/Confirm.js"; +//import Pagination from "../../components/Pagination/Pagination.js"; +import Content from "../../components/Cis/Cms/Content.js"; +import Fhcapi from "../api/fhcapifactory.js"; -Vue.createApp({ - mounted() { - document.querySelectorAll('#cms [data-confirm]').forEach(el => { - el.addEventListener('click', evt => { - evt.preventDefault(); - BsConfirm.popup(el.dataset.confirm).then(() => { - Axios.get(el.href).then(res => { - // TODO(chris): check for success then show message and/or reload - location = location; - }).catch(err => console.error('ERROR:', err)); - }).catch(()=>{}); - }); - }); - document.querySelectorAll('#cms [data-href]').forEach(el => { - el.href = el.dataset.href.replace(/^ROOT\//, FHC_JS_DATA_STORAGE_OBJECT.app_root); - }); - } -}).mount('#cms [data-confirm], #cms [data-href]'); +Vue.$fhcapi = Fhcapi; + +const app = Vue.createApp({ + components: { + Content, + }, + mounted() { + document.querySelectorAll("#cms [data-confirm]").forEach((el) => { + el.addEventListener("click", (evt) => { + evt.preventDefault(); + BsConfirm.popup(el.dataset.confirm) + .then(() => { + Axios.get(el.href) + .then((res) => { + // TODO(chris): check for success then show message and/or reload + location = location; + }) + .catch((err) => console.error("ERROR:", err)); + }) + .catch(() => {}); + }); + }); + document.querySelectorAll("#cms [data-href]").forEach((el) => { + el.href = el.dataset.href.replace( + /^ROOT\//, + FHC_JS_DATA_STORAGE_OBJECT.app_root + ); + }); + }, +}); +app.use(primevue.config.default, { zIndex: { overlay: 9999 } }); +app.mount("#cms"); +//#cms [data-confirm], #cms [data-href] diff --git a/public/js/apps/api/cms.js b/public/js/apps/api/cms.js new file mode 100644 index 000000000..8ad2f1f32 --- /dev/null +++ b/public/js/apps/api/cms.js @@ -0,0 +1,14 @@ +export default { + getNews: function (page = 1, pageSize = 10) { + const url = + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + "/CisHtml/Cms/getNews"; + return axios.get(url, { + params: { + page, + pageSize, + }, + }); + }, +}; diff --git a/public/js/apps/api/fhcapifactory.js b/public/js/apps/api/fhcapifactory.js index c1f1e0d5c..35120779f 100644 --- a/public/js/apps/api/fhcapifactory.js +++ b/public/js/apps/api/fhcapifactory.js @@ -1,5 +1,7 @@ import Search from "./search.js"; +import Cms from "./cms.js"; export default { - "Search": Search + "Search": Search, + "Cms": Cms, }; diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js new file mode 100644 index 000000000..415743e85 --- /dev/null +++ b/public/js/components/Cis/Cms/Content.js @@ -0,0 +1,28 @@ +import Pagination from "../../Pagination/Pagination.js"; + +export default { + components: { + Pagination, + }, + data() { + return { + content: null, + }; + }, + methods: { + loadNewPageContent: function (data) { + Vue.$fhcapi.Cms.getNews(data.page).then((result) => { + this.content = result.data; + }); + }, + }, + created() { + Vue.$fhcapi.Cms.getNews().then((result) => { + this.content = result.data; + }); + }, + template: /*html*/ ` + +
+
`, +}; diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js new file mode 100644 index 000000000..0222a0dfa --- /dev/null +++ b/public/js/components/Pagination/Pagination.js @@ -0,0 +1,26 @@ +export default { + components: { + paginator: primevue.paginator, + }, + data() { + return {}; + }, + methods: { + newPageEvent: function (data) { + //console.log("hier", data.page); + }, + }, + mounted() { + console.log("pagination mounted"); + }, + template: /*html*/ ` + + + + + NO CONTENT WAS PROVIDED + + + + `, +}; From 6c642f124215bee8aa85e373f83343fdf0b797b8 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Wed, 17 Apr 2024 14:23:09 +0200 Subject: [PATCH 3/9] changes how the pagination is done in the DB_Model --- application/controllers/CisHtml/Cms.php | 33 ++++++++++++- application/core/DB_Model.php | 46 ++++++++++++++++++- application/libraries/CmsLib.php | 1 + application/models/content/News_model.php | 42 ++++++++--------- public/js/apps/api/cms.js | 11 ++++- public/js/components/Cis/Cms/Content.js | 8 +++- public/js/components/Pagination/Pagination.js | 12 +++-- 7 files changed, 120 insertions(+), 33 deletions(-) diff --git a/application/controllers/CisHtml/Cms.php b/application/controllers/CisHtml/Cms.php index 4cca6bc38..d15b4fabc 100644 --- a/application/controllers/CisHtml/Cms.php +++ b/application/controllers/CisHtml/Cms.php @@ -25,6 +25,11 @@ class Cms extends FHC_Controller $this->loadPhrases([ 'global' ]); + + $this->load->model('content/News_model', 'NewsModel'); + + // setting up the papgination_size + $this->pagination_size = 10; } // ----------------------------------------------------------------------------------------------------------------- @@ -67,12 +72,36 @@ class Cms extends FHC_Controller public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { $page = intval($this->input->get('page', true)); - $pagination_size = 10; - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); + + + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $this->pagination_size); if (isError($news)) { echo json_encode(getError($news)); } echo json_encode(getData($news)); } + + public function getNewsMaxPage($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + if (!$infoscreen && ($studiengang_kz === null || $semester === null)) { + //Zum anzeigen der Studiengang-Details neben den News + $student = $this->StudentModel->loadWhere(['student_uid' => get_uid()]); + if (isError($student)) + return $student; + if (getData($student)) { + $student = current(getData($student)); + if ($studiengang_kz === null) + $studiengang_kz = $student->studiengang_kz; + if ($semester === null) + $semester = $student->semester; + } + } + $all = $edit; + $query = $this->NewsModel->getNewsWithContentQuery(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->pagination_size, $all, $mischen); + echo json_encode($query->maxPageCount); + } } diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index bdd5316e7..5304fbe83 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -32,6 +32,9 @@ class DB_Model extends CI_Model protected $pk; // Name of the PrimaryKey for DB-Update, Load, ... protected $hasSequence; // False if this table has a composite primary key that is not using a sequence // True if this table has a primary key that uses a sequence + //protected $paginationOptions; // $page and $page_size together in an associative array + protected $page; + protected $page_size; private $executedQueryMetaData; private $executedQueryListFields; @@ -484,7 +487,7 @@ class DB_Model extends CI_Model if (!is_numeric($start) || (is_numeric($start) && $start <= 0)) return error('The start parameter is not valid', EXIT_MODEL); - if (is_numeric($end) && $end > $start) + if (is_numeric($end)) { $this->db->limit($start, $end); } @@ -1073,5 +1076,46 @@ class DB_Model extends CI_Model return $udfs; } + + function addPagination( $page, $page_size, $maxPageCount=null) + { + if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size) && $page > 0 && $page_size > 0) { + + if (isset($maxPageCount) && is_numeric($maxPageCount) && $maxPageCount > 0) { + $floatMaxPageCount = $maxPageCount / $page_size; + $floatMaxPageCount = ceil($floatMaxPageCount); + if($page > $floatMaxPageCount){ + $page = $floatMaxPageCount; + } + } + // else if page is to big + $offset = (($page-1) * $page_size); + $this->addLimit($page_size, $offset); + + } else { + $this->addLimit($page_size); + } + } + + function getMaxPageCount( $page_size, $params=null ) + { + // we clone the original query, so we dont have to change the origial query + $instance_copy = clone $this; + $db_copy = clone $this->db; + $countSql = $db_copy->get_compiled_select($instance_copy->dbTable,false); + $countSql = "SELECT COUNT(*) FROM (". $countSql .") as count;"; + + // calculating the maxPageCount and adding the pagination to the query + $num_rows_query_result = $instance_copy->execReadOnlyQuery($countSql, $params); + + if(isError($num_rows_query_result)){ + return error($this->db->error(), EXIT_DATABASE); + } + $num_rows = getData($num_rows_query_result)[0]->count; + + + // ceil, to include remaining rows into the last page + return $num_rows; + } } diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index dfe8d5e4f..8a57c1086 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -213,6 +213,7 @@ class CmsLib return $news; $news = getData($news); + //var_dump($news->maxPageCount); foreach ($news as $newsobj) { if ($studiengang_kz && $edit && !$newsobj->studiengang_kz) continue; diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index 88d97bd09..de4c7f8da 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -27,16 +27,7 @@ class News_model extends DB_Model ); } - private function getMaxPageCount($page_size) - { - $this->addSelect(['Count(*)']); - $count = $this->load(); - $count = hasData($count) ? getData($count)[0]->count : null; - $floatMaxPageCount = $count / $page_size; - // ceil, to include remaining rows into the last page - return ceil($floatMaxPageCount); - } /** * @param string $sprache @@ -53,20 +44,8 @@ class News_model extends DB_Model * * @return stdObj */ - public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + public function getNewsWithContentQuery($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) { - if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size) && $page > 0 && $page_size > 0) { - - $maxPageCount = $this->getMaxPageCount($page_size); - if ($maxPageCount) { - $page = $page % $maxPageCount; - } - $offset = $page * $page_size; - $this->addLimit($page_size, $offset); - - } else { - $this->addLimit($page_size); - } $this->addOrder('datum', 'DESC'); @@ -124,9 +103,24 @@ class News_model extends DB_Model $this->db->where($where, NULL, FALSE); - $sql = $this->db->get_compiled_select($this->dbTable); + // calculating the maxPageCount and adding pagination to the query + $maxPageCount = $this->getMaxPageCount($page_size, $params); + $this->addPagination($page, $page_size, $maxPageCount); + + // creating the select query + $query = new stdClass(); + $query->sql = $this->db->get_compiled_select($this->dbTable); + $query->params = $params; + $query->maxPageCount = $maxPageCount; + return $query; + + } + + function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + { + $query = $this->getNewsWithContentQuery($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); + return $this->execReadOnlyQuery($query->sql, $query->params); - return $this->execQuery($sql, $params); } } diff --git a/public/js/apps/api/cms.js b/public/js/apps/api/cms.js index 8ad2f1f32..8352bcf65 100644 --- a/public/js/apps/api/cms.js +++ b/public/js/apps/api/cms.js @@ -1,5 +1,6 @@ export default { - getNews: function (page = 1, pageSize = 10) { + getNews: function (page = 1) { + console.log("this is the page that was passed", page); const url = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + @@ -7,8 +8,14 @@ export default { return axios.get(url, { params: { page, - pageSize, }, }); }, + getNewsMaxPage: function () { + const url = + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + "/CisHtml/Cms/getNewsMaxPage"; + return axios.get(url); + }, }; diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js index 415743e85..793f2652d 100644 --- a/public/js/components/Cis/Cms/Content.js +++ b/public/js/components/Cis/Cms/Content.js @@ -7,11 +7,13 @@ export default { data() { return { content: null, + maxPageCount: 0, }; }, methods: { loadNewPageContent: function (data) { Vue.$fhcapi.Cms.getNews(data.page).then((result) => { + console.log("fetched url :", result.data); this.content = result.data; }); }, @@ -20,9 +22,13 @@ export default { Vue.$fhcapi.Cms.getNews().then((result) => { this.content = result.data; }); + + Vue.$fhcapi.Cms.getNewsMaxPage().then((result) => { + this.maxPageCount = result.data; + }); }, template: /*html*/ ` - +
`, }; diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js index 0222a0dfa..0b6044d73 100644 --- a/public/js/components/Pagination/Pagination.js +++ b/public/js/components/Pagination/Pagination.js @@ -2,6 +2,12 @@ export default { components: { paginator: primevue.paginator, }, + props: { + maxPageCount: { + type: Number, + default: 0, + }, + }, data() { return {}; }, @@ -15,10 +21,10 @@ export default { }, template: /*html*/ ` - - +
{{JSON.stringify(maxPageCount,null,2)}}
+ - NO CONTENT WAS PROVIDED + Placeholder From 284ae0637e2998314942cd66db25f52a8a24f04f Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Wed, 17 Apr 2024 14:54:22 +0200 Subject: [PATCH 4/9] makes it possible to send the page_size from the frontend to the backend to adopt how many rows to query --- application/controllers/CisHtml/Cms.php | 19 +++++++++++++------ public/js/apps/api/cms.js | 4 ++-- public/js/components/Cis/Cms/Content.js | 5 ++--- public/js/components/Pagination/Pagination.js | 9 +++------ 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/application/controllers/CisHtml/Cms.php b/application/controllers/CisHtml/Cms.php index d15b4fabc..93abd3f14 100644 --- a/application/controllers/CisHtml/Cms.php +++ b/application/controllers/CisHtml/Cms.php @@ -29,7 +29,7 @@ class Cms extends FHC_Controller $this->load->model('content/News_model', 'NewsModel'); // setting up the papgination_size - $this->pagination_size = 10; + $this->page_size = 10; } // ----------------------------------------------------------------------------------------------------------------- @@ -71,10 +71,17 @@ class Cms extends FHC_Controller public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { - $page = intval($this->input->get('page', true)); - - - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $this->pagination_size); + $get_page = intval($this->input->get('page', true)); + $get_page_size = intval($this->input->get('page_size', true)); + if ($get_page) { + $page = $get_page; + } + if ($get_page_size) { + $page_size = $get_page_size; + } else { + $page_size = $this->page_size; + } + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); if (isError($news)) { echo json_encode(getError($news)); @@ -101,7 +108,7 @@ class Cms extends FHC_Controller } } $all = $edit; - $query = $this->NewsModel->getNewsWithContentQuery(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->pagination_size, $all, $mischen); + $query = $this->NewsModel->getNewsWithContentQuery(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); echo json_encode($query->maxPageCount); } } diff --git a/public/js/apps/api/cms.js b/public/js/apps/api/cms.js index 8352bcf65..94b3d282e 100644 --- a/public/js/apps/api/cms.js +++ b/public/js/apps/api/cms.js @@ -1,6 +1,5 @@ export default { - getNews: function (page = 1) { - console.log("this is the page that was passed", page); + getNews: function (page = 1, page_size = 10) { const url = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + @@ -8,6 +7,7 @@ export default { return axios.get(url, { params: { page, + page_size, }, }); }, diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js index 793f2652d..7fe6bb5c1 100644 --- a/public/js/components/Cis/Cms/Content.js +++ b/public/js/components/Cis/Cms/Content.js @@ -12,14 +12,13 @@ export default { }, methods: { loadNewPageContent: function (data) { - Vue.$fhcapi.Cms.getNews(data.page).then((result) => { - console.log("fetched url :", result.data); + Vue.$fhcapi.Cms.getNews(data.page, data.rows).then((result) => { this.content = result.data; }); }, }, created() { - Vue.$fhcapi.Cms.getNews().then((result) => { + Vue.$fhcapi.Cms.getNews(1, 10).then((result) => { this.content = result.data; }); diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js index 0b6044d73..666f03929 100644 --- a/public/js/components/Pagination/Pagination.js +++ b/public/js/components/Pagination/Pagination.js @@ -16,17 +16,14 @@ export default { //console.log("hier", data.page); }, }, - mounted() { - console.log("pagination mounted"); - }, + mounted() {}, template: /*html*/ ` -
{{JSON.stringify(maxPageCount,null,2)}}
+ Placeholder - - + `, }; From 92f2c6e0a2291348c500e36040cf64bd7e1e6370 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Wed, 17 Apr 2024 15:12:55 +0200 Subject: [PATCH 5/9] passes the page_size down from the parent component to the child component --- public/js/components/Cis/Cms/Content.js | 5 +++-- public/js/components/Pagination/Pagination.js | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js index 7fe6bb5c1..9ba98f2a1 100644 --- a/public/js/components/Cis/Cms/Content.js +++ b/public/js/components/Cis/Cms/Content.js @@ -8,6 +8,7 @@ export default { return { content: null, maxPageCount: 0, + page_size: 10, }; }, methods: { @@ -18,7 +19,7 @@ export default { }, }, created() { - Vue.$fhcapi.Cms.getNews(1, 10).then((result) => { + Vue.$fhcapi.Cms.getNews(1, this.page_size).then((result) => { this.content = result.data; }); @@ -27,7 +28,7 @@ export default { }); }, template: /*html*/ ` - +
`, }; diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js index 666f03929..ce27180f7 100644 --- a/public/js/components/Pagination/Pagination.js +++ b/public/js/components/Pagination/Pagination.js @@ -2,11 +2,16 @@ export default { components: { paginator: primevue.paginator, }, + emits: ["update:rows"], props: { maxPageCount: { type: Number, default: 0, }, + page_size: { + type: Number, + default: 10, + }, }, data() { return {}; @@ -20,7 +25,7 @@ export default { template: /*html*/ ` - + Placeholder From 71f63095c2d3ee6adb764f37244a6a75c28b5a60 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Wed, 17 Apr 2024 15:15:51 +0200 Subject: [PATCH 6/9] makes component Pagination page_size prop a required prop --- public/js/components/Pagination/Pagination.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js index ce27180f7..db751e1d9 100644 --- a/public/js/components/Pagination/Pagination.js +++ b/public/js/components/Pagination/Pagination.js @@ -10,7 +10,7 @@ export default { }, page_size: { type: Number, - default: 10, + required: true, }, }, data() { From 3993d614d4aa9a5784b55017a0d25d0e750c5f7d Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Thu, 18 Apr 2024 11:52:58 +0200 Subject: [PATCH 7/9] updates news fetching and DB_Model pagination methods --- application/controllers/CisHtml/Cms.php | 41 ++++++------ application/core/DB_Model.php | 51 +++++++------- application/libraries/CmsLib.php | 41 +++++++----- application/models/content/News_model.php | 67 +++++++++---------- public/js/apps/api/cms.js | 4 +- public/js/components/Cis/Cms/Content.js | 2 +- public/js/components/Pagination/Pagination.js | 3 +- 7 files changed, 108 insertions(+), 101 deletions(-) diff --git a/application/controllers/CisHtml/Cms.php b/application/controllers/CisHtml/Cms.php index 93abd3f14..f56b3eea3 100644 --- a/application/controllers/CisHtml/Cms.php +++ b/application/controllers/CisHtml/Cms.php @@ -84,31 +84,30 @@ class Cms extends FHC_Controller $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); if (isError($news)) { - echo json_encode(getError($news)); + $this->terminateWithJsonError(getError($news)); } - echo json_encode(getData($news)); + $news = hasData($news) ? getData($news) : null; + if ($news) { + echo json_encode($news); + } else { + show_error("News: No data found"); + } + } - public function getNewsMaxPage($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) + public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) { - $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - - if (!$infoscreen && ($studiengang_kz === null || $semester === null)) { - //Zum anzeigen der Studiengang-Details neben den News - $student = $this->StudentModel->loadWhere(['student_uid' => get_uid()]); - if (isError($student)) - return $student; - if (getData($student)) { - $student = current(getData($student)); - if ($studiengang_kz === null) - $studiengang_kz = $student->studiengang_kz; - if ($semester === null) - $semester = $student->semester; - } - } + list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester); $all = $edit; - $query = $this->NewsModel->getNewsWithContentQuery(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); - echo json_encode($query->maxPageCount); + $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); + if (isError($num_rows)) { + $this->terminateWithJsonError(getError($num_rows)); + } + $num_rows = hasData($num_rows) ? getData($num_rows) : null; + if ($num_rows) { + echo json_encode($num_rows); + } else { + show_error("News number rows: No data found"); + } } } diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index 5304fbe83..d65cb3cf5 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -1077,18 +1077,26 @@ class DB_Model extends CI_Model return $udfs; } - function addPagination( $page, $page_size, $maxPageCount=null) + /** + * addPagination + * adds a limit and an optional offset depending on the arguments passed to the function + * @param int $page page to be queried + * @param int $page_size page_size used to calculate the offset of the pagination + * @param int | null $num_rows used to calculate the total amout of pages that are available with the $page and $page_size arguments + * + * @return void + */ + function addPagination( $page, $page_size, $num_rows=null) { if (isset($page) && is_numeric($page) && isset($page_size) && is_numeric($page_size) && $page > 0 && $page_size > 0) { - if (isset($maxPageCount) && is_numeric($maxPageCount) && $maxPageCount > 0) { - $floatMaxPageCount = $maxPageCount / $page_size; - $floatMaxPageCount = ceil($floatMaxPageCount); - if($page > $floatMaxPageCount){ - $page = $floatMaxPageCount; + if (isset($num_rows) && is_numeric($num_rows) && $num_rows > 0) { + $floatMaxPageCount = $num_rows / $page_size; + $maxPageCount = ceil($floatMaxPageCount); + if($page > $maxPageCount){ + $page = $maxPageCount; } } - // else if page is to big $offset = (($page-1) * $page_size); $this->addLimit($page_size, $offset); @@ -1097,25 +1105,22 @@ class DB_Model extends CI_Model } } - function getMaxPageCount( $page_size, $params=null ) + /** + * getQueryNumRows + * returns the number of rows of the current build query of the codeigniter query builder instance + * @param bool $reset resets the select of the query + * + * @return Result_object $num_rows + */ + function getNumRows($reset=false) { - // we clone the original query, so we dont have to change the origial query - $instance_copy = clone $this; - $db_copy = clone $this->db; - $countSql = $db_copy->get_compiled_select($instance_copy->dbTable,false); - $countSql = "SELECT COUNT(*) FROM (". $countSql .") as count;"; - - // calculating the maxPageCount and adding the pagination to the query - $num_rows_query_result = $instance_copy->execReadOnlyQuery($countSql, $params); - - if(isError($num_rows_query_result)){ + // returns the number of rows when executing the current query without reseting the select statement of the query + $num_rows = $this->db->count_all_results($this->dbTable,$reset); + if($num_rows){ + return success($num_rows); + }else{ return error($this->db->error(), EXIT_DATABASE); } - $num_rows = getData($num_rows_query_result)[0]->count; - - - // ceil, to include remaining rows into the last page - return $num_rows; } } diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index 8a57c1086..0fa3b0556 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -173,6 +173,30 @@ class CmsLib ], true)); } + /** + * @param string $studiengang_kz + * @param string $semester + * + * @return array queried studiengang_kz and semester + */ + public function getStgAndSem($studiengang_kz, $semester) + { + $this->ci->load->model('crm/Student_model', 'StudentModel'); + + //Zum anzeigen der Studiengang-Details neben den News + $student = $this->ci->StudentModel->loadWhere(['student_uid' => getAuthUID()]); + if (isError($student)) + return $student; + if (getData($student)) { + $student = current(getData($student)); + if ($studiengang_kz === null) + $studiengang_kz = $student->studiengang_kz; + if ($semester === null) + $semester = $student->semester; + } + return [$studiengang_kz, $semester]; + } + /** * @param boolean $infoscreen * @param string | null $studiengang_kz @@ -186,22 +210,7 @@ class CmsLib */ public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10) { - $this->ci->load->model('crm/Student_model', 'StudentModel'); - $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - - if (!$infoscreen && ($studiengang_kz === null || $semester === null)) { - //Zum anzeigen der Studiengang-Details neben den News - $student = $this->ci->StudentModel->loadWhere(['student_uid' => get_uid()]); - if (isError($student)) - return $student; - if (getData($student)) { - $student = current(getData($student)); - if ($studiengang_kz === null) - $studiengang_kz = $student->studiengang_kz; - if ($semester === null) - $semester = $student->semester; - } - } + list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester); $all = $edit; $xml = ''; diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index de4c7f8da..f4f98b601 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -36,15 +36,15 @@ class News_model extends DB_Model * @param string $fachbereich_kurzbz * @param boolean $sichtbar * @param integer $maxalter + * @param integer $page * @param integer $page_size * @param boolean $all * @param boolean $mischen * * TODO(chris): this is not a good function -> the params are all over the place * - * @return stdObj */ - public function getNewsWithContentQuery($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + protected function prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) { $this->addOrder('datum', 'DESC'); @@ -53,10 +53,9 @@ class News_model extends DB_Model $fachbereich_kurzbz = trim($fachbereich_kurzbz); $where = []; - $params = []; if (trim($maxalter) != '0') { - $where[] = "(now()-datum) < interval ? days"; - $params[] = $maxalter; + $where[] = "(now()-datum) < interval " . $this->db->escape($maxalter) . " days"; + } if (!$all) { $where[] = "datum <= now()"; @@ -66,61 +65,57 @@ class News_model extends DB_Model if ($fachbereich_kurzbz == '') { $where[] = "fachbereich_kurzbz IS NULL"; } else { - $where[] = "fachbereich_kurzbz = ?"; - $params[] = $fachbereich_kurzbz; + $where[] = "fachbereich_kurzbz = " . $this->db->escape($fachbereich_kurzbz); + } } if ($studiengang_kz == '0') { - $where[] = "studiengang_kz = ?"; - $params[] = $studiengang_kz; + $where[] = "studiengang_kz = " . $this->db->escape($studiengang_kz); + if ($semester === NULL) $where[] = "semester IS NULL"; elseif ($semester === 0) $where[] = "semester = 0"; } elseif ($studiengang_kz != '') { $add = $mischen === true ? " OR (studiengang_kz = 0 AND semester IS NULL)" : ""; - $where[] = "((studiengang_kz = ? AND semester = ?) OR (studiengang_kz = ? AND semester = 0) OR (studiengang_kz = 0 AND semester = ?)" . $add . ")"; - $params[] = $studiengang_kz; - $params[] = $semester; - $params[] = $studiengang_kz; - $params[] = $semester; + $where[] = "((studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = " . $this->db->escape($semester) . ") OR (studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = 0) OR (studiengang_kz = 0 AND semester = " . $this->db->escape($semester) . ")" . $add . ")"; + } $this->addJoin('campus.tbl_contentsprache cs', 'content_id'); $where[] = "cs.sichtbar = " . ($sichtbar ? "true" : "false"); - $where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=?) THEN ? ELSE ? END)"; - $params[] = $sprache; - $params[] = $sprache; - $params[] = DEFAULT_LANGUAGE; + $where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END)"; + + + $where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END))"; - $where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=?) THEN ? ELSE ? END))"; - $params[] = $sprache; - $params[] = $sprache; - $params[] = DEFAULT_LANGUAGE; $where = implode(" AND ", $where); $this->db->where($where, NULL, FALSE); - // calculating the maxPageCount and adding pagination to the query - $maxPageCount = $this->getMaxPageCount($page_size, $params); - $this->addPagination($page, $page_size, $maxPageCount); - - // creating the select query - $query = new stdClass(); - $query->sql = $this->db->get_compiled_select($this->dbTable); - $query->params = $params; - $query->maxPageCount = $maxPageCount; - return $query; - } - function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) { - $query = $this->getNewsWithContentQuery($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); - return $this->execReadOnlyQuery($query->sql, $query->params); + $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); + // getting the number of rows of the query and adding pagination to the query result + $num_rows = $this->getNumRows(true); + $this->addPagination($page, $page_size, $num_rows); + + // preparing the query again because every call to get_compiled_select or cour_all_results will add the from clause to the query + $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); + + return $this->load(); } + public function countNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + { + $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); + return $this->getNumRows(); + } + + } diff --git a/public/js/apps/api/cms.js b/public/js/apps/api/cms.js index 94b3d282e..6fbb0e727 100644 --- a/public/js/apps/api/cms.js +++ b/public/js/apps/api/cms.js @@ -11,11 +11,11 @@ export default { }, }); }, - getNewsMaxPage: function () { + getNewsRowCount: function () { const url = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + - "/CisHtml/Cms/getNewsMaxPage"; + "/CisHtml/Cms/getNewsRowCount"; return axios.get(url); }, }; diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js index 9ba98f2a1..bac28c23c 100644 --- a/public/js/components/Cis/Cms/Content.js +++ b/public/js/components/Cis/Cms/Content.js @@ -23,7 +23,7 @@ export default { this.content = result.data; }); - Vue.$fhcapi.Cms.getNewsMaxPage().then((result) => { + Vue.$fhcapi.Cms.getNewsRowCount().then((result) => { this.maxPageCount = result.data; }); }, diff --git a/public/js/components/Pagination/Pagination.js b/public/js/components/Pagination/Pagination.js index db751e1d9..8b2688834 100644 --- a/public/js/components/Pagination/Pagination.js +++ b/public/js/components/Pagination/Pagination.js @@ -24,8 +24,7 @@ export default { mounted() {}, template: /*html*/ ` - - + Placeholder From cc0ea44de307d2e89ba9aa011d4a6cc57ebb0bad Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Thu, 18 Apr 2024 11:56:55 +0200 Subject: [PATCH 8/9] also adds the new controller functions to the CisVue/Cms and CisHmvc/Cms --- application/controllers/CisHmvc/Cms.php | 58 ++++++++++++++++++++++--- application/controllers/CisVue/Cms.php | 58 ++++++++++++++++++++++--- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/application/controllers/CisHmvc/Cms.php b/application/controllers/CisHmvc/Cms.php index d15f398a4..eed1a5fea 100644 --- a/application/controllers/CisHmvc/Cms.php +++ b/application/controllers/CisHmvc/Cms.php @@ -77,6 +77,17 @@ class Cms extends Auth_Controller $this->load->view('CisHmvc/Cms/Content', ['content' => getData($content)]); } + /** + * @param boolean $infoscreen + * @param string | null $studiengang_kz + * @param int | null $semester + * @param boolean $mischen + * @param string $titel + * @param boolean $edit + * @param boolean $sichtbar + * + * @return void + */ /** * @param boolean $infoscreen * @param string | null $studiengang_kz @@ -90,13 +101,48 @@ class Cms extends Auth_Controller */ public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { - $page = intval($this->input->get('page', true)); - $pagination_size = 10; - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); + $this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]); + } - if (isError($news)) - return $this->load->view('CisHmvc/Error', ['error' => getError($news)]); + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) + { + $get_page = intval($this->input->get('page', true)); + $get_page_size = intval($this->input->get('page_size', true)); + if ($get_page) { + $page = $get_page; + } + if ($get_page_size) { + $page_size = $get_page_size; + } else { + $page_size = $this->page_size; + } + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); - $this->load->view('CisHmvc/Cms/Content', ['content' => getData($news)]); + if (isError($news)) { + $this->terminateWithJsonError(getError($news)); + } + $news = hasData($news) ? getData($news) : null; + if ($news) { + echo json_encode($news); + } else { + show_error("News: No data found"); + } + + } + + public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) + { + list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester); + $all = $edit; + $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); + if (isError($num_rows)) { + $this->terminateWithJsonError(getError($num_rows)); + } + $num_rows = hasData($num_rows) ? getData($num_rows) : null; + if ($num_rows) { + echo json_encode($num_rows); + } else { + show_error("News number rows: No data found"); + } } } diff --git a/application/controllers/CisVue/Cms.php b/application/controllers/CisVue/Cms.php index 0f3fc061a..2c1fa1fc6 100644 --- a/application/controllers/CisVue/Cms.php +++ b/application/controllers/CisVue/Cms.php @@ -47,6 +47,17 @@ class Cms extends FHC_Controller $this->load->view('CisHtml/Cms/Content', ['content' => getData($content)]); } + /** + * @param boolean $infoscreen + * @param string | null $studiengang_kz + * @param int | null $semester + * @param boolean $mischen + * @param string $titel + * @param boolean $edit + * @param boolean $sichtbar + * + * @return void + */ /** * @param boolean $infoscreen * @param string | null $studiengang_kz @@ -60,13 +71,48 @@ class Cms extends FHC_Controller */ public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { - $page = intval($this->input->get('page', true)); - $pagination_size = 10; - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $pagination_size); + $this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]); + } - if (isError($news)) - return $this->load->view('CisHtml/Error', ['error' => getError($news)]); + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) + { + $get_page = intval($this->input->get('page', true)); + $get_page_size = intval($this->input->get('page_size', true)); + if ($get_page) { + $page = $get_page; + } + if ($get_page_size) { + $page_size = $get_page_size; + } else { + $page_size = $this->page_size; + } + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); - $this->load->view('CisHtml/Cms/Content', ['content' => getData($news)]); + if (isError($news)) { + $this->terminateWithJsonError(getError($news)); + } + $news = hasData($news) ? getData($news) : null; + if ($news) { + echo json_encode($news); + } else { + show_error("News: No data found"); + } + + } + + public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) + { + list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester); + $all = $edit; + $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); + if (isError($num_rows)) { + $this->terminateWithJsonError(getError($num_rows)); + } + $num_rows = hasData($num_rows) ? getData($num_rows) : null; + if ($num_rows) { + echo json_encode($num_rows); + } else { + show_error("News number rows: No data found"); + } } } From 0942480428b7d482cd4bbbac21e4358446a51a1f Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Wed, 8 May 2024 11:58:35 +0200 Subject: [PATCH 9/9] adds the missing model for the function --- application/libraries/CmsLib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index 0fa3b0556..9a898df85 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -210,6 +210,7 @@ class CmsLib */ public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10) { + $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester); $all = $edit;