понедельник, 26 октября 2009 г.

Symfony: Doctrine slugify кириллица

/lib/Slugify.class.php
class SlugifyClass {
static function Slugify($title) {
$gost = array(
"Є"=>"EH","І"=>"I","і"=>"i","№"=>"#","є"=>"eh",
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
"Е"=>"E","Ё"=>"JO","Ж"=>"ZH",
"З"=>"Z","И"=>"I","Й"=>"JJ","К"=>"K","Л"=>"L",
"М"=>"M","Н"=>"N","О"=>"O","П"=>"P","Р"=>"R",
"С"=>"S","Т"=>"T","У"=>"U","Ф"=>"F","Х"=>"KH",
"Ц"=>"C","Ч"=>"CH","Ш"=>"SH","Щ"=>"SHH","Ъ"=>"'",
"Ы"=>"Y","Ь"=>"","Э"=>"EH","Ю"=>"YU","Я"=>"YA",
"а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
"е"=>"e","ё"=>"jo","ж"=>"zh",
"з"=>"z","и"=>"i","й"=>"jj","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"kh",
"ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"",
"ы"=>"y","ь"=>"","э"=>"eh","ю"=>"yu","я"=>"ya","«"=>"","»"=>"","—"=>"-"," "=>"-"
);

$iso = array(
"Є"=>"YE","І"=>"I","Ѓ"=>"G","і"=>"i","№"=>"#","є"=>"ye","ѓ"=>"g",
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
"Е"=>"E","Ё"=>"YO","Ж"=>"ZH",
"З"=>"Z","И"=>"I","Й"=>"J","К"=>"K","Л"=>"L",
"М"=>"M","Н"=>"N","О"=>"O","П"=>"P","Р"=>"R",
"С"=>"S","Т"=>"T","У"=>"U","Ф"=>"F","Х"=>"X",
"Ц"=>"C","Ч"=>"CH","Ш"=>"SH","Щ"=>"SHH","Ъ"=>"'",
"Ы"=>"Y","Ь"=>"","Э"=>"E","Ю"=>"YU","Я"=>"YA",
"а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
"е"=>"e","ё"=>"yo","ж"=>"zh",
"з"=>"z","и"=>"i","й"=>"j","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
"ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"",
"ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya","«"=>"","»"=>"","—"=>"-"," "=>"-"
);

$rtl_standard = sfConfig::get('rtl_standard', 'gost') ;

//to lower case

$name = mb_strtolower($name, 'UTF-8');

switch ($rtl_standard) {
case 'off':
return $title;
case 'gost':
return trim(strtr($title, $gost), '-');
default:
return trim(strtr($title, $iso), '-');
}
}
}


Использование

Post:
actAs:
Timestampable: ~
Taggable: ~
Sluggable:
unique: true
fields: [title]
canUpdate: true
builder: [SlugifyClass, Slugify]

5 коммент.:

elch комментирует...

Я бы еще убрал спецсимволы, вообщем-то все кроме a-z0-9_- .
Кусок схемы - это для doctrine?

Vit228 комментирует...

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

Denis комментирует...

Может вы мне поможите? Создал схму на доктрине, пытаюсь заполнить из fixtures (symfony 1.2.9), пишет:

Notice: iconv_strlen(): Detected an illegal character in input string...

SQLSTATE[HY000]: General error: 1366 Incorrect string value: ...

Причем для тех колонок где на русском данные. В базе кодировка cp1251.

Григорий комментирует...

у меня тоже была такая ошибка когда хотел добавить slug ... поэтому пока отложил ... но решение хотелсь бы видеть

Vit228 комментирует...

небольшая поправка.
$name = mb_strtolower($name, 'UTF-8');