| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 | <?php/** *------------------------------------------------------ * 分页样式 *------------------------------------------------------ * * @author    qqiu@qq.com * @date      2016-09-29 13:09:16 * @version   V1.0 * */namespace App\Widget\Pagination;use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;use Illuminate\Contracts\Pagination\Presenter as PresenterContract;use Illuminate\Pagination\UrlWindow;use Illuminate\Support\HtmlString;use Illuminate\Pagination\UrlWindowPresenterTrait;class Pages implements PresenterContract{    use UrlWindowPresenterTrait;    protected $paginationWrapper    = '<ul class="pagination">%s %s %s</ul>';    protected $disabledPageWrapper  = '<li class="disabled"><span>%s</span></li>';    protected $activePageWrapper    = '<li class="active"><span>%s</span></li>';    protected $previousButtonText   = '<span>«</span>';    protected $nextButtonText       = '<span>»</span>';    protected $availablePageWrapper = '<li><a href="%s" rel="next">%s</a></li>';    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;    }}
 |