像最新评论列表和tag列表等,用Portlet实现是个不错的选择。一个Portlet就是一个可插入的用户界面组件,显示为聚合的一段HTML片段。在本节中,我们讲述了如何为我们的blog应用。建立portlet构架
根据需求分析,我们需要四个不同的 portlet(为方便,以下翻译为模块)。分别是登陆,用户菜单,tag列表和最新评论。这些模块(portlet)会在每个页面的侧边栏显示。
建立portlet类
我们建立一个名字为portlet的类作为我们开发所有portlet的基类。该基类包含了所有portlet的公共属性和方法。比如定义一个tittle属性来描述每个Portlet的标题,比如定义了如何用深色背景的区块修饰模块。
下面的代码显示了portlet基类的定义,因为一个portlet往往包含逻辑处理和展示两个部分,我们让portlet继承自CWidget。这意味portlet作为一个widget,可以在用widget()方法在页面中插入。
- class Portlet extends CWidget
- {
- public $title; // the portlet title
- public $visible=true; // whether the portlet is visible
- // ...other properties...
- public function init()
- {
- if($this->visible)
- {
- // render the portlet starting frame
- // render the portlet title
- }
- }
- public function run()
- {
- if($this->visible)
- {
- $this->renderContent();
- // render the portlet ending frame
- }
- }
- protected function renderContent()
- {
- // child class should override this method
- // to render the actual body content
- }
- }
在上面代码中,init()和run()是CWidget必须实现的方法,当widget在视图文件中被显示时,他们会被自动调用。Portlet的子类主要重写renderContent() 方法的实现来生成真正的模块内容。
修改页面显示。
现在我们需要调整一下页面布局,以便我们把portlet放到侧边栏。布局页面由视图文件blog/protected/views/layouts/main.php中定义。它展示了不同页面公用的区块(比如顶部的header,底部的footer),并在适当的地方,嵌入由某个对应的方法和视图产生的动态内容
我们的blog应用的页面布局如下
- <html>
- <head>
- ......
- <?php echo CHtml::cssFile(Yii::app()->baseUrl.'/css/main.css'); ?>
- <title><?php echo $this->pageTitle; ?></title>
- </head>
- <body>
- ...header...
- <div id="sidebar">
- ...list of portlets...
- </div>
- <div id="content">
- <?php echo $content; ?>
- </div>
- ...footer...
- </body>
- </html>
除了修改页面的结构之外我们还需要修改blog/css/main.css处的css文件。以便整体的显示看起来像示例程序中那样,在此不做详细介绍。