Blame view

frontend/widgets/Seo.php 9.7 KB
3f2bc3d0   Administrator   first commit
1
2
  <?php
  namespace frontend\widgets;
e21450c9   Dmytry Fedorchuk   SEO
3
  
3f2bc3d0   Administrator   first commit
4
  use common\models\SeoDynamic;
1f3add0a   Dmytry Fedorchuk   All seo
5
6
  
  use common\modules\product\models\Brand;
466144f8   Administrator   20.07.16
7
  use common\modules\rubrication\models\TaxGroup;
1f3add0a   Dmytry Fedorchuk   All seo
8
  use common\modules\rubrication\models\TaxOption;
3f2bc3d0   Administrator   first commit
9
  use yii\base\Widget;
466144f8   Administrator   20.07.16
10
  use yii\helpers\ArrayHelper;
3f2bc3d0   Administrator   first commit
11
12
13
14
15
  use yii\helpers\Html;
  
  class Seo extends Widget
  {
      private $url;
e21450c9   Dmytry Fedorchuk   SEO
16
17
18
      public $row;
      public $own_attr;
      public $fields;
1f3add0a   Dmytry Fedorchuk   All seo
19
      public $category_name;
3f2bc3d0   Administrator   first commit
20
21
      public $description;
      public $title;
0d0c080c   Dmytry Fedorchuk   seo module filter...
22
      public $meta;
3f2bc3d0   Administrator   first commit
23
24
25
      public $seo_text;
      public $h1;
      public $key;
1f3add0a   Dmytry Fedorchuk   All seo
26
      public $name;
3f2bc3d0   Administrator   first commit
27
      public $project_name;
1b898c16   Administrator   20.07.16
28
29
      protected static $check_url;
      protected static $check_url_bool;
7d20bafe   Dmytry Fedorchuk   htacess www
30
31
  
  
3f2bc3d0   Administrator   first commit
32
33
      const SEO_TEXT = 'seo_text';
      const DESCRIPTION = 'description';
0d0c080c   Dmytry Fedorchuk   seo module filter...
34
      const META = 'meta';
3f2bc3d0   Administrator   first commit
35
36
37
      const H1 = 'h1';
      const TITLE = 'title';
  
e21450c9   Dmytry Fedorchuk   SEO
38
39
40
41
      public function init()
      {
          $this->url = \Yii::$app->request->url;
          $this->project_name = \Yii::$app->name;
3f2bc3d0   Administrator   first commit
42
43
44
45
46
47
48
49
50
          parent::init();
  
      }
  
  
      public function run()
      {
  
          $seoData = $this->getViewData();
e21450c9   Dmytry Fedorchuk   SEO
51
          foreach ($seoData as $key => $value) {
3f2bc3d0   Administrator   first commit
52
53
              $this->$key = $value;
          }
446efeeb   Dmytry Fedorchuk   SEO
54
   
3f2bc3d0   Administrator   first commit
55
56
57
  
          switch ($this->row) {
              case self::SEO_TEXT:
54330e07   Administrator   29.06.16
58
59
  
  
a4d63ed9   Administrator   20.07.16
60
                  $filter = \Yii::$app->request->get('filters', []);
54330e07   Administrator   29.06.16
61
62
63
64
65
66
67
68
69
                  $sort = \Yii::$app->request->get('sort', []);
                  $paginate = \Yii::$app->request->get('page', []);
  
                  if(empty($filter) && empty($sort) && empty($paginate) ){
  
                      return $this->selectSeoData(self::SEO_TEXT);
  
                  } else {
  
1b898c16   Administrator   20.07.16
70
                      $widgetData = static::findSeoByUrl($this->url);
54330e07   Administrator   29.06.16
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  
                      $result = '';
  
                      if ($widgetData instanceof \common\models\Seo) {
  
                          $result = $widgetData->{self::SEO_TEXT};
  
                      } else {
  
                          $widgetData = $this->findSeoByDynamic();
  
                          if ($widgetData instanceof SeoDynamic) {
  
                              $result = $widgetData->{self::SEO_TEXT};
  
                          }
  
                      }
  
                      return $this->replaceData($result);
                  }
  
3f2bc3d0   Administrator   first commit
93
94
95
  
                  break;
              case self::H1:
51774c5a   Dmytry Fedorchuk   Seo brand
96
  
a4d63ed9   Administrator   20.07.16
97
                  $filter = \Yii::$app->request->get('filters', []);
51774c5a   Dmytry Fedorchuk   Seo brand
98
99
100
  
  
  
4b4be5ea   Administrator   29.06.16
101
                  if (isset($filter['brands']) && count($filter['brands']) == 1) {
51774c5a   Dmytry Fedorchuk   Seo brand
102
  
4b4be5ea   Administrator   29.06.16
103
                      $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
51774c5a   Dmytry Fedorchuk   Seo brand
104
  
4b4be5ea   Administrator   29.06.16
105
                      if($this->selectSeoData(self::H1) == $this->category_name) {
51774c5a   Dmytry Fedorchuk   Seo brand
106
  
4b4be5ea   Administrator   29.06.16
107
108
                          return $this->selectSeoData(self::H1) . ' ' . $model->name;
                      }else {
d482cb6f   Administrator   29.06.16
109
  
4b4be5ea   Administrator   29.06.16
110
                          return $this->selectSeoData(self::H1);
9173c97b   Dmytry Fedorchuk   Seo naznach h1
111
  
4b4be5ea   Administrator   29.06.16
112
                      }
9173c97b   Dmytry Fedorchuk   Seo naznach h1
113
  
a4d63ed9   Administrator   20.07.16
114
                  } else  if (isset($filter["naznacenie"]) && count($filter["naznacenie"]) == 1) {
9173c97b   Dmytry Fedorchuk   Seo naznach h1
115
  
a4d63ed9   Administrator   20.07.16
116
                  $model = TaxOption::find()->where(['alias' => $filter["naznacenie"]])->one();
63e7825d   Administrator   29.06.16
117
118
119
120
121
122
123
124
125
                      if($this->selectSeoData(self::H1) == $this->category_name) {
  
                          return $this->selectSeoData(self::H1) . ' ' . $model->value->value;
                      }else {
  
                          return $this->selectSeoData(self::H1);
  
                      }
  
d482cb6f   Administrator   29.06.16
126
127
  
  
4b4be5ea   Administrator   29.06.16
128
129
130
                  } else {
                      return $this->selectSeoData(self::H1);
                  }
51774c5a   Dmytry Fedorchuk   Seo brand
131
                      break;
3f2bc3d0   Administrator   first commit
132
133
              case self::TITLE:
  
a4d63ed9   Administrator   20.07.16
134
                  $filter = \Yii::$app->request->get('filters', []);
1c02ab59   Administrator   29.06.16
135
  
3f2bc3d0   Administrator   first commit
136
137
138
  
                  $title = $this->selectSeoData(self::TITLE);
  
1c02ab59   Administrator   29.06.16
139
  
ac8ab861   Administrator   20.07.16
140
                  if(!empty($filter) && isset($this->fields['meta-title']) && $title == $this->fields['meta-title']) {
dc6809dc   Administrator   23.06.16
141
142
143
144
145
146
147
148
149
150
151
152
  
                      $array = [
                          'category' => $this->category_name
                      ];
  
  
                      if (isset($filter['brands']) && count($filter['brands']) == 1) {
                          $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
  
                          $array['brand'] = $model->name;
                      }
  
dc6809dc   Administrator   23.06.16
153
  
466144f8   Administrator   20.07.16
154
                      $optionsList = ArrayHelper::getColumn(TaxGroup::find()->where(['is_filter' => 'TRUE'])->all(),'alias');
dc6809dc   Administrator   23.06.16
155
156
  
  
466144f8   Administrator   20.07.16
157
                      foreach($optionsList as $optionList){
dc6809dc   Administrator   23.06.16
158
  
dc6809dc   Administrator   23.06.16
159
  
466144f8   Administrator   20.07.16
160
                          if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
dc6809dc   Administrator   23.06.16
161
  
466144f8   Administrator   20.07.16
162
163
164
165
166
                              $model = TaxOption::find()->where(['alias' =>$filter[$optionList]])->one();
                              $array[$optionList] = $model->value->value;
  
  
                          }
dc6809dc   Administrator   23.06.16
167
  
dc6809dc   Administrator   23.06.16
168
  
dc6809dc   Administrator   23.06.16
169
170
  
                      }
7f7c8e5e   Dmytry Fedorchuk   Seo brand
171
  
466144f8   Administrator   20.07.16
172
173
174
175
176
                      $title_string = $this->getTitleString($array);
  
                      if($title_string){
                          return $title_string;
                      }
dc6809dc   Administrator   23.06.16
177
  
466144f8   Administrator   20.07.16
178
179
180
                  }
  
                  if (!empty($title)) {
d482cb6f   Administrator   29.06.16
181
                      return $title;
7f7c8e5e   Dmytry Fedorchuk   Seo brand
182
                  } else  {
d482cb6f   Administrator   29.06.16
183
                      return $this->project_name;
1f3add0a   Dmytry Fedorchuk   All seo
184
                  }
1f3add0a   Dmytry Fedorchuk   All seo
185
  
3f2bc3d0   Administrator   first commit
186
187
188
189
                  break;
              case self::DESCRIPTION:
                  $description = $this->selectSeoData(self::DESCRIPTION);
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
190
                  if (!empty($description)) {
3f2bc3d0   Administrator   first commit
191
192
193
  
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
0d0c080c   Dmytry Fedorchuk   seo module filter...
194
                          'content' => $description
3f2bc3d0   Administrator   first commit
195
196
197
198
199
                      ]);
  
                  }
  
                  break;
0d0c080c   Dmytry Fedorchuk   seo module filter...
200
              case self::META:
e8923005   Administrator   29.06.16
201
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
202
203
                  $meta = $this->selectSeoData(self::META);
  
f5bc3759   Administrator   20.07.16
204
                  $filter = \Yii::$app->request->get('filters', []);
e21450c9   Dmytry Fedorchuk   SEO
205
                  $sort = \Yii::$app->request->get('sort', []);
0e51e661   Dmytry Fedorchuk   paginate seo
206
                  $paginate = \Yii::$app->request->get('page', []);
0d0c080c   Dmytry Fedorchuk   seo module filter...
207
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
208
  
9fae793b   Dmytry Fedorchuk   All seo
209
  
8afa1bf2   Administrator   29.06.16
210
                  if (!empty($meta)) {
9fae793b   Dmytry Fedorchuk   All seo
211
  
8afa1bf2   Administrator   29.06.16
212
213
214
215
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => $meta
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
216
  
8afa1bf2   Administrator   29.06.16
217
                  } else if(!empty($filter['special'])){
0d0c080c   Dmytry Fedorchuk   seo module filter...
218
  
8afa1bf2   Administrator   29.06.16
219
220
221
222
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
223
  
8afa1bf2   Administrator   29.06.16
224
225
                  } else if (
                      isset($filter['brands']) && count($filter['brands']) > 1
a4d63ed9   Administrator   20.07.16
226
227
228
                      || isset($filter["pol"]) && count($filter["pol"]) > 1
                      || isset($filter["naznacenie"]) && count($filter["naznacenie"]) > 1
                      || isset($filter["god"]) && count($filter["god"]) > 1
e8923005   Administrator   29.06.16
229
  
8afa1bf2   Administrator   29.06.16
230
231
232
233
234
235
236
                  ) {
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
  
                  } else if (
a4d63ed9   Administrator   20.07.16
237
238
                      isset($filter['brands']) && count($filter['brands']) <= 1 && isset($filter) && count($filter, COUNT_RECURSIVE) >= 4
                      || isset($filter) && count($filter, COUNT_RECURSIVE) > 4
8afa1bf2   Administrator   29.06.16
239
240
241
242
243
244
245
246
247
248
249
250
                      || !empty($sort) ||  !empty($paginate) || isset($filter['prices'])
                  ) {
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
                  } else {
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'index,follow'
                      ]);
