我想显示一个菜单栏,其中包含消息和更新计数等统计信息,以及礼品,新朋友请求和消息计数等其他计数。
此菜单将显示在所有页面上。 如何编写一个方法来获取所有统计数据并将其部分渲染到布局中并忘记它?
在其他行动中,只关注页面的主要功能。没有打扰菜单。
我如何在Yii中实现这一目标?
答案 0 :(得分:1)
你可能正在寻找一个小部件。例如,您可以扩展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'); ?>
答案 1 :(得分:0)
您可以使用beforeAction来实现此目的。 正如文档所说“在执行操作之前(在所有可能的过滤器之后)调用此方法。您可以覆盖此方法以对操作进行最后的准备。”
您还可以在主控制器(Components / Controller.php)中定义公共变量,以便每个其他控制器都可以访问这些变量。然后,您可以使用$ this-variable ...
在布局中使用它们希望这会有所帮助:)
答案 2 :(得分:0)
您需要创建一个在/ 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.Hope中包含以下行。这有助于初学者不知道在哪里使用该课程。这是MichaelHärtl忘记提及的内容。