Вам нужно будет создать свой собственный класс, производный от 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.Итак, давайте поищем альтернативы.
Альтернативы
(вы можете пропустить эту часть, если вас интересует только решение)
Oneальтернативой может быть переопределение метода, вызов его стандартной реализацией, а затем просто изменить то, что вам нужно изменить:
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'),