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