diff --git a/models/GenericTable.php b/models/GenericTable.php index 729d414..89f6c4c 100644 --- a/models/GenericTable.php +++ b/models/GenericTable.php @@ -6,11 +6,12 @@ * Kabuki CMS (C) 2013-2015, Aaron van Geffen *****************************************************************************/ -class GenericTable extends PageIndex +class GenericTable { protected $header = []; protected $body = []; - protected $page_index = []; + protected $pageIndex = null; + protected $currentPage = 1; protected $title; protected $title_class; @@ -36,17 +37,19 @@ class GenericTable extends PageIndex // Make sure we know whether we can actually sort on something. $this->tableIsSortable = !empty($options['base_url']); - // How much stuff do we have? + // How much data do we have? $this->recordCount = $options['get_count'](...(!empty($options['get_count_params']) ? $options['get_count_params'] : [])); - // Should we create a page index? + // How much data do we need to retrieve? $this->items_per_page = !empty($options['items_per_page']) ? $options['items_per_page'] : 30; - $this->needsPageIndex = !empty($this->items_per_page) && $this->recordCount > $this->items_per_page; - $this->index_class = $options['index_class'] ?? ''; // Figure out where to start. $this->start = empty($options['start']) || !is_numeric($options['start']) || $options['start'] < 0 || $options['start'] > $this->recordCount ? 0 : $options['start']; + // Figure out where we are on the whole, too. + $numPages = ceil($this->recordCount / $this->items_per_page); + $this->currentPage = min(ceil($this->start / $this->items_per_page) + 1, $numPages); + // Let's bear a few things in mind... $this->base_url = $options['base_url']; @@ -67,9 +70,10 @@ class GenericTable extends PageIndex // Okay, now for the column headers... $this->generateColumnHeaders($options); - // Generate a pagination if requested - if ($this->needsPageIndex) - $this->generatePageIndex(); + // Should we create a page index? + $needsPageIndex = !empty($this->items_per_page) && $this->recordCount > $this->items_per_page; + if ($needsPageIndex) + $this->generatePageIndex($options); // Not a single row in sight? if (empty($rows)) @@ -108,6 +112,19 @@ class GenericTable extends PageIndex } } + private function generatePageIndex($options) + { + $this->pageIndex = new PageIndex([ + 'base_url' => $this->base_url, + 'index_class' => $options['index_class'] ?? '', + 'items_per_page' => $this->items_per_page, + 'recordCount' => $this->recordCount, + 'sort_direction' => $this->sort_direction, + 'sort_order' => $this->sort_order, + 'start' => $this->start, + ]); + } + private function parseAllRows($rows, $options) { foreach ($rows as $i => $row) @@ -220,12 +237,6 @@ class GenericTable extends PageIndex return $this->start; } - public function getArray() - { - // Makes no sense to call it for a table, but inherits from PageIndex due to poor design, sorry. - throw new Exception('Function call is ambiguous.'); - } - public function getHeader() { return $this->header; @@ -236,6 +247,16 @@ class GenericTable extends PageIndex return $this->body; } + public function getCurrentPage() + { + return $this->currentPage; + } + + public function getPageIndex() + { + return $this->pageIndex; + } + public function getTitle() { return $this->title; diff --git a/models/PageIndex.php b/models/PageIndex.php index 0f17c0e..a0ebced 100644 --- a/models/PageIndex.php +++ b/models/PageIndex.php @@ -8,23 +8,35 @@ class PageIndex { - protected $page_index = []; + protected $base_url; protected $current_page = 1; + protected $index_class = 'pagination'; protected $items_per_page = 0; protected $needsPageIndex = false; protected $num_pages = 1; - protected $recordCount = 0; - protected $start = 0; - protected $sort_order = null; - protected $sort_direction = null; - protected $base_url; - protected $index_class = 'pagination'; + protected $page_index = []; protected $page_slug = '%AMP%page=%PAGE%'; + protected $recordCount = 0; + protected $sort_direction = null; + protected $sort_order = null; + protected $start = 0; public function __construct($options) { - foreach ($options as $key => $value) - $this->$key = $value; + static $neededKeys = ['base_url', 'items_per_page', 'recordCount']; + foreach ($neededKeys as $key) + { + if (!isset($options[$key])) + throw new Exception('PageIndex: argument ' . $key . ' missing in options'); + + $this->$key = $options[$key]; + } + + static $optionalKeys = ['index_class', 'page_slug', 'sort_direction', 'sort_order', 'start']; + foreach ($optionalKeys as $key) + if (isset($options[$key])) + $this->$key = $options[$key]; + $this->generatePageIndex(); } diff --git a/templates/TabularData.php b/templates/TabularData.php index 8460158..7f78659 100644 --- a/templates/TabularData.php +++ b/templates/TabularData.php @@ -6,12 +6,15 @@ * Kabuki CMS (C) 2013-2015, Aaron van Geffen *****************************************************************************/ -class TabularData extends Pagination +class TabularData extends SubTemplate { public function __construct(GenericTable $table) { $this->_t = $table; - parent::__construct($table); + + $pageIndex = $table->getPageIndex(); + if ($pageIndex) + $this->pager = new Pagination($pageIndex); } protected function html_content() @@ -25,7 +28,8 @@ class TabularData extends Pagination