changes how the pagination is done in the DB_Model

This commit is contained in:
SimonGschnell
2024-04-17 14:23:09 +02:00
parent d77499b73b
commit 6c642f1242
7 changed files with 120 additions and 33 deletions
+31 -2
View File
@@ -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);
}
}
+45 -1
View File
@@ -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;
}
}
+1
View File
@@ -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;
+18 -24
View File
@@ -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);
}
}