e21450c9   Dmytry Fedorchuk   SEO
251
                  }
0d0c080c   Dmytry Fedorchuk   seo module filter...
252
253
  
  
e8923005   Administrator   29.06.16
254
255
  
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
256
                  break;
3f2bc3d0   Administrator   first commit
257
258
259
260
261
262
263
264
          }
  
  
      }
  
      protected function replaceData($str)
      {
  
e21450c9   Dmytry Fedorchuk   SEO
265
266
267
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
3f2bc3d0   Administrator   first commit
268
269
270
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
4495dea0   Administrator   проапдейтил роли
271
          return $str;
3f2bc3d0   Administrator   first commit
272
273
      }
  
1b898c16   Administrator   20.07.16
274
      protected static function findSeoByUrl($url)
3f2bc3d0   Administrator   first commit
275
      {
1b898c16   Administrator   20.07.16
276
277
278
279
280
          if(empty(self::$check_url_bool)){
              self::$check_url = \common\models\Seo::findOne(['url' => $url]);
              self::$check_url_bool = true;
          }
          return self::$check_url;
3f2bc3d0   Administrator   first commit
281
282
283
284
      }
  
      protected function findSeoByDynamic()
      {
1f3add0a   Dmytry Fedorchuk   All seo
285
286
287
288
289
290
  
          if(!empty($this->key)){
  
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id, 'key' => $this->key]);
          } else {
  
0f852b51   Administrator   29.06.16
291
  
1f3add0a   Dmytry Fedorchuk   All seo
292
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
3f2bc3d0   Administrator   first commit
293
          }
