SluggableBehavior — помощник в создании ЧПУ

После выхода стабильной версии CakePHP количество постов в разных блогах, посвященных этому фреймворку, сократилось. Даже в Bakery тишина. Либо Рождество с Новым годом, либо все, засучив рукава, занялись разработкой.

В помощь неутомимым пекарям я решил рассказать об удобном расширении модели (behavior). Вещь, на мой взгляд, полезная. Работает отлично, я этим behavior пользуюсь уже почти год. Он помогает автоматически, при записи, сгенерировать slug для строки таблицы.

Вот, кстати, мне всегда было интересно, как правильно перевести на русский слово slug в этом контексте. Ярлык?

Этот behavior написал Mariano Iglesias. Это часть его проекта Cake Syrup. О другой интересной составляющей, SoftDeletableBehavior, недавно, кстати, можно прочесть здесь.

Это расширение не использует Inflector::slug() — когда оно создавалось, этого метода еще не было. Зато поддержка транслита русских букв в UTF-8 уже встроена, не без помощи Вашего покорного слуги. ;-)

Работает расширение очень просто — при сохранении записи выбранное поле, по умолчанию ‘title’, преобразуется в slug и это значение присваивается соответствующему полю БД (по умолчанию ‘slug’). Т.е. заголовок записи «Моя первая запись» автомагически превращается в «moja-pervaja-zapis». После этого можно формировать ссылки вида ‘/controller/action/my-slug’ а в соответствующем методе контроллера искать запись:

Подключатся behavior, как и все остальные, в классе модели:

Кроме того есть несколько полезных настроек, их можно передать в виде ассоциативного массива параметров при подключении:

Настойки могут быть такие:

  • label — строка или массив. Здесь перечисляются поля, из содержимого которых нужно генерировать slug. Например если указать поля ‘author’ и ‘book_name’, то из массива array(‘author’=>’Абрамов’, ‘book_name’=>’Опознай живого’) получится slug ‘abramov-opoznay-zhivogo’. Указанные элементы массива не обязательно должны быть столбцами таблицы базы данных. Если такого столбца в таблице нет (например нету author), то не страшно — надо лишь следующему параметру, real, установить значение false. По-умолчанию параметр label равен ‘title’
  • real — логическое значение, true или false. По-умолчанию true. Как я уже написал, если этот параметр установить в false, то элемент массива, по содержимому которого (или которых) будет создаваться slug, не обязательно должен сответствовать названию столбца в таблице БД.
  • slug — имя столбца БД, в который будет записан результат работы behavior. По-умолчанию — ‘slug’
  • separator — строка. Это разделитель для слов, на который будут заменяться пробелы. по умолчанию ‘-‘ (тире).
  • length — целое число, максимальная длина поля slug. По-умолчанию 100 символов.
  • overwrite — логическое значение, по-умолчанию false. Этот параметр позволяет указать, что при обновлении существующей записи в БД slug надо сгенерировать заново и перезаписать.

Без доработок дело не обошлось. Дело в том, что behavior для новой записи порывается создать slug в обязательном порядке, а мне хотелось бы чтоб он срабатывал только в случае, если это поле не указано. Иногда вручную получается лучше. Например заголовок «Мой сайт» будет преобразован в «moy-sayt», а хотелось бы «my-site». Поэтому я добавил проверку на наличие элемента массива. Теперь если при создании новой записи явно указать slug вручную, ничего автоматически пересоздаваться не будет, только, на всякий случай, slug проверится на уникальность.

Скачать SluggableBehavior можно со страницы проекта CakeSyrup.

А здесь маленький патч, который я описал парой строк выше.

Автор

Сергей Родовниченко

Родился, учился, работал и все такое. Занимаюсь поддержкой сайтов на Shop-Script, Joomla, Wordpress, Prestashop. А также на самописных движках на базе CakePHP.

7 thoughts on “SluggableBehavior — помощник в создании ЧПУ”

  1. Кодировка в базе не играет роли. Оно до записи в базу все это обрабатывает.

    http://www.handmadesite.net/wp-content/uploads/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *