mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
updates news fetching and DB_Model pagination methods
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = '<?xml version="1.0" encoding="UTF-8"?><content>';
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
},
|
||||
|
||||
@@ -24,8 +24,7 @@ export default {
|
||||
mounted() {},
|
||||
template: /*html*/ `
|
||||
|
||||
|
||||
<paginator v-model:rows="page_size" @page="(data)=>$emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" ></paginator>
|
||||
<paginator v-model:rows="page_size" @page="(data)=>$emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" ></paginator>
|
||||
<slot>
|
||||
Placeholder
|
||||
</slot>
|
||||
|
||||
Reference in New Issue
Block a user