创建用户菜单 Portlet
==========================

基于需求分析，我们需要三个不同的 portlet （译者注：如果一开始不理解什么是 portlet 没关系，继续往下看就知道了。）：“用户菜单” portlet，“标签云” portlet 和“最新评论” portlet 。我们将通过继承Yii提供的 [CPortlet] 小物件开发这三个 portlet。

在这一节中，我们将开发第一个具体的 portlet ——用户菜单 portlet，它显示一个只对已通过身份验证的用户可见的菜单。此菜单包含四个项目：

 * 评论审核: 一个指向待审核评论列表的超级链接；
 * 创建新日志: 一个指向日志创建页的超级链接；
 * 管理日志: 一个指向日志管理页的超级链接；
 * 注销: 一个可用于注销当前用户的链接按钮。


创建 `UserMenu` 类
-------------------------

我们创建一个用于表现用户菜单 portlet 逻辑的 `UserMenu` 类。此类保存在文件 `/wwwroot/blog/protected/components/UserMenu.php` 中，其代码如下：

~~~
[php]
Yii::import('zii.widgets.CPortlet');

class UserMenu extends CPortlet
{
	public function init()
	{
		$this->title=CHtml::encode(Yii::app()->user->name);
		parent::init();
	}

	protected function renderContent()
	{
		$this->render('userMenu');
	}
}
~~~

`UserMenu` 类继承自 `zii` 库中的 `CPortlet` 类。它覆盖了 `CPortlet` 类的 `init()` 和 `renderContent()` 方法。前者设置 portlet 的标题为当前用户的名字；后者通过渲染一个名为 `userMenu` 的视图生成 portlet 的主体内容。

> Tip|提示: 注意，我们必须在首次使用之前通过调用 `Yii::import()` 显式包含 `CPortlet` 类。这是因为 `CPortlet` 是 `zii` 工程的一部分。`zii` 工程是 Yii 的官方扩展库。出于性能的考虑，此工程中的类并未列入核心类。因此，我们必须在首次使用之前将其导入（import）。


创建 `userMenu` 视图
------------------------

然后，我们创建 `userMenu` 视图，它保存在 `/wwwroot/blog/protected/components/views/userMenu.php`:

~~~
[php]
<ul>
	<li><?php echo CHtml::link('Create New Post',array('post/create')); ?></li>
	<li><?php echo CHtml::link('Manage Posts',array('post/admin')); ?></li>
	<li><?php echo CHtml::link('Approve Comments',array('comment/index'))
		. ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
	<li><?php echo CHtml::link('Logout',array('site/logout')); ?></li>
</ul>
~~~

> Info|信息: 默认情况下，小物件的视图文件应保存在包含小物件类文件的目录的 `views` 子目录中。文件名必须和视图名称相同。


使用 `UserMenu` Portlet
------------------------

是可以把我们新完成的 `UserMenu` portlet 投入使用的时候了。我们把布局文件 `/wwwroot/blog/protected/views/layouts/column2.php` 修改如下:

~~~
[php]
......
<div id="sidebar">
	<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?>
</div>
......
~~~

如上所示，我们调用了 `widget()` 方法创建并执行了 `UserMenu` 类的实例。由于此 portlet 只应显示给已通过身份验证的用户，我们只在当前用户的 `isGuest` 属性为 false 时（即用户未登录时）调用 `widget()` 方法。 


测试 `UserMenu` Portlet
--------------------------

让我们来测试一下所作的工作：

 1. 打开浏览器输入 URL `http://www.example.com/blog/index.php` 。 核实页面中的侧边栏中没有任何东西显示。
 2. 点击 `Login` 超链接，填写登录表单登录，如果登录成功，核实 `UserMenu` portlet 显示在了侧边栏中，且其标题为当前用户名。
 3. 点击 `UserMenu` portlet 中的  'Logout' ，核实注销成功且 `UserMenu` portlet 已消失。


总结
-------

我们创建的是一个 portlet， 它是高度可复用的。我们可以稍加修改或不作修改就能很容易地把它用在另一个不同的工程中。此外，此 portlet 的设计完美重现了表现与逻辑分离的思想。虽然我们在前面的部分中没有提到这一点，但此实践在一个典型的 Yii 应用中几乎随处可见。

<div class="revision">$Id: portlet.menu.txt 1739 2010-01-22 15:20:03Z qiang.xue $</div>