我想更改 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 而不是 >>
。
如果您找不到将总项目数(即 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' => '>>',
),
));
您必须创建自己的派生自
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'),