Blame view

frontend/widgets/Seo.php 13 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
  use common\modules\product\models\Brand;
466144f8   Administrator   20.07.16
6
  use common\modules\rubrication\models\TaxGroup;
1f3add0a   Dmytry Fedorchuk   All seo
7
  use common\modules\rubrication\models\TaxOption;
3f2bc3d0   Administrator   first commit
8
  use yii\base\Widget;
466144f8   Administrator   20.07.16
9
  use yii\helpers\ArrayHelper;
3f2bc3d0   Administrator   first commit
10
11
12
13
  
  class Seo extends Widget
  {
      private $url;
e21450c9   Dmytry Fedorchuk   SEO
14
15
16
      public $row;
      public $own_attr;
      public $fields;
1f3add0a   Dmytry Fedorchuk   All seo
17
      public $category_name;
3f2bc3d0   Administrator   first commit
18
19
      public $description;
      public $title;
0d0c080c   Dmytry Fedorchuk   seo module filter...
20
      public $meta;
3f2bc3d0   Administrator   first commit
21
22
23
      public $seo_text;
      public $h1;
      public $key;
1f3add0a   Dmytry Fedorchuk   All seo
24
      public $name;
3f2bc3d0   Administrator   first commit
25
      public $project_name;
bdc6c84c   Administrator   14.09.16
26
      public static $optionsList;
1b898c16   Administrator   20.07.16
27
28
      protected static $check_url;
      protected static $check_url_bool;
7d20bafe   Dmytry Fedorchuk   htacess www
29
30
  
  
3f2bc3d0   Administrator   first commit
31
32
      const SEO_TEXT = 'seo_text';
      const DESCRIPTION = 'description';
0d0c080c   Dmytry Fedorchuk   seo module filter...
33
      const META = 'meta';
3f2bc3d0   Administrator   first commit
34
35
36
      const H1 = 'h1';
      const TITLE = 'title';
  
e21450c9   Dmytry Fedorchuk   SEO
37
38
39
40
      public function init()
      {
          $this->url = \Yii::$app->request->url;
          $this->project_name = \Yii::$app->name;
bdc6c84c   Administrator   14.09.16
41
42
43
44
          if(empty(self::$optionsList)){
              self::$optionsList = ArrayHelper::getColumn(TaxGroup::find()->where(['is_filter' => 'TRUE'])->all(),'alias');
          }
  
3f2bc3d0   Administrator   first commit
45
46
47
48
49
50
51
52
53
          parent::init();
  
      }
  
  
      public function run()
      {
  
          $seoData = $this->getViewData();
bdc6c84c   Administrator   14.09.16
54
55
  
  
e21450c9   Dmytry Fedorchuk   SEO
56
          foreach ($seoData as $key => $value) {
3f2bc3d0   Administrator   first commit
57
58
              $this->$key = $value;
          }
9fa9adf7   Administrator   14.09.16
59
  
3f2bc3d0   Administrator   first commit
60
  
de5a3910   Alex Savenko   seo h1 fix
61
          $priority = 0;
3f2bc3d0   Administrator   first commit
62
63
          switch ($this->row) {
              case self::SEO_TEXT:
54330e07   Administrator   29.06.16
64
65
  
  
a4d63ed9   Administrator   20.07.16
66
                  $filter = \Yii::$app->request->get('filters', []);
54330e07   Administrator   29.06.16
67
68
69
70
71
                  $sort = \Yii::$app->request->get('sort', []);
                  $paginate = \Yii::$app->request->get('page', []);
  
                  if(empty($filter) && empty($sort) && empty($paginate) ){
  
f703530f   Alex Savenko   seo h1 fix
72
                      return $this->selectSeoData(self::SEO_TEXT, $priority);
54330e07   Administrator   29.06.16
73
74
75
  
                  } else {
  
1b898c16   Administrator   20.07.16
76
                      $widgetData = static::findSeoByUrl($this->url);
54330e07   Administrator   29.06.16
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  
                      $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
99
100
101
  
                  break;
              case self::H1:
51774c5a   Dmytry Fedorchuk   Seo brand
102
  
b161c194   Administrator   14.09.16
103
                  $filter = \Yii::$app->request->get('filters', []);
3da72a43   Administrator   14.09.16
104
  
f703530f   Alex Savenko   seo h1 fix
105
                  $default = $this->selectSeoData(self::H1, $priority);
3da72a43   Administrator   14.09.16
106
  
9270bbe6   Alex Savenko   seo h1 fix
107
                  if (($default != $this->{self::H1}) || $priority == 1) {
3da72a43   Administrator   14.09.16
108
  
b161c194   Administrator   14.09.16
109
                      return $default;
9511ef18   Alex Savenko   seo h1 fix
110
111
112
113
114
115
116
117
118
119
120
  
  
                  } else if(!empty($filter) && !$this->checkFilter($filter)){
  
                      $array = $this->arrayBuilder($filter);
                      return $this->getNameString($array);
                  }
                  else {
  
                      return $default;
                  }
9fa9adf7   Administrator   14.09.16
121
                  break;
3f2bc3d0   Administrator   first commit
122
123
              case self::TITLE:
  
a4d63ed9   Administrator   20.07.16
124
                  $filter = \Yii::$app->request->get('filters', []);
1c02ab59   Administrator   29.06.16
125
  
3f2bc3d0   Administrator   first commit
126
  
f703530f   Alex Savenko   seo h1 fix
127
                  $title = $this->selectSeoData(self::TITLE, $priority);
3f2bc3d0   Administrator   first commit
128
  
1c02ab59   Administrator   29.06.16
129
  
ac8ab861   Administrator   20.07.16
130
                  if(!empty($filter) && isset($this->fields['meta-title']) && $title == $this->fields['meta-title']) {
dc6809dc   Administrator   23.06.16
131
132
133
134
135
136
137
138
  
                      $array = [
                          'category' => $this->category_name
                      ];
  
  
                      if (isset($filter['brands']) && count($filter['brands']) == 1) {
                          $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
38b2f003   Administrator   20.07.16
139
140
141
142
143
144
                          if(!$model instanceof Brand){
  
                              \Yii::$app->response->redirect(['/site/error'],404);
                          } else {
                              $array['brand'] = $model->name;
                          }
dc6809dc   Administrator   23.06.16
145
  
dc6809dc   Administrator   23.06.16
146
147
                      }
  
dc6809dc   Administrator   23.06.16
148
  
dc6809dc   Administrator   23.06.16
149
  
bdc6c84c   Administrator   14.09.16
150
                      foreach(self::$optionsList as $optionList){
dc6809dc   Administrator   23.06.16
151
  
dc6809dc   Administrator   23.06.16
152
  
466144f8   Administrator   20.07.16
153
                          if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
dc6809dc   Administrator   23.06.16
154
  
466144f8   Administrator   20.07.16
155
                              $model = TaxOption::find()->where(['alias' =>$filter[$optionList]])->one();
38b2f003   Administrator   20.07.16
156
157
158
159
160
161
162
                              if(!$model instanceof TaxOption){
  
                                  \Yii::$app->response->redirect(['site/error'],404);
                              } else {
                                  $array[$optionList] = $model->value->value;
                              }
  
466144f8   Administrator   20.07.16
163
164
165
  
  
                          }
dc6809dc   Administrator   23.06.16
166
  
dc6809dc   Administrator   23.06.16
167
  
dc6809dc   Administrator   23.06.16
168
169
  
                      }
7f7c8e5e   Dmytry Fedorchuk   Seo brand
170
  
466144f8   Administrator   20.07.16
171
172
173
                      $title_string = $this->getTitleString($array);
  
                      if($title_string){
d29a2cfa   Yarik   Seo fix
174
                          return $this->my_mb_ucfirst(trim($title_string));
466144f8   Administrator   20.07.16
175
                      }
dc6809dc   Administrator   23.06.16
176
  
466144f8   Administrator   20.07.16
177
178
179
                  }
  
                  if (!empty($title)) {
d482cb6f   Administrator   29.06.16
180
                      return $title;
7f7c8e5e   Dmytry Fedorchuk   Seo brand
181
                  } else  {
d482cb6f   Administrator   29.06.16
182
                      return $this->project_name;
1f3add0a   Dmytry Fedorchuk   All seo
183
                  }
1f3add0a   Dmytry Fedorchuk   All seo
184
  
3f2bc3d0   Administrator   first commit
185
186
                  break;
              case self::DESCRIPTION:
f703530f   Alex Savenko   seo h1 fix
187
                  $description = $this->selectSeoData(self::DESCRIPTION, $priority);
3f2bc3d0   Administrator   first commit
188
  
3f2bc3d0   Administrator   first commit
189
  
7d1462af   Administrator   14.09.16
190
191
192
193
                  $filter = \Yii::$app->request->get('filters', []);
  
                  if(!empty($filter) && $description == $this->{self::DESCRIPTION}){
                      $array = $this->arrayBuilder($filter);
3f2bc3d0   Administrator   first commit
194
195
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
7d1462af   Administrator   14.09.16
196
                          'content' => $this->getDescriptionString($array)
3f2bc3d0   Administrator   first commit
197
                      ]);
419a21c1   Administrator   14.09.16
198
                  }elseif (!empty($description)) {
9fa9adf7   Administrator   14.09.16
199
  
7d1462af   Administrator   14.09.16
200
201
202
203
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
                          'content' => $description
                      ]);
