Blame view

widgets/Seo.php 15.4 KB
feffea0a   Yarik   Namespaces
1
  <?php
aef3b793   Yarik   For Leha commit
2
  namespace artweb\artbox\seo\widgets;
feffea0a   Yarik   Namespaces
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  
  use artweb\artbox\seo\models\SeoDynamic;
  use artweb\artbox\ecommerce\models\Brand;
  use artweb\artbox\ecommerce\models\TaxGroup;
  use artweb\artbox\ecommerce\models\TaxOption;
  use yii\base\Widget;
  use yii\helpers\ArrayHelper;
  
  class Seo extends Widget
  {
      private $url;
      public $row;
      public $own_attr;
      public $fields;
      public $category_name;
      public $description;
      public $title;
      public $meta;
      public $seo_text;
      public $h1;
      public $key;
      public $name;
      public $project_name;
feffea0a   Yarik   Namespaces
26
27
28
      public static $optionsList;
      protected static $check_url;
      protected static $check_url_bool;
7b0c8d58   Alexey Boroda   -Show real robots...
29
      protected static $robots_string = '';
feffea0a   Yarik   Namespaces
30
31
32
  
  
      const SEO_TEXT = 'seo_text';
4b62b15f   Administrator   add variantSku
33
      const DESCRIPTION = 'description';
feffea0a   Yarik   Namespaces
34
35
36
37
38
39
40
      const META = 'meta';
      const H1 = 'h1';
      const TITLE = 'title';
  
      public function init()
      {
          $this->url = \Yii::$app->request->url;
feffea0a   Yarik   Namespaces
41
          $this->project_name = \Yii::$app->name;
feffea0a   Yarik   Namespaces
42
          if(empty(self::$optionsList)){
76f5d86f   Administrator   add variantSku
43
              self::$optionsList = ArrayHelper::getColumn(TaxGroup::find()->joinWith('lang')->where(['is_filter' => 'TRUE'])->asArray()->all(),'lang.alias');
feffea0a   Yarik   Namespaces
44
45
46
47
48
49
          }
  
          parent::init();
  
      }
  
9e39764a   Administrator   add variantSku
50
51
52
      /**
       * @return mixed
       */
feffea0a   Yarik   Namespaces
53
54
55
56
57
58
59
60
61
      public function run()
      {
  
          $seoData = $this->getViewData();
          foreach ($seoData as $key => $value) {
              $this->$key = $value;
          }
  
  
feffea0a   Yarik   Namespaces
62
63
64
65
66
67
68
69
70
71
          switch ($this->row) {
              case self::SEO_TEXT:
  
  
                  $filter = \Yii::$app->request->get('filters', []);
                  $sort = \Yii::$app->request->get('sort', []);
                  $paginate = \Yii::$app->request->get('page', []);
  
                  if(empty($filter) && empty($sort) && empty($paginate) ){
  
76f5d86f   Administrator   add variantSku
72
                      return $this->prepareString($this->selectSeoData(self::SEO_TEXT,$filter,$priority));
feffea0a   Yarik   Namespaces
73
74
75
  
                  } else {
  
76f5d86f   Administrator   add variantSku
76
                      $widgetData = static::findSeoByUrl($this->url);
feffea0a   Yarik   Namespaces
77
78
79
  
                      $result = '';
  
76f5d86f   Administrator   add variantSku
80
                      if ($widgetData instanceof \artweb\artbox\seo\models\Seo) {
feffea0a   Yarik   Namespaces
81
  
76f5d86f   Administrator   add variantSku
82
                          $result = $widgetData->{self::SEO_TEXT};
feffea0a   Yarik   Namespaces
83
84
85
  
                      } else {
  
76f5d86f   Administrator   add variantSku
86
                          $widgetData = $this->findSeoByDynamic();
feffea0a   Yarik   Namespaces
87
  
76f5d86f   Administrator   add variantSku
88
89
90
                          if ($widgetData instanceof SeoDynamic) {
  
                              $result = $widgetData->lang->{self::SEO_TEXT};
feffea0a   Yarik   Namespaces
91
92
93
94
95
  
                          }
  
                      }
  
30d2133c   Administrator   add variantSku
96
                      return $this->prepareString($this->replaceData($result));
feffea0a   Yarik   Namespaces
97
98
99
100
101
102
103
104
                  }
  
  
                  break;
              case self::H1:
  
                  $filter = \Yii::$app->request->get('filters', []);
  
76f5d86f   Administrator   add variantSku
105
                  $default = $this->selectSeoData(self::H1, $filter,$priority);
a6a11086   Administrator   select characteri...
106
                  if ($default != $this->{self::H1} && $priority != 3) {
feffea0a   Yarik   Namespaces
107
  
30d2133c   Administrator   add variantSku
108
                      return $this->prepareString($default);
feffea0a   Yarik   Namespaces
109
110
111
  
  
                  } else if(!empty($filter) && !$this->checkFilter($filter)){
feffea0a   Yarik   Namespaces
112
                      $array = $this->arrayBuilder($filter);
30d2133c   Administrator   add variantSku
113
                      return $this->prepareString($this->getNameString($array,$default));
feffea0a   Yarik   Namespaces
114
115
                  }
                  else {
30d2133c   Administrator   add variantSku
116
                      return $this->prepareString($default);
feffea0a   Yarik   Namespaces
117
                  }
30d2133c   Administrator   add variantSku
118
                  break;
feffea0a   Yarik   Namespaces
119
120
121
122
123
              case self::TITLE:
  
                  $filter = \Yii::$app->request->get('filters', []);
  
  
0436d2e2   Administrator   add variantSku
124
                  $title = $this->selectSeoData(self::TITLE, $filter, $priority);
22083bd3   Administrator   add variantSku
125
  
feffea0a   Yarik   Namespaces
126
  
0436d2e2   Administrator   add variantSku
127
                  if(!empty($filter) &&  $priority==3 || !empty($filter) && empty($this->{Seo::TITLE})) {
feffea0a   Yarik   Namespaces
128
129
130
  
                      $array = $this->arrayBuilder($filter);
  
30d2133c   Administrator   add variantSku
131
                      $title_string = $this->getTitleString($array, $title);
feffea0a   Yarik   Namespaces
132
133
  
                      if($title_string){
30d2133c   Administrator   add variantSku
134
                          return $this->prepareString($title_string);
feffea0a   Yarik   Namespaces
135
136
137
138
                      }
  
                  }
  
bf6de24b   Administrator   add variantSku
139
  
feffea0a   Yarik   Namespaces
140
                  if (!empty($title)) {
30d2133c   Administrator   add variantSku
141
                      return $this->prepareString($title);
feffea0a   Yarik   Namespaces
142
                  } else  {
30d2133c   Administrator   add variantSku
143
                      return $this->prepareString($this->project_name);
feffea0a   Yarik   Namespaces
144
                  }
feffea0a   Yarik   Namespaces
145
146
                  break;
              case self::DESCRIPTION:
4656e4ee   Administrator   add variantSku
147
148
149
  
                  $filter = \Yii::$app->request->get('filters', []);
  
76f5d86f   Administrator   add variantSku
150
                  $description = $this->selectSeoData(self::DESCRIPTION, $filter,$priority);
c351d5b0   Administrator   add variantSku
151
  
c1965fd6   Alexey Boroda   -Seo dynamics for...
152
                  if (!empty($description)) {
013622b2   Alexey Boroda   -Seo description fix
153
                      
c351d5b0   Administrator   add variantSku
154
155
156
                      if(!empty($filter)){
                          $array = $this->arrayBuilder($filter);
                          $this->getView()->registerMetaTag([
013622b2   Alexey Boroda   -Seo description fix
157
158
159
160
                                                                'name' => 'description',
                                                                'content' => $this->prepareString($this->getDescriptionString($array,$description))
                                                            ]);
                          break;
c351d5b0   Administrator   add variantSku
161
                      }
013622b2   Alexey Boroda   -Seo description fix
162
163
164
165
166
                      
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
                          'content' => $this->prepareString($description)
                      ]);
c351d5b0   Administrator   add variantSku
167
168
  
                  }
feffea0a   Yarik   Namespaces
169
170
171
172
  
                  break;
              case self::META:
  
feffea0a   Yarik   Namespaces
173
174
175
176
177
  
                  $filter = \Yii::$app->request->get('filters', []);
                  $sort = \Yii::$app->request->get('sort', []);
                  $paginate = \Yii::$app->request->get('page', []);
  
76f5d86f   Administrator   add variantSku
178
                  $meta = $this->selectSeoData(self::META, $filter,$priority);
af359dbb   Alexey Boroda   -Seo sort and pag...
179
180
181
182
      
                  /**
                   * Sort and pagination SEO fix
                   */
04f13c9b   Alexey Boroda   -Seo sort and pag...
183
184
185
186
187
                  if (strpos(\Yii::$app->request->url, 'sort=') !== false || strpos(\Yii::$app->request->url, 'perPage=') !== false) {
                      $this->getView()->registerMetaTag([
                                                            'name' => 'robots',
                                                            'content' => 'noindex,nofollow'
                                                        ]);
7b0c8d58   Alexey Boroda   -Show real robots...
188
                      self::$robots_string = 'noindex,nofollow';
04f13c9b   Alexey Boroda   -Seo sort and pag...
189
190
                      break;
                  }
af359dbb   Alexey Boroda   -Seo sort and pag...
191
                  if (strpos(\Yii::$app->request->url, 'per-page=') !== false) {
04f13c9b   Alexey Boroda   -Seo sort and pag...
192
193
194
195
                      $this->getView()->registerMetaTag([
                                                            'name' => 'robots',
                                                            'content' => 'noindex,follow'
                                                        ]);
7b0c8d58   Alexey Boroda   -Show real robots...
196
                      self::$robots_string = 'noindex,follow';
04f13c9b   Alexey Boroda   -Seo sort and pag...
197
                      break;
af359dbb   Alexey Boroda   -Seo sort and pag...
198
199
                  }
                  
af40200b   Administrator   add variantSku
200
                  if(!empty($filter) && !$this->checkFilter($filter) && count($filter, COUNT_RECURSIVE) == 2 && $priority==3){
b42f465a   Administrator   add variantSku
201
202
203
                      $key = array_keys ( $filter);
                      if(isset($key[0])){
                          $metaGroup = TaxGroup::find()->joinWith('lang')->where(['alias'=>$key[0]])->one();
abab5f69   Administrator   add variantSku
204
                          if($metaGroup != null && !empty($metaGroup->meta_robots)){
b42f465a   Administrator   add variantSku
205
206
207
208
                              $this->getView()->registerMetaTag([
                                  'name' => 'robots',
                                  'content' => $metaGroup->meta_robots
                              ]);
7b0c8d58   Alexey Boroda   -Show real robots...
209
                              self::$robots_string = $metaGroup->meta_robots;
b42f465a   Administrator   add variantSku
210
211
212
213
214
215
                              break;
                          }
                      }
                  }
  
  
feffea0a   Yarik   Namespaces
216
217
218
219
220
221
                  if (!empty($meta) && empty($sort) &&  empty($paginate) && !isset($filter['prices']) ) {
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => $meta
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
222
                      self::$robots_string = $meta;
feffea0a   Yarik   Namespaces
223
224
225
226
                  } else if(!empty($filter['special'])){
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
09348f4c   Administrator   site map
227
                          'content' => 'noindex,nofollow'
feffea0a   Yarik   Namespaces
228
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
229
                      self::$robots_string = 'noindex,nofollow';
feffea0a   Yarik   Namespaces
230
231
232
233
234
235
236
237
238
239
                  } else if (
                      isset($filter['brands']) && count($filter['brands']) > 1
                      || isset($filter)  && $this->checkFilter($filter)
  
                  ) {
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
240
                      self::$robots_string = 'noindex,nofollow';
feffea0a   Yarik   Namespaces
241
242
  
                  } else if (
30d2133c   Administrator   add variantSku
243
244
                      isset($filter['brands']) && count($filter['brands']) > 1 && isset($filter) && count($filter, COUNT_RECURSIVE) >= 2
                      || isset($filter) && count($filter, COUNT_RECURSIVE) > 2
feffea0a   Yarik   Namespaces
245
246
247
248
249
250
251
                      || !empty($sort) ||  !empty($paginate) || isset($filter['prices'])
                  ) {
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
252
253
                      self::$robots_string = 'noindex,nofollow';
      
e2a4136b   Administrator   site map
254
255
256
257
258
259
                  } else if(!empty($this->{Seo::META})){
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => $this->{Seo::META}
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
260
261
                      self::$robots_string = $this->{Seo::META};
      
feffea0a   Yarik   Namespaces
262
263
264
265
266
267
                  } else {
  
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'index,follow'
                      ]);
