Такие особенности как "новые комментарии", "облако тэгов" лучше реализовывать как портлеты. Портлет - подключаемый компонент пользовательского интерфейса, который рендерит фрагмент HTML-кода. В этом разделе мы описываем, как установить архитектуру портлета для нашего блога.
Основываясь на анализе требований, нам нужно четыре различных портлета: портлет "входа", портлет "пользовательское меню", портлет "облако тэгов" и портлет "недавние комментарии". Эти портлеты будут помещены в сайдбар каждой страницы.
Portlet
¶Мы определяем класс Portlet
, служащий базовым классом для всех наших
портлетов. Базовый класс содержит общие свойства и методы, используемые всеми
портлетами. Например, свойство title
, которое хранит заголовок портлета;
метод, определяющий, как украсить портлет цветным фоном.
Следующий код показывает определение базового класса Portlet
. Поскольку
портлет часто содержит и логику и представление, мы определяем класс Portlet
,
расширяя класс CWidget, что означает, что портлет - это
виджет и может быть внедрен в представление
методом widget().
class Portlet extends CWidget
{
public $title; // заголовок портлета
public $visible=true; // виден ли портлет
// ...другие свойства...
public function init()
{
if($this->visible)
{
// отрендерить начало блока портлета
// отрендерить заголовок портлета
}
}
public function run()
{
if($this->visible)
{
$this->renderContent();
// отрендерить конец блока портлета
}
}
protected function renderContent()
{
// потомки класса должны переопределять этот метод
// для рендера необходимого содержимого портлета
}
}
В коде выше, методы init()
и run()
требуются классом CWidget и вызываются
автоматически, когда виджет рендерится в представлении. Потомки классаPortlet
главным образом должны переопределить метод renderContent()
для генерации
содержимого портлета.
Пришло время скорректировать макет страницы так, чтобы мы могли поместить
портлеты в сайдбар. Макет страницы определяется исключительно файлом
представления макета /wwwroot/blog/protected/views/layouts/main.php
. Он
рендерит общие разделы (например, хидер, футер) различных страниц и включает в
соответствующем месте динамическое содержимое, сгенерированное отдельными
действиями представлений.
Наше приложение блога будет использовать следующий макет:
<html> <head> ...... echo CHtml::cssFile(Yii::app()->baseUrl.'/css/main.css'); <title> echo $this->pageTitle; </title> </head> <body> ...header... <div id="sidebar"> ...список портлетов... </div> <div id="content"> echo $content; </div> ...footer... </body> </html>
Помимо настройки файла представления макета, мы также должны скорректировать
CSS-файл /wwwroot/blog/css/main.css
так, чтобы общий вид блога был бы похож
на то, что мы видим в демонстрационной версии блога.
Мы не будем подробно описывать это здесь.
Signup or Login in order to comment.