9fa9adf7   Administrator   14.09.16
204
  
3f2bc3d0   Administrator   first commit
205
206
207
                  }
  
                  break;
0d0c080c   Dmytry Fedorchuk   seo module filter...
208
              case self::META:
e8923005   Administrator   29.06.16
209
  
f703530f   Alex Savenko   seo h1 fix
210
                  $meta = $this->selectSeoData(self::META, $priority);
0d0c080c   Dmytry Fedorchuk   seo module filter...
211
  
f5bc3759   Administrator   20.07.16
212
                  $filter = \Yii::$app->request->get('filters', []);
e21450c9   Dmytry Fedorchuk   SEO
213
                  $sort = \Yii::$app->request->get('sort', []);
0e51e661   Dmytry Fedorchuk   paginate seo
214
                  $paginate = \Yii::$app->request->get('page', []);
04a908d9   Alex Savenko   get param "langua...
215
                  $language = \Yii::$app->request->get('language', []);
0d0c080c   Dmytry Fedorchuk   seo module filter...
216
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
217
  
64e48993   Administrator   14.09.16
218
  
9fa9adf7   Administrator   14.09.16
219
                  if (!empty($meta) && empty($sort) &&  empty($paginate) && !isset($filter['prices']) ) {
e57ad02f   Administrator   14.09.16
220
221
222
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
9fa9adf7   Administrator   14.09.16
223
                          'content' => $meta
e57ad02f   Administrator   14.09.16
224
225
                      ]);
  
9fa9adf7   Administrator   14.09.16
226
                  } else if(!empty($filter['special'])){
0d0c080c   Dmytry Fedorchuk   seo module filter...
227
  
8afa1bf2   Administrator   29.06.16
228
229
230
231
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
232
  
8afa1bf2   Administrator   29.06.16
233
                  } else if (
9fa9adf7   Administrator   14.09.16
234
235
                      isset($filter['brands']) && count($filter['brands']) > 1
                      || isset($filter)  && $this->checkFilter($filter)|| !empty($sort) ||  !empty($paginate) || isset($filter['prices'])
e8923005   Administrator   29.06.16
236
  
8afa1bf2   Administrator   29.06.16
237
                  ) {
9fa9adf7   Administrator   14.09.16
238
239
  
  
8afa1bf2   Administrator   29.06.16
240
241
242
243
244
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
  
9fa9adf7   Administrator   14.09.16
245
                  } else if ( isset($filter) && count($filter, COUNT_RECURSIVE) > 4) {
8afa1bf2   Administrator   29.06.16
246
247
248
249
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
9fa9adf7   Administrator   14.09.16
250
                  }
fc89c3de   Alex Savenko   get param "langua...
251
                  else if (isset($language) && $language == 'ua') {
1964a4cf   Alex Savenko   get param "langua...
252
253
254
255
256
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
                  }
9fa9adf7   Administrator   14.09.16
257
                  else {
8afa1bf2   Administrator   29.06.16
258
259
260
261
262
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'index,follow'
                      ]);
e21450c9   Dmytry Fedorchuk   SEO
263
                  }
0d0c080c   Dmytry Fedorchuk   seo module filter...
264
265
  
  
e8923005   Administrator   29.06.16
266
267
  
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
268
                  break;
3f2bc3d0   Administrator   first commit
269
270
271
272
273
          }
  
  
      }
  
bdc6c84c   Administrator   14.09.16
274
275
276
  
  
      protected function checkFilter($filter){
bdc6c84c   Administrator   14.09.16
277
278
          foreach(self::$optionsList as $optionList){
  
7b18ef88   Administrator   14.09.16
279
              if(isset($filter[$optionList]) && count($filter[$optionList])  > 1){
efa83867   Administrator   14.09.16
280
                  return true;
7b18ef88   Administrator   14.09.16
281
              }
bdc6c84c   Administrator   14.09.16
282
283
  
          }
efa83867   Administrator   14.09.16
284
          return false;
bdc6c84c   Administrator   14.09.16
285
286
      }
  
3f2bc3d0   Administrator   first commit
287
288
289
      protected function replaceData($str)
      {
  
e21450c9   Dmytry Fedorchuk   SEO
290
291
292
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
3f2bc3d0   Administrator   first commit
293
294
295
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
4495dea0   Administrator   проапдейтил роли
296
          return $str;
3f2bc3d0   Administrator   first commit
297
298
      }
  
1b898c16   Administrator   20.07.16
299
      protected static function findSeoByUrl($url)
3f2bc3d0   Administrator   first commit
300
      {
1b898c16   Administrator   20.07.16
301
302
303
304
305
          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
306
307
308
309
      }
  
      protected function findSeoByDynamic()
      {
1f3add0a   Dmytry Fedorchuk   All seo
310
311
312
313
314
315
  
          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
316
  
1f3add0a   Dmytry Fedorchuk   All seo
317
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
3f2bc3d0   Administrator   first commit
318
          }
1f3add0a   Dmytry Fedorchuk   All seo
319
  
3f2bc3d0   Administrator   first commit
320
321
322
          return $query->one();
      }
  
466144f8   Administrator   20.07.16
323
324
325
326
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
e21450c9   Dmytry Fedorchuk   SEO
327
328
      protected function getViewData()
      {
3f2bc3d0   Administrator   first commit
329
          $params = $this->getView()->params;
e21450c9   Dmytry Fedorchuk   SEO
330
          if (isset($params['seo'])) {
3f2bc3d0   Administrator   first commit
331
332
333
334
335
336
              return $params['seo'];
          } else {
              return [];
          }
      }
  
f703530f   Alex Savenko   seo h1 fix
337
      protected function selectSeoData($param, &$priority)
e21450c9   Dmytry Fedorchuk   SEO
338
      {
3f2bc3d0   Administrator   first commit
339
340
          $result = '';
  
1b898c16   Administrator   20.07.16
341
          $widgetData = static::findSeoByUrl($this->url);
9fa9adf7   Administrator   14.09.16
342
  
e21450c9   Dmytry Fedorchuk   SEO
343
          if ($widgetData instanceof \common\models\Seo) {
3f2bc3d0   Administrator   first commit
344
  
e21450c9   Dmytry Fedorchuk   SEO
345
              $result = $widgetData->$param;
9270bbe6   Alex Savenko   seo h1 fix
346
              $priority = 1;
3f2bc3d0   Administrator   first commit
347
  
e21450c9   Dmytry Fedorchuk   SEO
348
          } else if (!empty($this->$param)) {
9270bbe6   Alex Savenko   seo h1 fix
349
  
3f2bc3d0   Administrator   first commit
350
              $result = $this->$param;
9270bbe6   Alex Savenko   seo h1 fix
351
              $priority = 2;
9fa9adf7   Administrator   14.09.16
352
  
3f2bc3d0   Administrator   first commit
353
354
355
          } else {
  
              $widgetData = $this->findSeoByDynamic();
9fa9adf7   Administrator   14.09.16
356
  
e21450c9   Dmytry Fedorchuk   SEO
357
              if ($widgetData instanceof SeoDynamic) {
3f2bc3d0   Administrator   first commit
358
  
e21450c9   Dmytry Fedorchuk   SEO
359
                  $result = $widgetData->$param;
9270bbe6   Alex Savenko   seo h1 fix
360
                  $priority = 3;
3f2bc3d0   Administrator   first commit
361
362
363
364
365
  
              }
  
          }
  
bdc6c84c   Administrator   14.09.16
366
          return   $this->replaceData($result);
3f2bc3d0   Administrator   first commit
367
368
369
  
      }
  
1f3add0a   Dmytry Fedorchuk   All seo
370
      public function getTitleString($array){
466144f8   Administrator   20.07.16
371
372
373
374
375
376
377
378
  
          $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
379
          }
466144f8   Administrator   20.07.16
380
381
  
          return false;
1f3add0a   Dmytry Fedorchuk   All seo
382
383
  
      }
9fa9adf7   Administrator   14.09.16
384
  
d29a2cfa   Yarik   Seo fix
385
386
387
388
389
      public function my_mb_ucfirst($str) {
          $str = strtolower($str);
          $fc = mb_strtoupper(mb_substr($str, 0, 1));
          return $fc.mb_substr($str, 1);
      }
3f2bc3d0   Administrator   first commit
390
  
9fa9adf7   Administrator   14.09.16
391
392
393
394
395
396
397
398
      public function getDescriptionString($array){
          // "{Название раздела | Название блока фильтра: Фильтр 1 | Название блока фильтра: Фильтр 2 | Название блока фильтра: Фильтр 3}. по самой лучшей цене с гарантией от производителя - Ruzkachok.com.ua";
          $row = '';
          foreach($array as $name => $field){
  
              if($name == 'category' ){
                  $row = $field.' '.$row;
              } else {
16688be2   Administrator   14.09.16
399
                  $row .= $field['value'].' '  ;
9fa9adf7   Administrator   14.09.16
400
401
402
403
404
              }
  
  
  
          }
9fa9adf7   Administrator   14.09.16
405
406
407
408
409
          $row .= " по самой лучшей цене с гарантией от производителя - Ruzkachok.com.ua";
          return $row;
  
      }
  
9fa9adf7   Administrator   14.09.16
410
411
412
413
414
415
416
      public function getNameString($array){
          $row = '';
          foreach($array as $name => $field){
  
              if($name == 'category' ){
                  $row = $field.' '.$row;
              } else {
b161c194   Administrator   14.09.16
417
                  $row .= $field['value'].' '  ;
9fa9adf7   Administrator   14.09.16
418
419
420
421
422
              }
  
  
  
          }
b161c194   Administrator   14.09.16
423
  
9fa9adf7   Administrator   14.09.16
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
          return $row;
  
      }
  
      public function arrayBuilder($filter)
      {
  
          $array = [
              'category' => $this->category_name
          ];
  
  
          if (isset($filter['brands']) && count($filter['brands']) == 1) {
              $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
              if (!$model instanceof Brand) {
  
                  \Yii::$app->response->redirect(['/site/error'], 404);
              } else {
                  $array['brand']['name'] = 'Бренд';
                  $array['brand']['value'] = $model->name;
              }
  
          }
  
  
          $optionsList = ArrayHelper::map(TaxGroup::find()->where(['is_filter' => 'TRUE'])->all(), 'alias', 'name');
  
  
          foreach ($optionsList as $optionList => $name) {
  
  
              if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
  
                  $model = TaxOption::find()->where(['alias' => $filter[$optionList]])->one();
                  if (!$model instanceof TaxOption) {
  
                      \Yii::$app->response->redirect(['site/error'], 404);
                  } else {
b161c194   Administrator   14.09.16
462
                      $array[$optionList]['value'] = $model->value->value;
9fa9adf7   Administrator   14.09.16
463
464
465
466
467
468
469
470
471
472
473
474
475
                      $array[$optionList]['name'] = $name;
                  }
  
  
              }
  
  
          }
  
          return $array;
  
      }
  
3f2bc3d0   Administrator   first commit
476
  }