7b0c8d58   Alexey Boroda   -Show real robots...
268
                      self::$robots_string =  'index,follow';
feffea0a   Yarik   Namespaces
269
270
271
272
273
274
275
276
277
278
279
                  }
  
  
  
  
                  break;
          }
  
  
      }
  
7b0c8d58   Alexey Boroda   -Show real robots...
280
281
282
283
284
      public static function getRobotsString()
      {
          return self::$robots_string;
      }
      
9e39764a   Administrator   add variantSku
285
286
287
288
      /**
       * @param $str
       * @return mixed
       */
feffea0a   Yarik   Namespaces
289
290
      protected function replaceData($str)
      {
4e8c4f53   Alexey Boroda   -H1 and filter re...
291
          
feffea0a   Yarik   Namespaces
292
293
294
295
296
297
298
299
300
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
          return $str;
      }
  
9e39764a   Administrator   add variantSku
301
302
303
304
      /**
       * @param $url
       * @return static
       */
feffea0a   Yarik   Namespaces
305
306
307
308
309
310
311
312
313
      protected static function findSeoByUrl($url)
      {
          if(empty(self::$check_url_bool)){
              self::$check_url = \artweb\artbox\seo\models\Seo::findOne(['url' => $url]);
              self::$check_url_bool = true;
          }
          return self::$check_url;
      }
  
9e39764a   Administrator   add variantSku
314
315
316
      /**
       * @return array|null|\yii\db\ActiveRecord
       */
feffea0a   Yarik   Namespaces
317
318
      protected function findSeoByDynamic()
      {
30d2133c   Administrator   add variantSku
319
  
b5777d78   Administrator   add variantSku
320
321
322
  //        print_r(\Yii::$app->controller->id);
  //        print_r(\Yii::$app->controller->action->id);
  //        die();
feffea0a   Yarik   Namespaces
323
324
325
326
327
328
329
330
331
332
333
334
          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 {
  
  
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
          }
  
          return $query->one();
      }
  
9e39764a   Administrator   add variantSku
335
336
337
      /**
       * @return array|null|\yii\db\ActiveRecord
       */
feffea0a   Yarik   Namespaces
338
339
340
341
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
9e39764a   Administrator   add variantSku
342
343
344
      /**
       * @return array
       */
feffea0a   Yarik   Namespaces
345
346
347
348
349
350
351
352
353
354
      protected function getViewData()
      {
          $params = $this->getView()->params;
          if (isset($params['seo'])) {
              return $params['seo'];
          } else {
              return [];
          }
      }
  
bf6de24b   Administrator   add variantSku
355
356
357
  
      /**
       * @param $param
4656e4ee   Administrator   add variantSku
358
       * @param $filter
b5777d78   Administrator   add variantSku
359
       * @param $priority
bf6de24b   Administrator   add variantSku
360
361
       * @return mixed
       */
