Изменение меток страницы в Yii? - PullRequest
2 голосов
/ 08 декабря 2011

Я хотел бы изменить метки страниц в Yii.

Я использовал Zii.widegt.CListView, чтобы показать список предметов. Структура по умолчанию для yii pagination: [previous] 1 2 4 5 6 7 [next], обязательная структура - < 1....10 11 12 13 14 ....40 >.

.

Я читаю « Как мне настроить ярлыки для пейджера в Yii? », что полезно, но как я могу показать firstPageLabel как страницу № 1 вместо << и lastPageLabel как 40 вместо >>.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Если вы не можете найти способ передать общее количество элементов (т.е. 40) в переопределение lastPageLabel, вам нужно переопределить класс CLinkPager, чтобы эта работа выполнялась автоматически. $ LastPageLabel является статическим в текущей реализации и не предоставляет доступ к переменным, таким как "itemCount". Вы можете увидеть код:

$buttons[]=$this->createPageButton($this->lastPageLabel,$pageCount-1,self::CSS_LAST_PAGE,$currentPage>=$pageCount-1,false);

Это просто echos $this->lastPageLabel, который является статическим текстом.

Если вы создаете новый пейджер (называемый, скажем, MyLinkPager), используйте его так:

$this->widget('zii.widgets.CListView', array(
        'dataProvider' => $categoryProjects,
        'itemView'     => '_itemDetailsView',
        'ajaxUpdate'   => false,
        'pager'        => array(
                            'class'          => 'MyLinkPager', // here is your pager
                            'firstPageLabel' => '<<',
                            'prevPageLabel'  => '<',
                            'nextPageLabel'  => '>',
                            'lastPageLabel'  => '>>',
                          ),
    ));
2 голосов
/ 09 декабря 2011

Вам нужно будет создать свой собственный класс, производный от 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'),
...