Вам нужно будет создать свой собственный класс, производный от CLinkPager
. В конечном счете, вы хотите изменить строку, которую упоминает thaddeusmt, внутри CLinkPager::createPageButtons
:
$buttons[]=$this->createPageButton($this->lastPageLabel /* the rest doesn't matter */);
сделать эквивалент
$buttons[]=$this->createPageButton($pageCount /* the rest doesn't matter */);
Теперь, очевидно, прямой способ сделать это - переопределить createPageButtons
, но это нетривиальный метод, и если вы полностью переопределите его, вы рискуете, что ваш пейджер "рассинхронизируется" с кодом в более поздних версиях Yii. Так что будем искать альтернативы.
Альтернативы
(можно пропустить эту часть, если вас интересует только решение)
Одним из вариантов было бы переопределить метод, вызвать стандартную реализацию, а затем просто изменить то, что вам нужно изменить:
protected function createPageButtons() {
$buttons = parent::createPageButtons(); // Yii's implementation
array_pop($buttons); // remove last item, which is the link for the last page
$buttons[]=$this->createPageButton($this->getPageCount() /* the rest unchanged */);
return $buttons;
}
Это лучше, но по-прежнему требует копирования/вставки кода, поэтому ваша реализация должна синхронизировать эту часть с будущими выпусками Yii. Можем ли мы сделать лучше, чем это? Оказывается, да. Вот метод CLinkPager::run
:
public function run()
{
$this->registerClientScript();
$buttons=$this->createPageButtons();
if(empty($buttons))
return;
echo $this->header;
echo CHtml::tag('ul',$this->htmlOptions,implode("\n",$buttons));
echo $this->footer;
}
Как видите, CLinkPager
на самом деле не делает ничего, кроме вызова createPageButtons
. Таким образом, вы можете переопределить run
и динамически установить значение $this->lastPageLabel
перед запуском кода Yii, например:
public function run()
{
$this->lastPageLabel = $this->getPageCount();
parent::run();
}
Что ж, это мило. Нам удалось достичь цели, переопределив всего один метод и написав две строки кода. В качестве дополнительного бонуса в нашем коде нет ничего, что нужно было бы синхронизировать с Yii, если реализация CLinkPager
изменится в будущем.
С другой стороны, все эти решения вносят нечистоты, которые могут быть проблематичными: когда кто-то пишет представление, использующее наш пользовательский класс пейджера, он может знать, что мы на самом деле переопределяем значение lastPageLabel
! Представьте себе «почему он не выводит метку, которой я говорю?» путаница.
Действительно хорошее решение
К счастью, вы можете получить свой пирог и съесть его, переопределив CLinkPager::init
следующим образом:
public function init()
{
// "Hijack" the default values for properties that the user did not set.
// This allows the user to still override this if they want to.
if($this->nextPageLabel===null)
$this->nextPageLabel='<';
if($this->prevPageLabel===null)
$this->prevPageLabel='>';
if($this->firstPageLabel===null)
$this->firstPageLabel='1';
if($this->lastPageLabel===null)
$this->lastPageLabel=$this->getPageCount();
// and let Yii do the rest like it always does
parent::init();
}
Затем вы можете настроить свое представление для использования этого пейджера, и все будет работать нормально, без лишних слов:
'pager' => array('class' => 'CustomLinkPager'),
person
Jon
schedule
09.12.2011