76f5d86f   Administrator   add variantSku
362
      protected function selectSeoData($param, $filter, &$priority)
feffea0a   Yarik   Namespaces
363
      {
feffea0a   Yarik   Namespaces
364
365
          $result = '';
  
76f5d86f   Administrator   add variantSku
366
          $widgetData = static::findSeoByUrl($this->url);
feffea0a   Yarik   Namespaces
367
  
76f5d86f   Administrator   add variantSku
368
          $widgetDynamicData = $this->findSeoByDynamic();
30d2133c   Administrator   add variantSku
369
  
feffea0a   Yarik   Namespaces
370
          if ($widgetData instanceof \artweb\artbox\seo\models\Seo) {
b5777d78   Administrator   add variantSku
371
              $priority = 1;
feffea0a   Yarik   Namespaces
372
373
              $result = $widgetData->$param;
  
4656e4ee   Administrator   add variantSku
374
          }else if(!empty($this->$param) && empty($filter)) {
b5777d78   Administrator   add variantSku
375
              $priority = 2;
68d49205   Administrator   add variantSku
376
377
              $result = $this->$param;
  
30d2133c   Administrator   add variantSku
378
          } else if ($widgetDynamicData instanceof SeoDynamic) {
b5777d78   Administrator   add variantSku
379
              $priority = 3;
30d2133c   Administrator   add variantSku
380
              $result = $widgetDynamicData->lang->$param;
bf6de24b   Administrator   add variantSku
381
  
feffea0a   Yarik   Namespaces
382
383
384
385
386
387
          }
  
          return $this->replaceData($result);
  
      }
  
