Как отображать статичные страницы в Yii?

15 августа 2011

Данная заметка является вольным переводом вики-статьи How to display static pages in Yii.

В веб приложениях нам часто нужно создавать такие страницы, как «Об этом сайте» или «Правовая информация», содержимое которых по большей части статичное. Существует несколько подходов.

  • Можно хранить такие страницы в виде простых отдельных HTML файлов. Веб сервер будет отправлять такие страницы напрямую конечным пользователям минуя PHP. Недостаток данного подхода заключается в том, что в этом случае поддержка общего шаблона и кода между такими статичными и другими динамическими страницами сайта очень сильно усложняется.

  • Другим способом решения проблемы является написание новых экшнов контроллера, соответствующих каждой новой странице. Это решает проблему с общим шаблоном, однако процесс сводится к рутине: каждый раз мы должны писать новый экшн для каждой страницы, который ничего, кроме вывода шаблона и не делает (противоречие принципу DRY).

  • Мы можем воспользоваться стандартным классом фреймворка CViewAction для создания таких страниц. Данная заметка описывает именно этот подход.

Для начала в контроллере по умолчанию SiteController (или в любом другом контроллере, который вам нужен) переопределите метод actions():

public function actions()
{
    return array(
        'page'=>array(
            'class'=>'CViewAction',
        ),
    );
}

Код выше определяет внешний экшн page у текущего контроллера, классом которого является CViewAction. Добавление внешних экшнов контроллеров описано в руководстве.

Затем создайте директорию protected/views/site/pages.

Ну и наконец создайте для каждой статической страницы PHP файл в этой директории. Например, страницу «Об этом сайте» мы можем сохранить как about.php. Имейте ввиду, что такие страницы будут использовать шаблон по умолчанию самого приложения. Поэтому в каждом файле нужно сохранять только основное содержимое страницы.

Мы закончили! Наша страница about должна быть доступна данной ссылке:

http://www.example.com/index.php?r=site/page&view=about

Для того, чтобы украсить ссылку можно воспользоваться подходом, описанным в руководстве.

Если у нас имеется множество страниц, то мы можем разместить их в под-директориях в protected/views/site/pages. Страница, которая расположена на диске в директории protected/views/site/pages/help/contact.php будет доступна по ссылке:

http://www.example.com/index.php?r=site/page&view=help.contact

Если CViewAction работает не так, как вам нужно, то его поведение можно изменить. Более подробно класс CViewAction описан в документации по API фреймворка.


John Sergeyev

№ 3

John Sergeyev

1 сентября 2011, 20:48

ОЛололололололо
resurtm

№ 4

resurtm

1 сентября 2011, 21:44

Чего не так? :-)
SpiLLeR

№ 5

SpiLLeR

6 сентября 2011, 15:56

А есть RSS канал?
resurtm

№ 6

resurtm

6 сентября 2011, 19:54

Пока нет, но RSS будет на днях буквально. Далеко не убегайте. :-)
webadver

№ 1860

webadver

7 февраля 2012, 23:19

а не подскажите ли, нету ли случайно решения которое позволит в админке редактировать такой тип страниц, а не каждый раз редактор метаться.
Заранее спасибо
resurtm

№ 1861

resurtm

8 февраля 2012, 12:36

Ну такой тип точно нет, если разве что поискать/разработать браузерный редактор файлов.

Тут лучше подойдет хранение в базе и работа с данными через AR-модель.
Андрей

№ 3369

Андрей

22 ноября 2012, 07:06

Сказать честно считаю это бредом - хочешь вывести целиком стр. со своим хЭдЭром и т.д. ? юзай renderPartial - для какого-то метода и все.

Кто не понял пример.

Создаешь таблицу - с полями (id,title,html_document)

Генерируем с помощью GII CRUD, и в методе actionView()
заменяем $this->render на $this->renderPartial, а view.php файл - убераем все и оставляем только echo $model->html_document


Люди зачем вы изобретаете колеса ?