Расширяем возможности sfWebResponse
Дополняем sfWebResponse новым функционалом. Делаем возможность дополнять заголовки страниц фрагментами и генерировать из этих них хлебные крошки.
Я не знаю как вам, а мне никогда не нравился момент установки всяких там <title>, <meta> в Symfony, наверное потому что я просто не решил где лучше это делать. Захотелось немного дополнить имеющийся ассортимент функций для этого дела, которые имеются в классе sfWebResponse и делать это в templates. Почему templates? Там часто ренденится блок breadcrump - быстрый доступ ко всем предшествующим страницам, а-ля путь следования по сайту. Пример с сайта blackcrystal.net :
Breadcrump: Старт → Проекты → Krediitbox
Заголовок страницы: BlackCrystal / Проекты / Krediitbox
Заметно, что breadcrump почти в точности повторяет заголовок, и эту похожесть хочется использовать. Возьмём код sfWebResponse, добавим функцию addTitle и кладём модифицированый файл в lib/response/sfWebResponse.class.php:
public function addTitle( $title , $escape = true )
{
$newtitle = $this->getTitle() . " / " . $title;
$this->setTitle( $newtitle, $escape );
}
На этом можно было бы закончить, но по мне так это грубый, неотёсаный вариант, на скору-руку сляпаный. Я делаю полноценную замену классу sfWebResponse, назовём файл lib/response/myWebResponse.class.php:
class myWebResponse extends sfWebResponse {
public function initialize(sfEventDispatcher $dispatcher, $options = array())
{
parent::initialize($dispatcher, $options);
$this->options['title_separator'] = isset($options['title_separator']) ? $options['title_separator'] : ' / ';
$this->options['title_add_where'] = isset($options['title_add_where']) ? $options['title_add_where'] : 'after';
}
public function addTitle( $title , $escape = true )
{
$separator = $this->options['title_separator'];
$newtitle = $this->options['title_add_where'] == 'after'
? $this->getTitle() . $separator . $title
: $title . $separator . $this->getTitle();
$this->setTitle( $newtitle, $escape );
return $title;
}
}
Теперь у нас есть возможность конфигурировать разделитель кусочков заголовка и порядок их складывания прямо в factories.yml. Пример файла apps/frontend/config/factories.yml:
all:
response:
class: myWebResponse
param:
title_separator: ' / '
title_add_where: after
Использую новый функционал я вот так. Файл apps/frontend/modules/mymodule/templates/indexSuccess.php:
<div class="breadcrump">
< ?php echo $sf_response->addTitle( 'BlackCrystal' ) ?>
< ?php echo link_to('Старт', '@homepage'); ?> →
< ?php echo link_to( $sf_response->addTitle('Проекты') , '@project_index');?> →
< ?php echo $sf_response->addTitle( $project ) ?>
</div>
Составить красивые заголовки для всех страниц не стоило особого труда благодаря более удобной работе с объектом response. Хотя, это не предел удобности и здесь есть ещё над чем поработать.
Я пишу эти примеры не для того чтобы показать лучший способ уставновки заголовков, нет, скорее наставить вас на направление, где вы сможете сделать это лучше чем я. Самое главное почувствовать гибкость фреймворка и начать его под себя изменять. Дерзайте!