9e39764a   Administrator   add variantSku
388
389
390
391
392
      /**
       * @param $array
       * @param $title
       * @return mixed
       */
30d2133c   Administrator   add variantSku
393
394
      public function getTitleString($array, $title){
  
feffea0a   Yarik   Namespaces
395
396
          $row = '';
          foreach($array as $name => $field){
c62fdb51   Alexey Boroda   -Filtering title ...
397
398
399
              if (isset($this->fields['name'])) {
                  $field['value'] = str_replace($this->fields['name'], '', $field['value']);
              }
4656e4ee   Administrator   add variantSku
400
              $row .= $field['value'].' '  ;
30d2133c   Administrator   add variantSku
401
          }
feffea0a   Yarik   Namespaces
402
  
30d2133c   Administrator   add variantSku
403
          $template =  preg_replace('/{filter}/',$row,$title);
feffea0a   Yarik   Namespaces
404
  
30d2133c   Administrator   add variantSku
405
          return $template;
feffea0a   Yarik   Namespaces
406
407
408
  
      }
  
9e39764a   Administrator   add variantSku
409
410
411
412
413
      /**
       * @param $array
       * @param $description
       * @return mixed
       */
30d2133c   Administrator   add variantSku
414
      public function getDescriptionString($array, $description){
feffea0a   Yarik   Namespaces
415
  
30d2133c   Administrator   add variantSku
416
417
          $row = '';
          foreach($array as $name => $field){
013622b2   Alexey Boroda   -Seo description fix
418
419
420
              if (isset($this->fields['name'])) {
                  $field['value'] = str_replace($this->fields['name'], '', $field['value']);
              }
4656e4ee   Administrator   add variantSku
421
              $row .= $field['value'].' '  ;
30d2133c   Administrator   add variantSku
422
          }
95ca022f   Administrator   add variantSku
423
          $template =  preg_replace('/{filter}/',$row, $description);
feffea0a   Yarik   Namespaces
424
  
30d2133c   Administrator   add variantSku
425
          return $template;
feffea0a   Yarik   Namespaces
426
427
428
429
  
      }
  
  
9e39764a   Administrator   add variantSku
430
431
432
433
434
      /**
       * @param $array
       * @param $h1
       * @return mixed
       */
