Blame view

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