1f3add0a   Dmytry Fedorchuk   All seo
294
  
3f2bc3d0   Administrator   first commit
295
296
297
298
          return $query->one();
      }
  
  
466144f8   Administrator   20.07.16
299
300
301
302
303
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
  
e21450c9   Dmytry Fedorchuk   SEO
304
305
      protected function getViewData()
      {
3f2bc3d0   Administrator   first commit
306
          $params = $this->getView()->params;
e21450c9   Dmytry Fedorchuk   SEO
307
          if (isset($params['seo'])) {
3f2bc3d0   Administrator   first commit
308
309
310
311
312
313
              return $params['seo'];
          } else {
              return [];
          }
      }
  
e21450c9   Dmytry Fedorchuk   SEO
314
315
      protected function selectSeoData($param)
      {
3f2bc3d0   Administrator   first commit
316
317
          $result = '';
  
1b898c16   Administrator   20.07.16
318
          $widgetData = static::findSeoByUrl($this->url);
3f2bc3d0   Administrator   first commit
319
  
e21450c9   Dmytry Fedorchuk   SEO
320
          if ($widgetData instanceof \common\models\Seo) {
3f2bc3d0   Administrator   first commit
321
  
e21450c9   Dmytry Fedorchuk   SEO
322
              $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
323
  
e21450c9   Dmytry Fedorchuk   SEO
324
          } else if (!empty($this->$param)) {
3f2bc3d0   Administrator   first commit
325
326
  
              $result = $this->$param;
3f2bc3d0   Administrator   first commit
327
328
329
330
          } else {
  
              $widgetData = $this->findSeoByDynamic();
  
e21450c9   Dmytry Fedorchuk   SEO
331
              if ($widgetData instanceof SeoDynamic) {
3f2bc3d0   Administrator   first commit
332
  
e21450c9   Dmytry Fedorchuk   SEO
333
                  $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
334
335
336
337
338
339
340
341
342
  
              }
  
          }
  
          return $this->replaceData($result);
  
      }
  
1f3add0a   Dmytry Fedorchuk   All seo
343
      public function getTitleString($array){
466144f8   Administrator   20.07.16
344
345
346
347
348
349
350
351
  
          $template = SeoDynamic::find()->select('title')->where(['param' =>'filters'])->one();
          if($template instanceof SeoDynamic){
              foreach ($array as $field_name => $field_value) {
                  $template->title = str_replace('{' . $field_name . '}', mb_strtolower($field_value), $template->title);
              }
              $template =  preg_replace('/\{.[^\}]*\}\s/','',$template->title);
              return $template;
1f3add0a   Dmytry Fedorchuk   All seo
352
          }
466144f8   Administrator   20.07.16
353
354
  
          return false;
1f3add0a   Dmytry Fedorchuk   All seo
355
356
357
  
      }
  
3f2bc3d0   Administrator   first commit
358
359
  
  }