Изменение меток страниц в Yii?

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

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

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


person kand    schedule 08.12.2011    source источник


Ответы (2)


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

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

Он просто повторяет $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'  => '>>',
                          ),
    ));
person thaddeusmt    schedule 09.12.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. Так что будем искать альтернативы.

Альтернативы

(можно пропустить эту часть, если вас интересует только решение)

Одним из вариантов было бы переопределить метод, вызвать стандартную реализацию, а затем просто изменить то, что вам нужно изменить:

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