d8c1a2e0
Yarik
Big commit artbox
|
1
|
<?php
|
93c267f7
Yarik
Multilanguage big...
|
2
3
4
5
6
7
8
9
10
|
namespace common\behaviors;
use yii;
use yii\base\Behavior;
use yii\db\ActiveRecord;
use dosamigos\transliterator\TransliteratorHelper;
class Slug extends Behavior
|
d8c1a2e0
Yarik
Big commit artbox
|
11
|
{
|
93c267f7
Yarik
Multilanguage big...
|
12
|
|
5c2eb7c8
Yarik
Big commit almost...
|
13
14
15
|
/**
* @var string
*/
|
8af13427
Yarik
For leha commit.
|
16
|
public $inAttribute = 'title';
|
93c267f7
Yarik
Multilanguage big...
|
17
|
|
5c2eb7c8
Yarik
Big commit almost...
|
18
19
20
|
/**
* @var string
*/
|
8af13427
Yarik
For leha commit.
|
21
|
public $outAttribute = 'alias';
|
93c267f7
Yarik
Multilanguage big...
|
22
|
|
5c2eb7c8
Yarik
Big commit almost...
|
23
24
25
|
/**
* @var bool
*/
|
93c267f7
Yarik
Multilanguage big...
|
26
27
|
public $translit = true;
|
5c2eb7c8
Yarik
Big commit almost...
|
28
29
30
|
/**
* @inheritdoc
*/
|
93c267f7
Yarik
Multilanguage big...
|
31
32
33
34
35
36
37
38
|
public function events()
{
return [
ActiveRecord::EVENT_BEFORE_INSERT => 'getSlug',
ActiveRecord::EVENT_BEFORE_UPDATE => 'getSlug',
];
}
|
5c2eb7c8
Yarik
Big commit almost...
|
39
40
41
42
43
44
45
|
/**
* Generate slug
*
* @param yii\base\Event $event
*
* @return void
*/
|
93c267f7
Yarik
Multilanguage big...
|
46
47
|
public function getSlug($event)
{
|
8af13427
Yarik
For leha commit.
|
48
49
50
|
if(!empty( $this->owner->{$this->inAttribute} )) {
if(empty( $this->owner->{$this->outAttribute} )) {
$this->owner->{$this->outAttribute} = $this->generateSlug($this->owner->{$this->inAttribute});
|
93c267f7
Yarik
Multilanguage big...
|
51
|
} else {
|
8af13427
Yarik
For leha commit.
|
52
|
$this->owner->{$this->outAttribute} = $this->generateSlug($this->owner->{$this->outAttribute});
|
93c267f7
Yarik
Multilanguage big...
|
53
54
|
}
}
|
93c267f7
Yarik
Multilanguage big...
|
55
56
|
}
|
5c2eb7c8
Yarik
Big commit almost...
|
57
58
59
60
61
|
/**
* @param string $slug
*
* @return string
*/
|
93c267f7
Yarik
Multilanguage big...
|
62
63
64
65
66
|
private function generateSlug($slug)
{
$slug = $this->slugify($slug);
if($this->checkUniqueSlug($slug)) {
return $slug;
|
d8c1a2e0
Yarik
Big commit artbox
|
67
|
} else {
|
93c267f7
Yarik
Multilanguage big...
|
68
69
70
|
for($suffix = 2; !$this->checkUniqueSlug($new_slug = $slug . '-' . $suffix); $suffix++) {
}
return $new_slug;
|
d8c1a2e0
Yarik
Big commit artbox
|
71
72
|
}
}
|
93c267f7
Yarik
Multilanguage big...
|
73
|
|
5c2eb7c8
Yarik
Big commit almost...
|
74
75
76
77
78
|
/**
* @param string $slug
*
* @return string
*/
|
93c267f7
Yarik
Multilanguage big...
|
79
80
81
82
83
84
85
|
private function slugify($slug)
{
if($this->translit) {
return yii\helpers\Inflector::slug(TransliteratorHelper::process($slug), '-', true);
} else {
return $this->slug($slug, '-', true);
}
|
d8c1a2e0
Yarik
Big commit artbox
|
86
|
}
|
93c267f7
Yarik
Multilanguage big...
|
87
|
|
5c2eb7c8
Yarik
Big commit almost...
|
88
89
90
91
92
93
94
|
/**
* @param string $string
* @param string $replacement
* @param bool $lowercase
*
* @return string
*/
|
93c267f7
Yarik
Multilanguage big...
|
95
96
97
98
99
|
private function slug($string, $replacement = '-', $lowercase = true)
{
$string = preg_replace('/[^\p{L}\p{Nd}]+/u', $replacement, $string);
$string = trim($string, $replacement);
return $lowercase ? strtolower($string) : $string;
|
d8c1a2e0
Yarik
Big commit artbox
|
100
|
}
|
93c267f7
Yarik
Multilanguage big...
|
101
|
|
5c2eb7c8
Yarik
Big commit almost...
|
102
103
104
105
106
107
108
|
/**
* Check whether current slug is unique
*
* @param string $slug
*
* @return bool
*/
|
93c267f7
Yarik
Multilanguage big...
|
109
110
|
private function checkUniqueSlug($slug)
{
|
72a992f5
Yarik
Import browser v1.0
|
111
112
113
114
|
/**
* @var ActiveRecord $owner
*/
$owner = $this->owner;
|
5c2eb7c8
Yarik
Big commit almost...
|
115
116
|
$query = $owner->find()
->where([
|
8af13427
Yarik
For leha commit.
|
117
|
$this->outAttribute => $slug,
|
5c2eb7c8
Yarik
Big commit almost...
|
118
|
]);
|
72a992f5
Yarik
Import browser v1.0
|
119
120
|
if(!$owner->isNewRecord) {
$pks = $owner->primaryKey();
|
5c2eb7c8
Yarik
Big commit almost...
|
121
122
|
if(!empty( $pks )) {
$pk_rules = [ 'and' ];
|
72a992f5
Yarik
Import browser v1.0
|
123
|
foreach($pks as $pk) {
|
5c2eb7c8
Yarik
Big commit almost...
|
124
|
$pk_rules[] = [ $pk => $owner->$pk ];
|
72a992f5
Yarik
Import browser v1.0
|
125
|
}
|
5c2eb7c8
Yarik
Big commit almost...
|
126
127
128
129
|
$query->andWhere([
'not',
$pk_rules,
]);
|
72a992f5
Yarik
Import browser v1.0
|
130
|
}
|
93c267f7
Yarik
Multilanguage big...
|
131
|
}
|
72a992f5
Yarik
Import browser v1.0
|
132
|
return !$query->exists();
|
d8c1a2e0
Yarik
Big commit artbox
|
133
|
}
|
93c267f7
Yarik
Multilanguage big...
|
134
135
|
}
|