Browse Source

Removed ListPager and refactored LinkPager and LinkSorter.

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
78e61c9d94
  1. 33
      framework/yii/widgets/LinkPager.php
  2. 27
      framework/yii/widgets/LinkSorter.php
  3. 94
      framework/yii/widgets/ListPager.php

33
framework/yii/widgets/LinkPager.php

@ -87,9 +87,9 @@ class LinkPager extends Widget
public $lastPageLabel; public $lastPageLabel;
/** /**
* @var string the template used to render the content within the pager container. * @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) { if ($this->pagination === null) {
throw new InvalidConfigException('The "pagination" property must be set.'); 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() public function run()
{ {
$buttons = strtr($this->template, array( $buttons = strtr($this->template, array(
'{buttons}' => Html::tag('ul', implode("\n", $this->createPageButtons())), '{pages}' => $this->renderPageButtons(),
)); ));
echo Html::tag('div', $buttons, $this->options); echo Html::tag('div', $buttons, $this->options);
} }
/** /**
* Creates the page buttons. * Renders the page buttons.
* @return array a list of page buttons (in HTML code). * @return string the rendering result
*/ */
protected function createPageButtons() protected function renderPageButtons()
{ {
$buttons = array(); $buttons = array();
@ -127,7 +130,7 @@ class LinkPager extends Widget
// first page // first page
if ($this->firstPageLabel !== null) { 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 // prev page
@ -135,13 +138,13 @@ class LinkPager extends Widget
if (($page = $currentPage - 1) < 0) { if (($page = $currentPage - 1) < 0) {
$page = 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 // internal pages
list($beginPage, $endPage) = $this->getPageRange(); list($beginPage, $endPage) = $this->getPageRange();
for ($i = $beginPage; $i <= $endPage; ++$i) { 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 // next page
@ -149,28 +152,28 @@ class LinkPager extends Widget
if (($page = $currentPage + 1) >= $pageCount - 1) { if (($page = $currentPage + 1) >= $pageCount - 1) {
$page = $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 // last page
if ($this->lastPageLabel !== null) { 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. * You may override this method to customize the generation of page buttons.
* @param string $label the text label for the button * @param string $label the text label for the button
* @param integer $page the page number * @param integer $page the page number
* @param string $class the CSS class for the page button. * @param string $class the CSS class for the page button.
* @param boolean $disabled whether this page button is disabled * @param boolean $disabled whether this page button is disabled
* @param boolean $active whether this page button is active * @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) { if ($active) {
$class .= ' ' . $this->activePageCssClass; $class .= ' ' . $this->activePageCssClass;

27
framework/yii/widgets/LinkSorter.php

@ -7,6 +7,7 @@
namespace yii\widgets; namespace yii\widgets;
use Yii;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\Widget; use yii\base\Widget;
use yii\data\Sort; use yii\data\Sort;
@ -28,9 +29,13 @@ class LinkSorter extends Widget
public $sort; public $sort;
/** /**
* @var array HTML attributes for the sorter container tag. * @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. * Initializes the sorter.
@ -40,6 +45,10 @@ class LinkSorter extends Widget
if ($this->sort === null) { if ($this->sort === null) {
throw new InvalidConfigException('The "sort" property must be set.'); 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() 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(); $links = array();
foreach (array_keys($this->sort->attributes) as $name) { foreach (array_keys($this->sort->attributes) as $name) {
$links[] = $this->sort->link($name); $links[] = $this->sort->link($name);
} }
echo Html::ul($links, array_merge($this->options, array('encode' => false))); return Html::ul($links, array('encode' => false));
} }
} }

94
framework/yii/widgets/ListPager.php

@ -1,94 +0,0 @@
<?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,
));
}
}
Loading…
Cancel
Save