/
SluggableBehavior.php
83 lines (80 loc) · 2.79 KB
/
SluggableBehavior.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
/**
* Behavior for transliterate russian text to latin.
*
* Поведение для транслитерации кирилицы в латиницу. Я так считаю.
* Использовать так же как и оригинальное поведение. Класс унаследован от \yii\behaviors\SluggableBehavior
* просто переопределен метод generateSlug
*
* ```php
* use zabachok\behaviors\SluggableBehavior;
*
* public function behaviors()
* {
* return [
* [
* 'class' => SluggableBehavior::className(),
* 'attribute' => 'title',
* // 'slugAttribute' => 'slug',
* ],
* ];
* }
* ```
*
* @author Daniil Romanov <zabachok@zabachok.net>
*/
namespace zabachok\behaviors;
class SluggableBehavior extends \yii\behaviors\SluggableBehavior
{
public function translit($text)
{
$converter = array(
'а' =>'a', 'б' =>'b', 'в' =>'v',
'г' =>'g', 'д' =>'d', 'е' =>'e',
'ё' =>'e', 'ж' =>'zh', 'з' =>'z',
'и' =>'i', 'й' =>'y', 'к' =>'k',
'л' =>'l', 'м' =>'m', 'н' =>'n',
'о' =>'o', 'п' =>'p', 'р' =>'r',
'с' =>'s', 'т' =>'t', 'у' =>'u',
'ф' =>'f', 'х' =>'h', 'ц' =>'c',
'ч' =>'ch', 'ш' =>'sh', 'щ' =>'sch',
'ь' =>'', 'ы' =>'y', 'ъ' =>'',
'э' =>'e', 'ю' =>'yu', 'я' =>'ya',
'А' =>'A', 'Б' =>'B', 'В' =>'V',
'Г' =>'G', 'Д' =>'D', 'Е' =>'E',
'Ё' =>'E', 'Ж' =>'Zh', 'З' =>'Z',
'И' =>'I', 'Й' =>'Y', 'К' =>'K',
'Л' =>'L', 'М' =>'M', 'Н' =>'N',
'О' =>'O', 'П' =>'P', 'Р' =>'R',
'С' =>'S', 'Т' =>'T', 'У' =>'U',
'Ф' =>'F', 'Х' =>'H', 'Ц' =>'C',
'Ч' =>'Ch', 'Ш' =>'Sh', 'Щ' =>'Sch',
'Ь' =>'', 'Ы' =>'Y', 'Ъ' =>'',
'Э' =>'E', 'Ю' =>'Yu', 'Я' =>'Ya',
);
return strtr($text, $converter);
}
public function generateSlug($slugParts)
{
//Удаляем пробелы
$len = 0;
while(true)
{
$text = str_replace(' ', ' ', implode('-', $slugParts));
$newlen = strlen($text);
if($len == $newlen) break;
$len = $newlen;
}
$text = trim($text);
// переводим в транслит
$text = self::translit($text);
// в нижний регистр
$text = strtolower($text);
// пробел на тире
$converter = array(' '=>'-');
$text = strtr($text, $converter);
// удаляем все лишнее
$text = preg_replace('/[^a-z0-9_\-]/u', '', $text);
return $text;
}
}