Yii - использование фильтров

30.08.2011

За, практически уже прошлое, лето я получил массу опыта в программировании на Yii. Сейчас работаю над большим проектом, бета-релиз которого намечен на январь следующего года. Пока не буду говорить что это за проект, но в процессе программирования передо мной возникали разные задачи: некоторые простые, некоторые сложнее, но с ними я сталкивался впервые и поэтому даже над простыми задачами приходилось подумать или что-то новое узнать.

Сегодня готовил план статей в блог и оказалось, что есть о чем сказать ещё на полтора месяца, как минимум. Старался использовать исключительно практическую сторону дела, с минимумом теории, и если и есть какая-то теория, то внизу статей.

Итак, эта статья вводная об использовании фильтров в yii framework.

Недавно у меня возникла необходимость написания фильтра для выбора макета представления в зависимости от того используется ли субдомен в адресе сайта или нет.

Алгорит простой - если в адресе есть субдомен, то меняем свойство контроллера $layout на то, которое нам нужно.

В корневой директории приложения создаем папку filters и в ней файл LayoutFilter.php со следующим содержимым:

class LayoutFilter extends CFilter {
    public function preFilter($filterChain) {
        $sdn = explode('.', $_SERVER['HTTP_HOST']);
        if (count($sdn) == 3)
            Yii::app()->controller->layout = '//layouts/subscribe';
        else
            Yii::app()->controller->layout = '//layouts/column1';
        return true;
    }
    public function postFilter($filterChain) {}
}

Из кода выше видно что мы всего лишь проверяем состоит ли доменное имя сайта из 3 слов и если да - меняем макет представления контроллера на тот, который нам нужен - //layouts/subscribe.

Теперь просто подключим этот фильтр к нужному контроллеру:

public function filters() {
        return array(
            array('application.filters.LayoutFilter')
        );
}

Для более подробной информации по фильтрам обращайтесь к руководству: http://www.yiiframework.com/doc/guide/1.1/ru/basics.controller#sec-5

blog comments powered by Disqus
Наверх