30d2133c   Administrator   add variantSku
435
      public function getNameString($array, $h1){
4656e4ee   Administrator   add variantSku
436
          $row = ' ';
feffea0a   Yarik   Namespaces
437
          foreach($array as $name => $field){
4e8c4f53   Alexey Boroda   -H1 and filter re...
438
439
440
              if (isset($this->fields['name'])) {
                  $field['value'] = str_replace($this->fields['name'], '', $field['value']);
              }
4656e4ee   Administrator   add variantSku
441
              $row .= $field['value'].' '  ;
30d2133c   Administrator   add variantSku
442
          }
feffea0a   Yarik   Namespaces
443
  
95ca022f   Administrator   add variantSku
444
          $template =  preg_replace('/{filter}/',$row, $h1 );
feffea0a   Yarik   Namespaces
445
  
30d2133c   Administrator   add variantSku
446
          return $template;
feffea0a   Yarik   Namespaces
447
448
449
  
      }
  
30d2133c   Administrator   add variantSku
450
451
452
453
      /**
       * @param $filter
       * @return mixed
       */
feffea0a   Yarik   Namespaces
454
455
      public function arrayBuilder($filter)
      {
95ca022f   Administrator   add variantSku
456
          $array = [];
feffea0a   Yarik   Namespaces
457
              if (isset($filter['brands']) && count($filter['brands']) == 1) {
5cfbf2a2   Administrator   slider
458
                  $model = Brand::find()->joinWith('lang')->where(['alias' => $filter['brands'][0]])->one();
feffea0a   Yarik   Namespaces
459
460
461
462
463
                  if (!$model instanceof Brand) {
  
                      \Yii::$app->response->redirect(['/site/error'], 404);
                  } else {
                      $array['brand']['name'] = 'Бренд';
e5f77089   Administrator   full commit
464
                      $array['brand']['value'] = $model->lang->title;
feffea0a   Yarik   Namespaces
465
466
467
468
469
                  }
  
              }
  
  
76f5d86f   Administrator   add variantSku
470
              $optionsList = ArrayHelper::map(TaxGroup::find()->joinWith('lang')->where(['is_filter' => 'TRUE'])->asArray()->all(), 'lang.alias', 'name');
feffea0a   Yarik   Namespaces
471
472
473
474
475
476
477
  
  
              foreach ($optionsList as $optionList => $name) {
  
  
                  if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
  
e5f77089   Administrator   full commit
478
                      $model = TaxOption::find()->joinWith('lang')->where(['alias' => $filter[$optionList]])->one();
feffea0a   Yarik   Namespaces
479
480
481
482
                      if (!$model instanceof TaxOption) {
  
                          \Yii::$app->response->redirect(['site/error'], 404);
                      } else {
e5f77089   Administrator   full commit
483
                          $array[$optionList]['value'] = $model->lang->value;
feffea0a   Yarik   Namespaces
484
485
486
487
488
489
490
491
492
493
494
495
496
                          $array[$optionList]['name'] = $name;
                      }
  
  
                  }
  
  
              }
  
          return $array;
  
      }
  
30d2133c   Administrator   add variantSku
497
498
499
500
      /**
       * @param $filter
       * @return bool
       */
feffea0a   Yarik   Namespaces
501
502
503
504
505
506
507
508
509
510
511
      protected function checkFilter($filter){
          foreach(self::$optionsList as $optionList){
  
              if(isset($filter[$optionList]) && count($filter[$optionList])  > 1){
                  return true;
              }
  
          }
          return false;
      }
  
30d2133c   Administrator   add variantSku
512
513
      /**
       * @param $string
9e39764a   Administrator   add variantSku
514
       * @return mixed
30d2133c   Administrator   add variantSku
515
516
517
518
       */
      public function prepareString($string){
         return preg_replace('/\{.[^\}]*\}/','',$string);
      }
feffea0a   Yarik   Namespaces
519
520
  
  }