更改 Yii 中的页面标签?

问题描述 投票:0回答:2

我想更改 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 而不是
 >>

php pagination yii
2个回答
3
投票

如果您找不到将总项目数(即 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'  => '>>',
                          ),
    ));

2
投票

您必须创建自己的派生自

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
并没有真正做很多事情。所以你可以在让 Yii 的代码运行之前重写
run
并动态设置
$this->lastPageLabel
的值,如下所示:

public function run()
{
    $this->lastPageLabel = $this->getPageCount();
    parent::run();
}

嗯,这很好。我们通过仅重写一个方法并编写两行代码来实现这一目标。作为额外的好处,如果未来

CLinkPager
的实现发生变化,我们的代码中没有任何内容需要与 Yii 保持同步。

另一方面,所有这些解决方案都引入了可能出现问题的杂质:当有人编写使用我们的自定义分页器类的视图时,他们可能不知道我们实际上正在覆盖

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'),
© www.soinside.com 2019 - 2024. All rights reserved.