Blame view

frontend/widgets/Seo.php 12.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
  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
  
3da72a43   Administrator   14.09.16
102
  
b161c194   Administrator   14.09.16
103
                  $filter = \Yii::$app->request->get('filters', []);
3da72a43   Administrator   14.09.16
104
  
b161c194   Administrator   14.09.16
105
                  $default = $this->selectSeoData(self::H1);
3da72a43   Administrator   14.09.16
106
  
b161c194   Administrator   14.09.16
107
                  if ($default != $this->{self::H1}) {
3da72a43   Administrator   14.09.16
108
  
b161c194   Administrator   14.09.16
109
                      return $default;
3da72a43   Administrator   14.09.16
110
  
3da72a43   Administrator   14.09.16
111
  
b161c194   Administrator   14.09.16
112
                  } else if(!empty($filter) && !$this->checkFilter($filter)){
3da72a43   Administrator   14.09.16
113
  
b161c194   Administrator   14.09.16
114
115
116
117
                      $array = $this->arrayBuilder($filter);
                      return $this->getNameString($array);
                  }
                  else {
3da72a43   Administrator   14.09.16
118
  
b161c194   Administrator   14.09.16
119
                      return $default;
4b4be5ea   Administrator   29.06.16
120
                  }
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
127
128
  
                  $title = $this->selectSeoData(self::TITLE);
  
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
187
188
                  break;
              case self::DESCRIPTION:
                  $description = $this->selectSeoData(self::DESCRIPTION);
  
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
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
210
211
                  $meta = $this->selectSeoData(self::META);
  
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', []);
0d0c080c   Dmytry Fedorchuk   seo module filter...
215
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
216
  
64e48993   Administrator   14.09.16
217
  
9fa9adf7   Administrator   14.09.16
218
                  if (!empty($meta) && empty($sort) &&  empty($paginate) && !isset($filter['prices']) ) {
e57ad02f   Administrator   14.09.16
219
220
221
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
9fa9adf7   Administrator   14.09.16
222
                          'content' => $meta
e57ad02f   Administrator   14.09.16
223
224
                      ]);
  
9fa9adf7   Administrator   14.09.16
225
                  } else if(!empty($filter['special'])){
0d0c080c   Dmytry Fedorchuk   seo module filter...
226
  
8afa1bf2   Administrator   29.06.16
227
228
229
230
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
231
  
8afa1bf2   Administrator   29.06.16
232
                  } else if (
9fa9adf7   Administrator   14.09.16
233
234
                      isset($filter['brands']) && count($filter['brands']) > 1
                      || isset($filter)  && $this->checkFilter($filter)|| !empty($sort) ||  !empty($paginate) || isset($filter['prices'])
e8923005   Administrator   29.06.16
235
  
8afa1bf2   Administrator   29.06.16
236
                  ) {
9fa9adf7   Administrator   14.09.16
237
238
  
  
8afa1bf2   Administrator   29.06.16
239
240
241
242
243
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
  
9fa9adf7   Administrator   14.09.16
244
                  } else if ( isset($filter) && count($filter, COUNT_RECURSIVE) > 4) {
8afa1bf2   Administrator   29.06.16
245
246
247
248
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
9fa9adf7   Administrator   14.09.16
249
                  }
1964a4cf   Alex Savenko   get param "langua...
250
251
252
253
254
255
                  else if (isset($language)) {
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
                  }
9fa9adf7   Administrator   14.09.16
256
                  else {
8afa1bf2   Administrator   29.06.16
257
258
259
260
261
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'index,follow'
                      ]);
e21450c9   Dmytry Fedorchuk   SEO
262
                  }
0d0c080c   Dmytry Fedorchuk   seo module filter...
263
264
  
  
e8923005   Administrator   29.06.16
265
266
  
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
267
                  break;
3f2bc3d0   Administrator   first commit
268
269
270
271
272
          }
  
  
      }
  
bdc6c84c   Administrator   14.09.16
273
274
275
  
  
      protected function checkFilter($filter){
bdc6c84c   Administrator   14.09.16
276
277
          foreach(self::$optionsList as $optionList){
  
7b18ef88   Administrator   14.09.16
278
              if(isset($filter[$optionList]) && count($filter[$optionList])  > 1){
efa83867   Administrator   14.09.16
279
                  return true;
7b18ef88   Administrator   14.09.16
280
              }
bdc6c84c   Administrator   14.09.16
281
282
  
          }
efa83867   Administrator   14.09.16
283
          return false;
bdc6c84c   Administrator   14.09.16
284
285
      }
  
