/** * Parse pagination */ protected function parsePagination() { // init var $pagination = null; $showFirstPages = false; $showLastPages = false; $useQuestionMark = true; // validate pagination array switch (true) { case !isset($this->pagination['limit']): throw new FrontendException('no limit in the pagination-property.'); case !isset($this->pagination['offset']): throw new FrontendException('no offset in the pagination-property.'); case !isset($this->pagination['requested_page']): throw new FrontendException('no requested_page available in the pagination-property.'); case !isset($this->pagination['num_items']): throw new FrontendException('no num_items available in the pagination-property.'); case !isset($this->pagination['num_pages']): throw new FrontendException('no num_pages available in the pagination-property.'); case !isset($this->pagination['url']): throw new FrontendException('no URL available in the pagination-property.'); } // should we use a questionmark or an ampersand if (mb_strpos($this->pagination['url'], '?') !== false) { $useQuestionMark = false; } // no pagination needed if ($this->pagination['num_pages'] < 1) { return; } // populate count fields $pagination['num_pages'] = $this->pagination['num_pages']; $pagination['current_page'] = $this->pagination['requested_page']; // as long as we are below page 5 we should show all pages starting from 1 if ($this->pagination['requested_page'] < 6) { // init vars $pagesStart = 1; $pagesEnd = $this->pagination['num_pages'] >= 6 ? 6 : $this->pagination['num_pages']; // show last pages if ($this->pagination['num_pages'] > 5) { $showLastPages = true; } } elseif ($this->pagination['requested_page'] >= $this->pagination['num_pages'] - 4) { // as long as we are 5 pages from the end we should show all pages till the end $pagesStart = $this->pagination['num_pages'] - 5; $pagesEnd = $this->pagination['num_pages']; // show first pages if ($this->pagination['num_pages'] > 5) { $showFirstPages = true; } } else { // page 7 $pagesStart = $this->pagination['requested_page'] - 2; $pagesEnd = $this->pagination['requested_page'] + 2; $showFirstPages = true; $showLastPages = true; } // show previous if ($this->pagination['requested_page'] > 1) { // build URL if ($useQuestionMark) { $url = $this->pagination['url'] . '?page=' . ($this->pagination['requested_page'] - 1); } else { $url = $this->pagination['url'] . '&page=' . ($this->pagination['requested_page'] - 1); } // set $pagination['show_previous'] = true; $pagination['previous_url'] = $url; } // show first pages? if ($showFirstPages) { // init var $pagesFirstStart = 1; $pagesFirstEnd = 1; // loop pages for ($i = $pagesFirstStart; $i <= $pagesFirstEnd; ++$i) { // build URL if ($useQuestionMark) { $url = $this->pagination['url'] . '?page=' . $i; } else { $url = $this->pagination['url'] . '&page=' . $i; } // add $pagination['first'][] = array('url' => $url, 'label' => $i); } } // build array for ($i = $pagesStart; $i <= $pagesEnd; ++$i) { // init var $current = $i == $this->pagination['requested_page']; // build URL if ($useQuestionMark) { $url = $this->pagination['url'] . '?page=' . $i; } else { $url = $this->pagination['url'] . '&page=' . $i; } // add $pagination['pages'][] = array('url' => $url, 'label' => $i, 'current' => $current); } // show last pages? if ($showLastPages) { // init var $pagesLastStart = $this->pagination['num_pages']; $pagesLastEnd = $this->pagination['num_pages']; // loop pages for ($i = $pagesLastStart; $i <= $pagesLastEnd; ++$i) { // build URL if ($useQuestionMark) { $url = $this->pagination['url'] . '?page=' . $i; } else { $url = $this->pagination['url'] . '&page=' . $i; } // add $pagination['last'][] = array('url' => $url, 'label' => $i); } } // show next if ($this->pagination['requested_page'] < $this->pagination['num_pages']) { // build URL if ($useQuestionMark) { $url = $this->pagination['url'] . '?page=' . ($this->pagination['requested_page'] + 1); } else { $url = $this->pagination['url'] . '&page=' . ($this->pagination['requested_page'] + 1); } // set $pagination['show_next'] = true; $pagination['next_url'] = $url; } // multiple pages $pagination['multiple_pages'] = $pagination['num_pages'] == 1 ? false : true; // assign pagination $this->tpl->assign('pagination', $pagination); }