Yii: Транслитерация URL-адреса (автоматическое создание псевдонима для url из заголовка)
Взял за основу расширение из yiiext (translit-filter), но добавил преобразование всех символов в нижний регистр и поменял некоторые замены.
1) Создаём в protected/extensions новый файл LocoTranslitFilter.php с содержимым
<?php /** * ETranslitFilter class file reworked to Loco version: LocoTranslitFilter. * * @author Veaceslav Medvedev <slavcopost@gmail.com> then almix * @link http://code.google.com/p/yiiext/ * @license http://www.opensource.org/licenses/mit-license.php */ class LocoTranslitFilter extends CValidator { /** * @var string the name of the attribute to be translit. */ public $translitAttribute; /** * @var boolean whether to translit value only when the attribute value is null or empty string. * Defaults to true. If false, the attribute will always be translit. */ public $setOnEmpty=true; /** * Validates the attribute of the object. * @param CModel $object the object being validated * @param string $attribute the attribute being validated */ protected function validateAttribute($object,$attribute) { if($this->setOnEmpty && !$this->isEmpty($object->$attribute)) return; if(!$object->hasAttribute($this->translitAttribute)) throw new CException(Yii::t('yiiext','Active record "{class}" is trying to select an invalid column "{column}". Note, the column must exist in the table or be an expression with alias.', array('{class}'=>get_class($object),'{column}'=>$this->translitAttribute))); $object->$attribute=self::cyrillicToLatin($object->getAttribute($this->translitAttribute)); } /** * Translit text from cyrillic to latin letters. * @static * @param string $text the text being translit. * @return string */ protected static function cyrillicToLatin($text, $toLowCase = TRUE) { $matrix=array( "й"=>"i","ц"=>"c","у"=>"u","к"=>"k","е"=>"e","н"=>"n", "г"=>"g","ш"=>"sh","щ"=>"shch","з"=>"z","х"=>"h","ъ"=>"", "ф"=>"f","ы"=>"y","в"=>"v","а"=>"a","п"=>"p","р"=>"r", "о"=>"o","л"=>"l","д"=>"d","ж"=>"zh","э"=>"e","ё"=>"e", "я"=>"ya","ч"=>"ch","с"=>"s","м"=>"m","и"=>"i","т"=>"t", "ь"=>"","б"=>"b","ю"=>"yu", "Й"=>"I","Ц"=>"C","У"=>"U","К"=>"K","Е"=>"E","Н"=>"N", "Г"=>"G","Ш"=>"SH","Щ"=>"SHCH","З"=>"Z","Х"=>"X","Ъ"=>"", "Ф"=>"F","Ы"=>"Y","В"=>"V","А"=>"A","П"=>"P","Р"=>"R", "О"=>"O","Л"=>"L","Д"=>"D","Ж"=>"ZH","Э"=>"E","Ё"=>"E", "Я"=>"YA","Ч"=>"CH","С"=>"S","М"=>"M","И"=>"I","Т"=>"T", "Ь"=>"","Б"=>"B","Ю"=>"YU", "«"=>"","»"=>""," "=>"-", "\""=>"", "\."=>"", "–"=>"-", "\,"=>"", "\("=>"", "\)"=>"", "\?"=>"", "\!"=>"", "\:"=>"", '#' => '', '№' => '',' - '=>'-', '/'=>'-', ' '=>'-', ); // Enforce the maximum component length $maxlength = 100; $text = implode(array_slice(explode('<br>',wordwrap(trim(strip_tags(html_entity_decode($text))),$maxlength,'<br>',false)),0,1)); //$text = substr(, 0, $maxlength); foreach($matrix as $from=>$to) $text=mb_eregi_replace($from,$to,$text); // Optionally convert to lower case. if ($toLowCase) { $text = strtolower($text); } return $text; } }
2) Добавляем правило для псевдонима (тут – alias) в массиве rules() в нужной модели
array('alias','ext.LocoTranslitFilter','translitAttribute'=>'title'),
В переменной translitAttribute указываем поле в таблице (атрибут в модели), который будет транслитерироваться. Таким образом при создании или редактировании формы будет происходить транслитерация заголовка для url-адреса в 'alias'.
Кроме того в функции validateAttribute есть проверка, заполнено ли поле псевдонима уже или пустое, и в случае если уже заполнено, то не выполнять транслитерацию. Это полезно, если вы хотите вручную прописать псевдоним. Так он при повторном редактировании не перезапишется.
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)
7 комментариев
Здравствуйте. Сделал все как написано в статье но в итоге получаю ошибку "Не определено свойство "LocoTranslitFilter.title"."
После создания LocoTranslitFilter.php в файле модели (Awards.php) в rules() я дописал такую строку:
array('alias','ext.LocoTranslitFilter','title'=>'alias'),
alias - это поле в бд и лейбл поля. title это поле которое будет транслетерироваться в поле alias. Подскажите в чем проблема. Уже намучался с ней.
надо оставить - array('alias','ext.LocoTranslitFilter','translitAttribute'=>'title'), translitAttribute = это параметр, то есть имя переменной из созданного нами расширения LocoTranslitFilter, не заменяйте её на title!
Да есть поле title и alias, вставляю строку как то так
public function rules()
{
return array(
array('alias','ext.LocoTranslitFilter','translitAttribute'=>'title'),
array('title, alias', 'length', 'max'=>255),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, title, alias', 'safe', 'on'=>'search'),
);
}
не работает .