Blame view

common/behaviors/Slug.php 3.77 KB
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
          

      }