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*/ `
-
- $emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" >
+ $emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" >
Placeholder