3f2bc3d0   Administrator   first commit
286
287
288
      protected function replaceData($str)
      {
  
e21450c9   Dmytry Fedorchuk   SEO
289
290
291
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
3f2bc3d0   Administrator   first commit
292
293
294
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
4495dea0   Administrator   проапдейтил роли
295
          return $str;
3f2bc3d0   Administrator   first commit
296
297
      }
  
1b898c16   Administrator   20.07.16
298
      protected static function findSeoByUrl($url)
3f2bc3d0   Administrator   first commit
299
      {
1b898c16   Administrator   20.07.16
300
301
302
303
304
          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
305
306
307
308
      }
  
      protected function findSeoByDynamic()
      {
1f3add0a   Dmytry Fedorchuk   All seo
309
310
311
312
313
314
  
          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
315
  
1f3add0a   Dmytry Fedorchuk   All seo
316
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
3f2bc3d0   Administrator   first commit
317
          }
1f3add0a   Dmytry Fedorchuk   All seo
318
  
3f2bc3d0   Administrator   first commit
319
320
321
322
          return $query->one();
      }
  
  
466144f8   Administrator   20.07.16
323
324
325
326
327
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
  
e21450c9   Dmytry Fedorchuk   SEO
328
329
      protected function getViewData()
      {
3f2bc3d0   Administrator   first commit
330
          $params = $this->getView()->params;
e21450c9   Dmytry Fedorchuk   SEO
331
          if (isset($params['seo'])) {
3f2bc3d0   Administrator   first commit
332
333
334
335
336
337
              return $params['seo'];
          } else {
              return [];
          }
      }
  
e21450c9   Dmytry Fedorchuk   SEO
338
339
      protected function selectSeoData($param)
      {
3f2bc3d0   Administrator   first commit
340
341
          $result = '';
  
1b898c16   Administrator   20.07.16
342
          $widgetData = static::findSeoByUrl($this->url);
9fa9adf7   Administrator   14.09.16
343
  
e21450c9   Dmytry Fedorchuk   SEO
344
          if ($widgetData instanceof \common\models\Seo) {
3f2bc3d0   Administrator   first commit
345
  
e21450c9   Dmytry Fedorchuk   SEO
346
              $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
347
  
e21450c9   Dmytry Fedorchuk   SEO
348
          } else if (!empty($this->$param)) {
3f2bc3d0   Administrator   first commit
349
              $result = $this->$param;
9fa9adf7   Administrator   14.09.16
350
  
3f2bc3d0   Administrator   first commit
351
352
353
          } else {
  
              $widgetData = $this->findSeoByDynamic();
9fa9adf7   Administrator   14.09.16
354
  
e21450c9   Dmytry Fedorchuk   SEO
355
              if ($widgetData instanceof SeoDynamic) {
3f2bc3d0   Administrator   first commit
356
  
e21450c9   Dmytry Fedorchuk   SEO
357
                  $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
358
359
360
361
362
  
              }
  
          }
  
bdc6c84c   Administrator   14.09.16
363
          return   $this->replaceData($result);
3f2bc3d0   Administrator   first commit
364
365
366
  
      }
  
1f3add0a   Dmytry Fedorchuk   All seo
367
      public function getTitleString($array){
466144f8   Administrator   20.07.16
368
369
370
371
372
373
374
375
  
          $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
376
          }
466144f8   Administrator   20.07.16
377
378
  
          return false;
1f3add0a   Dmytry Fedorchuk   All seo
379
380
  
      }
9fa9adf7   Administrator   14.09.16
381
  
d29a2cfa   Yarik   Seo fix
382
383
384
385
386
      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
387
  
9fa9adf7   Administrator   14.09.16
388
389
390
391
392
393
394
395
      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
396
                  $row .= $field['value'].' '  ;
9fa9adf7   Administrator   14.09.16
397
398
399
400
401
              }
  
  
  
          }
9fa9adf7   Administrator   14.09.16
402
403
404
405
406
407
408
409
410
411
412
413
414
          $row .= " по самой лучшей цене с гарантией от производителя - Ruzkachok.com.ua";
          return $row;
  
      }
  
  
      public function getNameString($array){
          $row = '';
          foreach($array as $name => $field){
  
              if($name == 'category' ){
                  $row = $field.' '.$row;
              } else {
b161c194   Administrator   14.09.16
415
                  $row .= $field['value'].' '  ;
9fa9adf7   Administrator   14.09.16
416
417
418
419
420
              }
  
  
  
          }
b161c194   Administrator   14.09.16
421
  
9fa9adf7   Administrator   14.09.16
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
          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
460
                      $array[$optionList]['value'] = $model->value->value;
9fa9adf7   Administrator   14.09.16
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
                      $array[$optionList]['name'] = $name;
                  }
  
  
              }
  
  
          }
  
          return $array;
  
      }
  
  
  
3f2bc3d0   Administrator   first commit
476
  }