Blame view

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