我想显示一个菜单栏,其中包含消息和更新计数等统计信息,以及礼物、新朋友请求和消息计数等其他统计信息。
该菜单将显示在所有页面上。如何编写一个方法来获取所有统计信息并将部分渲染到布局中而忘记它?
而在其他行动中,只需专注于页面的主要功能。不用担心菜单。
如何在 Yii 中实现这一点?
我想显示一个菜单栏,其中包含消息和更新计数等统计信息,以及礼物、新朋友请求和消息计数等其他统计信息。
该菜单将显示在所有页面上。如何编写一个方法来获取所有统计信息并将部分渲染到布局中而忘记它?
而在其他行动中,只需专注于页面的主要功能。不用担心菜单。
如何在 Yii 中实现这一点?
您可能正在寻找一个小部件。例如,您可以在其中扩展CMenu
并执行查询init()
:
<?php
Yii::import('zii.widgets.CMenu')
class MainMenu extends CMenu
{
public function init()
{
// Do some count queries here. This is just an example,
// your implementation will differ, of course:
$newMessages = Messages::model()->new()->count();
// Now add the menu items:
$this->items = array(
array(
'label' => "$newMessages New messages",
'url' => array('messages/list'),
),
// ...
);
parent::init();
}
}
然后,您可以在您的views/layouts/main.php
:
<?php $this->widget('MainMenu'); ?>
您需要在 /protected/components/extendingclassname 中创建一个扩展 CMenu 的类
<?php
Yii::import('zii.widgets.CMenu');
class Notifications extends CMenu
{
public function init()
{
//query
$requestor=Yii::app()->user->name;
$count = Requests::model()->count( 'requestor=:requestor', array('requestor' => $requestor));
// Now add the menu items:
$this->items = array(
array(
'label' => "$count New messages",
'url' => array('user/notifications'),
),
// ...
);
parent::init();
}
}
?>
然后在 /layouts.main.php 中包含以下行。希望这对不确定在哪里使用该类的初学者有所帮助。这是 Michael Härtl 忘记提及的内容。
您可以使用beforeAction来实现这一点。正如文档所说,“此方法在要执行的操作之前调用(在所有可能的过滤器之后)。您可以覆盖此方法来为操作做最后一分钟的准备。”
您还可以在主控制器(Components/Controller.php)中定义公共变量,以便其他每个控制器都可以访问这些变量。然后,您可以使用 $this-variable 在布局中使用它们...
希望这可以帮助 :)