Commit 78e61c9d by Qiang Xue

Removed ListPager and refactored LinkPager and LinkSorter.

parent 6ce60c16
......@@ -87,9 +87,9 @@ class LinkPager extends Widget
public $lastPageLabel;
/**
* @var string the template used to render the content within the pager container.
* The token "{buttons}" will be replaced with the actual page buttons.
* The token "{pages}" will be replaced with the actual page buttons.
*/
public $template = '{buttons}';
public $template;
/**
......@@ -100,6 +100,9 @@ class LinkPager extends Widget
if ($this->pagination === null) {
throw new InvalidConfigException('The "pagination" property must be set.');
}
if ($this->template === null) {
$this->template = '<label>' . Yii::t('yii', 'Go to page:') . '</label> {pages}';
}
}
/**
......@@ -109,16 +112,16 @@ class LinkPager extends Widget
public function run()
{
$buttons = strtr($this->template, array(
'{buttons}' => Html::tag('ul', implode("\n", $this->createPageButtons())),
'{pages}' => $this->renderPageButtons(),
));
echo Html::tag('div', $buttons, $this->options);
}
/**
* Creates the page buttons.
* @return array a list of page buttons (in HTML code).
* Renders the page buttons.
* @return string the rendering result
*/
protected function createPageButtons()
protected function renderPageButtons()
{
$buttons = array();
......@@ -127,7 +130,7 @@ class LinkPager extends Widget
// first page
if ($this->firstPageLabel !== null) {
$buttons[] = $this->createPageButton($this->firstPageLabel, 0, $this->firstPageCssClass, $currentPage <= 0, false);
$buttons[] = $this->renderPageButton($this->firstPageLabel, 0, $this->firstPageCssClass, $currentPage <= 0, false);
}
// prev page
......@@ -135,13 +138,13 @@ class LinkPager extends Widget
if (($page = $currentPage - 1) < 0) {
$page = 0;
}
$buttons[] = $this->createPageButton($this->prevPageLabel, $page, $this->prevPageCssClass, $currentPage <= 0, false);
$buttons[] = $this->renderPageButton($this->prevPageLabel, $page, $this->prevPageCssClass, $currentPage <= 0, false);
}
// internal pages
list($beginPage, $endPage) = $this->getPageRange();
for ($i = $beginPage; $i <= $endPage; ++$i) {
$buttons[] = $this->createPageButton($i + 1, $i, null, false, $i == $currentPage);
$buttons[] = $this->renderPageButton($i + 1, $i, null, false, $i == $currentPage);
}
// next page
......@@ -149,28 +152,28 @@ class LinkPager extends Widget
if (($page = $currentPage + 1) >= $pageCount - 1) {
$page = $pageCount - 1;
}
$buttons[] = $this->createPageButton($this->nextPageLabel, $page, $this->nextPageCssClass, $currentPage >= $pageCount - 1, false);
$buttons[] = $this->renderPageButton($this->nextPageLabel, $page, $this->nextPageCssClass, $currentPage >= $pageCount - 1, false);
}
// last page
if ($this->lastPageLabel !== null) {
$buttons[] = $this->createPageButton($this->lastPageLabel, $pageCount - 1, $this->lastPageCssClass, $currentPage >= $pageCount - 1, false);
$buttons[] = $this->renderPageButton($this->lastPageLabel, $pageCount - 1, $this->lastPageCssClass, $currentPage >= $pageCount - 1, false);
}
return $buttons;
return Html::tag('ul', implode("\n", $buttons));
}
/**
* Creates a page button.
* Renders a page button.
* You may override this method to customize the generation of page buttons.
* @param string $label the text label for the button
* @param integer $page the page number
* @param string $class the CSS class for the page button.
* @param boolean $disabled whether this page button is disabled
* @param boolean $active whether this page button is active
* @return string the generated button
* @return string the rendering result
*/
protected function createPageButton($label, $page, $class, $disabled, $active)
protected function renderPageButton($label, $page, $class, $disabled, $active)
{
if ($active) {
$class .= ' ' . $this->activePageCssClass;
......
......@@ -7,6 +7,7 @@
namespace yii\widgets;
use Yii;
use yii\base\InvalidConfigException;
use yii\base\Widget;
use yii\data\Sort;
......@@ -28,9 +29,13 @@ class LinkSorter extends Widget
public $sort;
/**
* @var array HTML attributes for the sorter container tag.
* Please refer to [[Html::ul()]] for supported special options.
*/
public $options = array();
public $options = array('class' => 'sorter');
/**
* @var string the template used to render the content within the sorter container.
* The token "{links}" will be replaced with the actual sort links.
*/
public $template;
/**
* Initializes the sorter.
......@@ -40,6 +45,10 @@ class LinkSorter extends Widget
if ($this->sort === null) {
throw new InvalidConfigException('The "sort" property must be set.');
}
if ($this->template === null) {
$this->template = '<label>' . Yii::t('yii', 'Sort by:') . '</label> {links}';
}
}
/**
......@@ -48,10 +57,22 @@ class LinkSorter extends Widget
*/
public function run()
{
$links = strtr($this->template, array(
'{links}' => $this->renderSortLinks(),
));
echo Html::tag('div', $links, $this->options);
}
/**
* Renders the sort links.
* @return string the rendering result
*/
protected function renderSortLinks()
{
$links = array();
foreach (array_keys($this->sort->attributes) as $name) {
$links[] = $this->sort->link($name);
}
echo Html::ul($links, array_merge($this->options, array('encode' => false)));
return Html::ul($links, array('encode' => false));
}
}
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\widgets;
use yii\base\InvalidConfigException;
use yii\helpers\Html;
use yii\base\Widget;
use yii\data\Pagination;
/**
* ListPager displays a drop-down list that contains options leading to different pages.
*
* ListPager works with a [[Pagination]] object which specifies the totally number
* of pages and the current page number.
*
* Note that ListPager requires JavaScript to work. You should consider using [[LinkPager]]
* if you want to make your page work without JavaScript.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class ListPager extends Widget
{
/**
* @var Pagination the pagination object that this pager is associated with.
* You must set this property in order to make ListPager work.
*/
public $pagination;
/**
* @var array HTML attributes for the drop-down list tag. The following options are specially handled:
*
* - prompt: string, a prompt text to be displayed as the first option.
*
* The rest of the options will be rendered as the attributes of the resulting tag. The values will
* be HTML-encoded using [[encode()]]. If a value is null, the corresponding attribute will not be rendered.
*/
public $options = array();
/**
* @var string the template used to render the label for each list option.
* The token "{page}" will be replaced with the actual page number (1-based).
*/
public $template = '{page}';
/**
* Initializes the pager.
*/
public function init()
{
if ($this->pagination === null) {
throw new InvalidConfigException('The "pagination" property must be set.');
}
}
/**
* Executes the widget.
* This overrides the parent implementation by displaying the generated page buttons.
*/
public function run()
{
$pageCount = $this->pagination->getPageCount();
$currentPage = $this->pagination->getPage();
$pages = array();
for ($i = 0; $i < $pageCount; ++$i) {
$pages[$this->pagination->createUrl($i)] = $this->generatePageText($i);
}
$selection = $this->pagination->createUrl($currentPage);
if (!isset($this->options['onchange'])) {
$this->options['onchange'] = "if (this.value != '') { window.location = this.value; };";
}
echo Html::dropDownList(null, $selection, $pages, $this->options);
}
/**
* Generates the label of the list option for the specified page number.
* You may override this method to customize the option display.
* @param integer $page zero-based page number
* @return string the list option for the page number
*/
protected function generatePageText($page)
{
return strtr($this->template, array(
'{page}' => $page + 1,
));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment