Blame view

frontend/widgets/Seo.php 13.6 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
61
62
  
          switch ($this->row) {
              case self::SEO_TEXT:
54330e07   Administrator   29.06.16
63
64
  
  
a4d63ed9   Administrator   20.07.16
65
                  $filter = \Yii::$app->request->get('filters', []);
54330e07   Administrator   29.06.16
66
67
68
69
70
71
72
73
74
                  $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
75
                      $widgetData = static::findSeoByUrl($this->url);
54330e07   Administrator   29.06.16
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  
                      $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
98
99
100
  
                  break;
              case self::H1:
51774c5a   Dmytry Fedorchuk   Seo brand
101
  
a4d63ed9   Administrator   20.07.16
102
                  $filter = \Yii::$app->request->get('filters', []);
51774c5a   Dmytry Fedorchuk   Seo brand
103
  
51774c5a   Dmytry Fedorchuk   Seo brand
104
  
51774c5a   Dmytry Fedorchuk   Seo brand
105
  
e57ad02f   Administrator   14.09.16
106
                  if (isset($filter['brands']) && count($filter['brands']) == 1) {
51774c5a   Dmytry Fedorchuk   Seo brand
107
  
e57ad02f   Administrator   14.09.16
108
109
                      $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
                      if(!$model instanceof Brand){
63e7825d   Administrator   29.06.16
110
  
e57ad02f   Administrator   14.09.16
111
112
113
                          \Yii::$app->response->redirect(['/site/error'],404);
                      } else {
                          if($this->selectSeoData(self::H1) == $this->category_name) {
d482cb6f   Administrator   29.06.16
114
  
e57ad02f   Administrator   14.09.16
115
116
117
118
119
120
121
122
123
124
125
126
                              return $this->selectSeoData(self::H1) . ' ' . $model->name ;
                          }else {
  
                              return $this->selectSeoData(self::H1);
  
                          }
                      }
  
  
  
                  } else  if (isset($filter["naznacenie"]) && count($filter["naznacenie"]) == 1) {
  
9fa9adf7   Administrator   14.09.16
127
                      $model = TaxOption::find()->where(['alias' => $filter["naznacenie"]])->one();
e57ad02f   Administrator   14.09.16
128
129
130
131
132
                      if(!$model instanceof TaxOption){
  
                          \Yii::$app->response->redirect(['/site/error'],404);
                      } else {
                          if($this->selectSeoData(self::H1) == $this->category_name) {
d482cb6f   Administrator   29.06.16
133
  
e57ad02f   Administrator   14.09.16
134
135
136
137
138
139
140
141
142
143
144
145
146
                              return $this->selectSeoData(self::H1) . ' ' . $model->value->value;
                          }else {
  
                              return $this->selectSeoData(self::H1);
  
                          }
  
                      }
  
  
  
                  } else {
                      return $this->selectSeoData(self::H1);
4b4be5ea   Administrator   29.06.16
147
                  }
9fa9adf7   Administrator   14.09.16
148
                  break;
3f2bc3d0   Administrator   first commit
149
150
              case self::TITLE:
  
a4d63ed9   Administrator   20.07.16
151
                  $filter = \Yii::$app->request->get('filters', []);
1c02ab59   Administrator   29.06.16
152
  
3f2bc3d0   Administrator   first commit
153
154
155
  
                  $title = $this->selectSeoData(self::TITLE);
  
1c02ab59   Administrator   29.06.16
156
  
ac8ab861   Administrator   20.07.16
157
                  if(!empty($filter) && isset($this->fields['meta-title']) && $title == $this->fields['meta-title']) {
dc6809dc   Administrator   23.06.16
158
159
160
161
162
163
164
165
  
                      $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
166
167
168
169
170
171
                          if(!$model instanceof Brand){
  
                              \Yii::$app->response->redirect(['/site/error'],404);
                          } else {
                              $array['brand'] = $model->name;
                          }
dc6809dc   Administrator   23.06.16
172
  
dc6809dc   Administrator   23.06.16
173
174
                      }
  
dc6809dc   Administrator   23.06.16
175
  
dc6809dc   Administrator   23.06.16
176
  
bdc6c84c   Administrator   14.09.16
177
                      foreach(self::$optionsList as $optionList){
dc6809dc   Administrator   23.06.16
178
  
dc6809dc   Administrator   23.06.16
179
  
466144f8   Administrator   20.07.16
180
                          if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
dc6809dc   Administrator   23.06.16
181
  
466144f8   Administrator   20.07.16
182
                              $model = TaxOption::find()->where(['alias' =>$filter[$optionList]])->one();
38b2f003   Administrator   20.07.16
183
184
185
186
187
188
189
                              if(!$model instanceof TaxOption){
  
                                  \Yii::$app->response->redirect(['site/error'],404);
                              } else {
                                  $array[$optionList] = $model->value->value;
                              }
  
466144f8   Administrator   20.07.16
190
191
192
  
  
                          }
dc6809dc   Administrator   23.06.16
193
  
dc6809dc   Administrator   23.06.16
194
  
dc6809dc   Administrator   23.06.16
195
196
  
                      }
7f7c8e5e   Dmytry Fedorchuk   Seo brand
197
  
466144f8   Administrator   20.07.16
198
199
200
                      $title_string = $this->getTitleString($array);
  
                      if($title_string){
d29a2cfa   Yarik   Seo fix
201
                          return $this->my_mb_ucfirst(trim($title_string));
466144f8   Administrator   20.07.16
202
                      }
dc6809dc   Administrator   23.06.16
203
  
466144f8   Administrator   20.07.16
204
205
206
                  }
  
                  if (!empty($title)) {
d482cb6f   Administrator   29.06.16
207
                      return $title;
7f7c8e5e   Dmytry Fedorchuk   Seo brand
208
                  } else  {
d482cb6f   Administrator   29.06.16
209
                      return $this->project_name;
1f3add0a   Dmytry Fedorchuk   All seo
210
                  }
1f3add0a   Dmytry Fedorchuk   All seo
211
  
3f2bc3d0   Administrator   first commit
212
213
214
215
                  break;
              case self::DESCRIPTION:
                  $description = $this->selectSeoData(self::DESCRIPTION);
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
216
                  if (!empty($description)) {
3f2bc3d0   Administrator   first commit
217
218
219
  
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
0d0c080c   Dmytry Fedorchuk   seo module filter...
220
                          'content' => $description
3f2bc3d0   Administrator   first commit
221
222
                      ]);
  
9fa9adf7   Administrator   14.09.16
223
224
225
226
227
228
229
230
231
232
233
234
                  } else {
  
                      $filter = \Yii::$app->request->get('filters', []);
  
                      if(!empty($filter)){
                          $array = $this->arrayBuilder($filter);
                          $this->getView()->registerMetaTag([
                              'name' => 'description',
                              'content' => $this->getDescriptionString($array)
                          ]);
                      }
  
3f2bc3d0   Administrator   first commit
235
236
237
                  }
  
                  break;
0d0c080c   Dmytry Fedorchuk   seo module filter...
238
              case self::META:
e8923005   Administrator   29.06.16
239
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
240
241
                  $meta = $this->selectSeoData(self::META);
  
f5bc3759   Administrator   20.07.16
242
                  $filter = \Yii::$app->request->get('filters', []);
e21450c9   Dmytry Fedorchuk   SEO
243
                  $sort = \Yii::$app->request->get('sort', []);
0e51e661   Dmytry Fedorchuk   paginate seo
244
                  $paginate = \Yii::$app->request->get('page', []);
0d0c080c   Dmytry Fedorchuk   seo module filter...
245
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
246
  
64e48993   Administrator   14.09.16
247
  
9fa9adf7   Administrator   14.09.16
248
                  if (!empty($meta) && empty($sort) &&  empty($paginate) && !isset($filter['prices']) ) {
e57ad02f   Administrator   14.09.16
249
250
251
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
9fa9adf7   Administrator   14.09.16
252
                          'content' => $meta
e57ad02f   Administrator   14.09.16
253
254
                      ]);
  
9fa9adf7   Administrator   14.09.16
255
                  } else if(!empty($filter['special'])){
0d0c080c   Dmytry Fedorchuk   seo module filter...
256
  
8afa1bf2   Administrator   29.06.16
257
258
259
260
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
261
  
8afa1bf2   Administrator   29.06.16
262
                  } else if (
9fa9adf7   Administrator   14.09.16
263
264
                      isset($filter['brands']) && count($filter['brands']) > 1
                      || isset($filter)  && $this->checkFilter($filter)|| !empty($sort) ||  !empty($paginate) || isset($filter['prices'])
e8923005   Administrator   29.06.16
265
  
8afa1bf2   Administrator   29.06.16
266
                  ) {
9fa9adf7   Administrator   14.09.16
267
268
  
  
8afa1bf2   Administrator   29.06.16
269
270
271
272
273
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
  
9fa9adf7   Administrator   14.09.16
274
                  } else if ( isset($filter) && count($filter, COUNT_RECURSIVE) > 4) {
8afa1bf2   Administrator   29.06.16
275
276
277
278
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
9fa9adf7   Administrator   14.09.16
279
280
                  }
                  else {
8afa1bf2   Administrator   29.06.16
281
282
283
284
285
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'index,follow'
                      ]);
e21450c9   Dmytry Fedorchuk   SEO
286
                  }
0d0c080c   Dmytry Fedorchuk   seo module filter...
287
288
  
  
e8923005   Administrator   29.06.16
289
290
  
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
291
                  break;
3f2bc3d0   Administrator   first commit
292
293
294
295
296
          }
  
  
      }
  
bdc6c84c   Administrator   14.09.16
297
298
299
  
  
      protected function checkFilter($filter){
bdc6c84c   Administrator   14.09.16
300
301
          foreach(self::$optionsList as $optionList){
  
7b18ef88   Administrator   14.09.16
302
              if(isset($filter[$optionList]) && count($filter[$optionList])  > 1){
efa83867   Administrator   14.09.16
303
                  return true;
7b18ef88   Administrator   14.09.16
304
              }
bdc6c84c   Administrator   14.09.16
305
306
  
          }
efa83867   Administrator   14.09.16
307
          return false;
bdc6c84c   Administrator   14.09.16
308
309
      }
  
3f2bc3d0   Administrator   first commit
310
311
312
      protected function replaceData($str)
      {
  
e21450c9   Dmytry Fedorchuk   SEO
313
314
315
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
3f2bc3d0   Administrator   first commit
316
317
318
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
4495dea0   Administrator   проапдейтил роли
319
          return $str;
3f2bc3d0   Administrator   first commit
320
321
      }
  
1b898c16   Administrator   20.07.16
322
      protected static function findSeoByUrl($url)
3f2bc3d0   Administrator   first commit
323
      {
1b898c16   Administrator   20.07.16
324
325
326
327
328
          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
329
330
331
332
      }
  
      protected function findSeoByDynamic()
      {
1f3add0a   Dmytry Fedorchuk   All seo
333
334
335
336
337
338
  
          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
339
  
1f3add0a   Dmytry Fedorchuk   All seo
340
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
3f2bc3d0   Administrator   first commit
341
          }
1f3add0a   Dmytry Fedorchuk   All seo
342
  
3f2bc3d0   Administrator   first commit
343
344
345
346
          return $query->one();
      }
  
  
466144f8   Administrator   20.07.16
347
348
349
350
351
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
  
e21450c9   Dmytry Fedorchuk   SEO
352
353
      protected function getViewData()
      {
3f2bc3d0   Administrator   first commit
354
          $params = $this->getView()->params;
e21450c9   Dmytry Fedorchuk   SEO
355
          if (isset($params['seo'])) {
3f2bc3d0   Administrator   first commit
356
357
358
359
360
361
              return $params['seo'];
          } else {
              return [];
          }
      }
  
e21450c9   Dmytry Fedorchuk   SEO
362
363
      protected function selectSeoData($param)
      {
3f2bc3d0   Administrator   first commit
364
365
          $result = '';
  
1b898c16   Administrator   20.07.16
366
          $widgetData = static::findSeoByUrl($this->url);
9fa9adf7   Administrator   14.09.16
367
  
e21450c9   Dmytry Fedorchuk   SEO
368
          if ($widgetData instanceof \common\models\Seo) {
3f2bc3d0   Administrator   first commit
369
  
e21450c9   Dmytry Fedorchuk   SEO
370
              $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
371
  
e21450c9   Dmytry Fedorchuk   SEO
372
          } else if (!empty($this->$param)) {
3f2bc3d0   Administrator   first commit
373
              $result = $this->$param;
9fa9adf7   Administrator   14.09.16
374
  
3f2bc3d0   Administrator   first commit
375
376
377
          } else {
  
              $widgetData = $this->findSeoByDynamic();
9fa9adf7   Administrator   14.09.16
378
  
e21450c9   Dmytry Fedorchuk   SEO
379
              if ($widgetData instanceof SeoDynamic) {
3f2bc3d0   Administrator   first commit
380
  
e21450c9   Dmytry Fedorchuk   SEO
381
                  $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
382
383
384
385
386
  
              }
  
          }
  
bdc6c84c   Administrator   14.09.16
387
          return   $this->replaceData($result);
3f2bc3d0   Administrator   first commit
388
389
390
  
      }
  
1f3add0a   Dmytry Fedorchuk   All seo
391
      public function getTitleString($array){
466144f8   Administrator   20.07.16
392
393
394
395
396
397
398
399
  
          $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
400
          }
466144f8   Administrator   20.07.16
401
402
  
          return false;
1f3add0a   Dmytry Fedorchuk   All seo
403
404
  
      }
9fa9adf7   Administrator   14.09.16
405
  
d29a2cfa   Yarik   Seo fix
406
407
408
409
410
      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
411
  
9fa9adf7   Administrator   14.09.16
412
413
414
415
416
417
418
419
420
421
422
423
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
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
      public function getDescriptionString($array){
          // "{Название раздела | Название блока фильтра: Фильтр 1 | Название блока фильтра: Фильтр 2 | Название блока фильтра: Фильтр 3}. по самой лучшей цене с гарантией от производителя - Ruzkachok.com.ua";
          $row = '';
          foreach($array as $name => $field){
  
              if($name == 'category' ){
                  $row = $field.' '.$row;
              } else {
                  $row .= $field['name'] .' '.$field['value'].' '  ;
              }
  
  
  
          }
          $row = substr($row, 0,-2 );
          $row .= " по самой лучшей цене с гарантией от производителя - Ruzkachok.com.ua";
          return $row;
  
      }
  
  
      public function getNameString($array){
          $row = '';
          foreach($array as $name => $field){
  
              if($name == 'category' ){
                  $row = $field.' '.$row;
              } else {
                  $row .= $field['name'] .' '.$field['value'].' '  ;
              }
  
  
  
          }
          $row = substr($row, 0,-2 );
          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 {
                      $array[$optionList]['value'] = $model->value;
                      $array[$optionList]['name'] = $name;
                  }
  
  
              }
  
  
          }
  
          return $array;
  
      }
  
  
  
3f2bc3d0   Administrator   first commit
501
  }