Blame view

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