%s %s %s';
protected $disabledPageWrapper = '
%s';
protected $activePageWrapper = '%s';
protected $previousButtonText = '«';
protected $nextButtonText = '»';
protected $availablePageWrapper = '%s';
protected $dotsText = '...';
protected $paginator;
protected $window;
protected $pageRule;
protected $appendArr;
public function init( PaginatorContract $paginator, UrlWindow $window = null )
{
$this->paginator = $paginator;
$this->window = is_null( $window ) ? UrlWindow::make( $paginator ) : $window->get();
return $this;
}
public function simpleCreate( PaginatorContract $paginator )
{
$this->paginator = $paginator;
return $this;
}
public function hasPages()
{
return $this->paginator->hasPages();
}
public function appends(array $request = [])
{
$this->appendArr = $request;
return $this;
}
public function setPage( $pageRule )
{
$this->pageRule = rtrim($pageRule, '/');
return $this;
}
public function render()
{
if ( $this->hasPages() ) {
return sprintf(
$this->getPaginationWrapperHTML(),
$this->getPreviousButton(),
$this->getLinks(),
$this->getNextButton()
);
}
return '';
}
protected function getAvailablePageWrapper( $url, $page )
{
return sprintf( $this->getAvailablePageWrapperHTML(), $url, $page );
}
protected function getDisabledTextWrapper( $text )
{
return sprintf( $this->getDisabledPageWrapperHTML(), $text );
}
protected function getActivePageWrapper( $text )
{
return sprintf( $this->getActivePageWrapperHTML(), $text );
}
protected function getDots()
{
return $this->getDisabledTextWrapper( $this->getDotsText() );
}
protected function currentPage()
{
return $this->paginator->currentPage();
}
protected function lastPage()
{
return $this->paginator->lastPage();
}
protected function getPageLinkWrapper( $url, $page )
{
if($this->pageRule){
$url = $this->formatUrl($url, $this->pageRule);
}
if ( $page == $this->paginator->currentPage() ) {
return $this->getActivePageWrapper( $page );
}
return $this->getAvailablePageWrapper( $url, $page );
}
protected function getPreviousButton()
{
if ( $this->paginator->currentPage() <= 1 ) {
return $this->getDisabledTextWrapper( $this->getPreviousButtonText() );
}
$url = $this->paginator->url(
$this->paginator->currentPage() - 1
);
return $this->getPageLinkWrapper( $url, $this->getPreviousButtonText() );
}
protected function getNextButton()
{
if ( !$this->paginator->hasMorePages() ) {
return $this->getDisabledTextWrapper( $this->getNextButtonText() );
}
$url = $this->paginator->url( $this->paginator->currentPage() + 1 );
return $this->getPageLinkWrapper( $url, $this->getNextButtonText() );
}
protected function getAvailablePageWrapperHTML()
{
return $this->availablePageWrapper;
}
protected function getActivePageWrapperHTML()
{
return $this->activePageWrapper;
}
protected function getDisabledPageWrapperHTML()
{
return $this->disabledPageWrapper;
}
protected function getPreviousButtonText()
{
return $this->previousButtonText;
}
protected function getNextButtonText()
{
return $this->nextButtonText;
}
protected function getDotsText()
{
return $this->dotsText;
}
protected function getPaginationWrapperHTML()
{
return $this->paginationWrapper;
}
/**
* @param $url
* @param string $pageRule
* @return string
*/
protected function formatUrl($url, $pageRule)
{
$pagePreg = '|' . str_replace(['/', '-', '{page}'], ['\/', '\-', '([0-9]+)'], $pageRule) . '|is';
$urlArr = parse_url($url);
$newUrl = isset($urlArr['scheme']) ? ($urlArr['scheme'] . "://") : '';
$newUrl .= isset($urlArr['host']) ? $urlArr['host'] : '';
$newUrl .= isset($urlArr['path']) ? $urlArr['path'] : '';
$arrQuery = $this->convertUrlQuery($urlArr['query']);
if($this->appendArr){
$arrQuery = array_merge($this->appendArr, $arrQuery);
}
if(isset($arrQuery['page'])) {
$pageRule = str_replace('{page}', $arrQuery['page'], $pageRule);
unset($arrQuery['page']);
}
if(isset($urlArr['path'])){
$newUrl = preg_replace($pagePreg, '', $newUrl) . $pageRule . (empty($arrQuery) ? '' : ('?' . http_build_query($arrQuery)));
}else{
$newUrl = rtrim($newUrl, '/') . $pageRule . (empty($arrQuery) ? '' : ('?' . http_build_query($arrQuery)));
}
return $newUrl;
}
/**
* Render the actual link slider.
*
* @return string
*/
protected function getLinks()
{
$html = '';
if (is_array($this->window['first'])) {
$html .= $this->getUrlLinks($this->window['first']);
}
if (is_array($this->window['slider'])) {
$html .= $this->getDots();
$html .= $this->getUrlLinks($this->window['slider']);
}
if (is_array($this->window['last'])) {
$html .= $this->getDots();
$html .= $this->getUrlLinks($this->window['last']);
}
return $html;
}
/**
* Get the links for the URLs in the given array.
*
* @param array $urls
* @return string
*/
protected function getUrlLinks(array $urls)
{
$html = '';
foreach ($urls as $page => $url) {
$html .= $this->getPageLinkWrapper($url, $page);
}
return $html;
}
/**
* Returns the url query as associative array
*
* @param string query
* @return array params
*/
protected function convertUrlQuery($query)
{
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param)
{
$item = explode('=', $param);
$params[$item[0]] = $item[1];
}
return $params;
}
}