Промяна на етикетите на страниците в Yii?

Бих искал да променя етикетите на страниците в 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 вместо >>.


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