基于需求分析,我们需要三个不同的 portlet (译者注:如果一开始不理解什么是 portlet 没关系,继续往下看就知道了。):“用户菜单” portlet,“标签云” portlet 和“最新评论” portlet 。我们将通过继承Yii提供的 CPortlet 小物件开发这三个 portlet。
在这一节中,我们将开发第一个具体的 portlet ——用户菜单 portlet,它显示一个只对已通过身份验证的用户可见的菜单。此菜单包含四个项目:
UserMenu
类 ¶我们创建一个用于表现用户菜单 portlet 逻辑的 UserMenu
类。此类保存在文件 /wwwroot/blog/protected/components/UserMenu.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 的主体内容。
提示: 注意,我们必须在首次使用之前通过调用
Yii::import()
显式包含CPortlet
类。这是因为CPortlet
是zii
工程的一部分。zii
工程是 Yii 的官方扩展库。出于性能的考虑,此工程中的类并未列入核心类。因此,我们必须在首次使用之前将其导入(import)。
userMenu
视图 ¶然后,我们创建 userMenu
视图,它保存在 /wwwroot/blog/protected/components/views/userMenu.php
:
<ul> <li> echo CHtml::link('Create New Post',array('post/create')); </li> <li> echo CHtml::link('Manage Posts',array('post/admin')); </li> <li> echo CHtml::link('Approve Comments',array('comment/index')) . ' (' . Comment::model()->pendingCommentCount . ')'; </li> <li> echo CHtml::link('Logout',array('site/logout')); </li> </ul>
信息: 默认情况下,小物件的视图文件应保存在包含小物件类文件的目录的
views
子目录中。文件名必须和视图名称相同。
UserMenu
Portlet ¶是可以把我们新完成的 UserMenu
portlet 投入使用的时候了。我们把布局文件 /wwwroot/blog/protected/views/layouts/column2.php
修改如下:
...... <div id="sidebar"> if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); </div> ......
如上所示,我们调用了 widget()
方法创建并执行了 UserMenu
类的实例。由于此 portlet 只应显示给已通过身份验证的用户,我们只在当前用户的 isGuest
属性为 false 时(即用户未登录时)调用 widget()
方法。
UserMenu
Portlet ¶让我们来测试一下所作的工作:
http://www.example.com/blog/index.php
。 核实页面中的侧边栏中没有任何东西显示。Login
超链接,填写登录表单登录,如果登录成功,核实 UserMenu
portlet 显示在了侧边栏中,且其标题为当前用户名。UserMenu
portlet 中的 'Logout' ,核实注销成功且 UserMenu
portlet 已消失。我们创建的是一个 portlet, 它是高度可复用的。我们可以稍加修改或不作修改就能很容易地把它用在另一个不同的工程中。此外,此 portlet 的设计完美重现了表现与逻辑分离的思想。虽然我们在前面的部分中没有提到这一点,但此实践在一个典型的 Yii 应用中几乎随处可见。
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.