public function renderAsHtml($urlTemplate = null)
{
if ($urlTemplate === null) {
if (!$this->request->hasServer('REQUEST_URI')) {
throw new PaginatorException('REQUEST_URI is not exist in $_SERVER');
} else {
$urlTemplate = $this->request->getServer('REQUEST_URI', 'ignore');
}
if (strpos($urlTemplate, '?page=') === false && strpos($urlTemplate, '&page=') === false) {
$urlTemplate .= (strpos($urlTemplate, '?') === false ? '?' : '&') . 'page={page}';
} else {
$urlTemplate = preg_replace('#([\\?&]page)=\\d+#', '\\1={page}', $urlTemplate);
}
}
if (strpos($urlTemplate, '{page}') === false) {
throw new PaginatorException('`:template` url template is invalid: it must contain {page} pattern', ['template' => $urlTemplate]);
}
$str = '';
$str .= '<ul class="pagination">' . PHP_EOL;
$str .= '<li class="first"><a href="' . str_replace('{page}', 1, $urlTemplate) . '"><<</a></li>' . PHP_EOL;
$str .= '<li class="prev"><a href="' . str_replace('{page}', $this->prev, $urlTemplate) . '"><</a></li>' . PHP_EOL;
$startPage = (int) min($this->page - ceil($this->numberOfPages / 2), $this->pages - $this->numberOfPages);
$startPage = max(0, $startPage) + 1;
$endPage = min($startPage + $this->numberOfPages - 1, $this->pages);
for ($i = $startPage; $i <= $endPage; $i++) {
if ($i === $this->page) {
$str .= '<li class="active"><a href="' . str_replace('{page}', $i, $urlTemplate) . '">' . $i . '</a></li>' . PHP_EOL;
} else {
$str .= '<li><a href="' . str_replace('{page}', $i, $urlTemplate) . '">' . $i . '</a></li>' . PHP_EOL;
}
}
$str .= '<li class="next"><a href="' . str_replace('{page}', $this->next, $urlTemplate) . '">></a></li>' . PHP_EOL;
$str .= '<li class="last"><a href="' . str_replace('{page}', $this->pages, $urlTemplate) . '">>></a></li>' . PHP_EOL;
$str .= '</ul>' . PHP_EOL;
return $str;
}