Blame view

frontend/widgets/Seo.php 10.6 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;
38b2f003   Administrator   20.07.16
5
  use Yii;
1f3add0a   Dmytry Fedorchuk   All seo
6
  use common\modules\product\models\Brand;
466144f8   Administrator   20.07.16
7
  use common\modules\rubrication\models\TaxGroup;
1f3add0a   Dmytry Fedorchuk   All seo
8
  use common\modules\rubrication\models\TaxOption;
3f2bc3d0   Administrator   first commit
9
  use yii\base\Widget;
466144f8   Administrator   20.07.16
10
  use yii\helpers\ArrayHelper;
3f2bc3d0   Administrator   first commit
11
  use yii\helpers\Html;
38b2f003   Administrator   20.07.16
12
13
  use yii\helpers\Url;
  use yii\web\HttpException;
3f2bc3d0   Administrator   first commit
14
15
16
17
  
  class Seo extends Widget
  {
      private $url;
e21450c9   Dmytry Fedorchuk   SEO
18
19
20
      public $row;
      public $own_attr;
      public $fields;
1f3add0a   Dmytry Fedorchuk   All seo
21
      public $category_name;
3f2bc3d0   Administrator   first commit
22
23
      public $description;
      public $title;
0d0c080c   Dmytry Fedorchuk   seo module filter...
24
      public $meta;
3f2bc3d0   Administrator   first commit
25
26
27
      public $seo_text;
      public $h1;
      public $key;
1f3add0a   Dmytry Fedorchuk   All seo
28
      public $name;
3f2bc3d0   Administrator   first commit
29
      public $project_name;
1b898c16   Administrator   20.07.16
30
31
      protected static $check_url;
      protected static $check_url_bool;
7d20bafe   Dmytry Fedorchuk   htacess www
32
33
  
  
3f2bc3d0   Administrator   first commit
34
35
      const SEO_TEXT = 'seo_text';
      const DESCRIPTION = 'description';
0d0c080c   Dmytry Fedorchuk   seo module filter...
36
      const META = 'meta';
3f2bc3d0   Administrator   first commit
37
38
39
      const H1 = 'h1';
      const TITLE = 'title';
  
e21450c9   Dmytry Fedorchuk   SEO
40
41
42
43
      public function init()
      {
          $this->url = \Yii::$app->request->url;
          $this->project_name = \Yii::$app->name;
3f2bc3d0   Administrator   first commit
44
45
46
47
48
49
50
51
52
          parent::init();
  
      }
  
  
      public function run()
      {
  
          $seoData = $this->getViewData();
e21450c9   Dmytry Fedorchuk   SEO
53
          foreach ($seoData as $key => $value) {
3f2bc3d0   Administrator   first commit
54
55
              $this->$key = $value;
          }
446efeeb   Dmytry Fedorchuk   SEO
56
   
3f2bc3d0   Administrator   first commit
57
58
59
  
          switch ($this->row) {
              case self::SEO_TEXT:
54330e07   Administrator   29.06.16
60
61
  
  
a4d63ed9   Administrator   20.07.16
62
                  $filter = \Yii::$app->request->get('filters', []);
54330e07   Administrator   29.06.16
63
64
65
66
67
68
69
70
71
                  $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
72
                      $widgetData = static::findSeoByUrl($this->url);
54330e07   Administrator   29.06.16
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  
                      $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
95
96
97
  
                  break;
              case self::H1:
51774c5a   Dmytry Fedorchuk   Seo brand
98
  
a4d63ed9   Administrator   20.07.16
99
                  $filter = \Yii::$app->request->get('filters', []);
51774c5a   Dmytry Fedorchuk   Seo brand
100
101
102
  
  
  
4b4be5ea   Administrator   29.06.16
103
                  if (isset($filter['brands']) && count($filter['brands']) == 1) {
51774c5a   Dmytry Fedorchuk   Seo brand
104
  
4b4be5ea   Administrator   29.06.16
105
                      $model = Brand::find()->where(['alias' => $filter['brands'][0]])->one();
38b2f003   Administrator   20.07.16
106
                      if(!$model instanceof Brand){
51774c5a   Dmytry Fedorchuk   Seo brand
107
  
38b2f003   Administrator   20.07.16
108
109
110
                          \Yii::$app->response->redirect(['/site/error'],404);
                      } else {
                          if($this->selectSeoData(self::H1) == $this->category_name) {
51774c5a   Dmytry Fedorchuk   Seo brand
111
  
38b2f003   Administrator   20.07.16
112
113
                              return $this->selectSeoData(self::H1) . ' ' . $model->name;
                          }else {
d482cb6f   Administrator   29.06.16
114
  
38b2f003   Administrator   20.07.16
115
                              return $this->selectSeoData(self::H1);
9173c97b   Dmytry Fedorchuk   Seo naznach h1
116
  
38b2f003   Administrator   20.07.16
117
                          }
4b4be5ea   Administrator   29.06.16
118
                      }
9173c97b   Dmytry Fedorchuk   Seo naznach h1
119
  
38b2f003   Administrator   20.07.16
120
121
  
  
a4d63ed9   Administrator   20.07.16
122
                  } else  if (isset($filter["naznacenie"]) && count($filter["naznacenie"]) == 1) {
9173c97b   Dmytry Fedorchuk   Seo naznach h1
123
  
a4d63ed9   Administrator   20.07.16
124
                  $model = TaxOption::find()->where(['alias' => $filter["naznacenie"]])->one();
38b2f003   Administrator   20.07.16
125
126
127
128
129
                      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
130
  
38b2f003   Administrator   20.07.16
131
132
                              return $this->selectSeoData(self::H1) . ' ' . $model->value->value;
                          }else {
63e7825d   Administrator   29.06.16
133
  
38b2f003   Administrator   20.07.16
134
135
136
                              return $this->selectSeoData(self::H1);
  
                          }
63e7825d   Administrator   29.06.16
137
138
139
  
                      }
  
d482cb6f   Administrator   29.06.16
140
141
  
  
4b4be5ea   Administrator   29.06.16
142
143
144
                  } else {
                      return $this->selectSeoData(self::H1);
                  }
51774c5a   Dmytry Fedorchuk   Seo brand
145
                      break;
3f2bc3d0   Administrator   first commit
146
147
              case self::TITLE:
  
a4d63ed9   Administrator   20.07.16
148
                  $filter = \Yii::$app->request->get('filters', []);
1c02ab59   Administrator   29.06.16
149
  
3f2bc3d0   Administrator   first commit
150
151
152
  
                  $title = $this->selectSeoData(self::TITLE);
  
1c02ab59   Administrator   29.06.16
153
  
ac8ab861   Administrator   20.07.16
154
                  if(!empty($filter) && isset($this->fields['meta-title']) && $title == $this->fields['meta-title']) {
dc6809dc   Administrator   23.06.16
155
156
157
158
159
160
161
162
  
                      $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
163
164
165
166
167
168
                          if(!$model instanceof Brand){
  
                              \Yii::$app->response->redirect(['/site/error'],404);
                          } else {
                              $array['brand'] = $model->name;
                          }
dc6809dc   Administrator   23.06.16
169
  
dc6809dc   Administrator   23.06.16
170
171
                      }
  
dc6809dc   Administrator   23.06.16
172
  
466144f8   Administrator   20.07.16
173
                      $optionsList = ArrayHelper::getColumn(TaxGroup::find()->where(['is_filter' => 'TRUE'])->all(),'alias');
dc6809dc   Administrator   23.06.16
174
175
  
  
466144f8   Administrator   20.07.16
176
                      foreach($optionsList as $optionList){
dc6809dc   Administrator   23.06.16
177
  
dc6809dc   Administrator   23.06.16
178
  
466144f8   Administrator   20.07.16
179
                          if (isset($filter[$optionList]) && count($filter[$optionList]) == 1) {
dc6809dc   Administrator   23.06.16
180
  
466144f8   Administrator   20.07.16
181
                              $model = TaxOption::find()->where(['alias' =>$filter[$optionList]])->one();
38b2f003   Administrator   20.07.16
182
183
184
185
186
187
188
                              if(!$model instanceof TaxOption){
  
                                  \Yii::$app->response->redirect(['site/error'],404);
                              } else {
                                  $array[$optionList] = $model->value->value;
                              }
  
466144f8   Administrator   20.07.16
189
190
191
  
  
                          }
dc6809dc   Administrator   23.06.16
192
  
dc6809dc   Administrator   23.06.16
193
  
dc6809dc   Administrator   23.06.16
194
195
  
                      }
7f7c8e5e   Dmytry Fedorchuk   Seo brand
196
  
466144f8   Administrator   20.07.16
197
198
199
200
201
                      $title_string = $this->getTitleString($array);
  
                      if($title_string){
                          return $title_string;
                      }
dc6809dc   Administrator   23.06.16
202
  
466144f8   Administrator   20.07.16
203
204
205
                  }
  
                  if (!empty($title)) {
d482cb6f   Administrator   29.06.16
206
                      return $title;
7f7c8e5e   Dmytry Fedorchuk   Seo brand
207
                  } else  {
d482cb6f   Administrator   29.06.16
208
                      return $this->project_name;
1f3add0a   Dmytry Fedorchuk   All seo
209
                  }
1f3add0a   Dmytry Fedorchuk   All seo
210
  
3f2bc3d0   Administrator   first commit
211
212
213
214
                  break;
              case self::DESCRIPTION:
                  $description = $this->selectSeoData(self::DESCRIPTION);
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
215
                  if (!empty($description)) {
3f2bc3d0   Administrator   first commit
216
217
218
  
                      $this->getView()->registerMetaTag([
                          'name' => 'description',
0d0c080c   Dmytry Fedorchuk   seo module filter...
219
                          'content' => $description
3f2bc3d0   Administrator   first commit
220
221
222
223
224
                      ]);
  
                  }
  
                  break;
0d0c080c   Dmytry Fedorchuk   seo module filter...
225
              case self::META:
e8923005   Administrator   29.06.16
226
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
227
228
                  $meta = $this->selectSeoData(self::META);
  
f5bc3759   Administrator   20.07.16
229
                  $filter = \Yii::$app->request->get('filters', []);
e21450c9   Dmytry Fedorchuk   SEO
230
                  $sort = \Yii::$app->request->get('sort', []);
0e51e661   Dmytry Fedorchuk   paginate seo
231
                  $paginate = \Yii::$app->request->get('page', []);
0d0c080c   Dmytry Fedorchuk   seo module filter...
232
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
233
  
9fae793b   Dmytry Fedorchuk   All seo
234
  
8afa1bf2   Administrator   29.06.16
235
                  if (!empty($meta)) {
9fae793b   Dmytry Fedorchuk   All seo
236
  
8afa1bf2   Administrator   29.06.16
237
238
239
240
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => $meta
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
241
  
8afa1bf2   Administrator   29.06.16
242
                  } else if(!empty($filter['special'])){
0d0c080c   Dmytry Fedorchuk   seo module filter...
243
  
8afa1bf2   Administrator   29.06.16
244
245
246
247
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,follow'
                      ]);
0d0c080c   Dmytry Fedorchuk   seo module filter...
248
  
8afa1bf2   Administrator   29.06.16
249
250
                  } else if (
                      isset($filter['brands']) && count($filter['brands']) > 1
a4d63ed9   Administrator   20.07.16
251
252
253
                      || isset($filter["pol"]) && count($filter["pol"]) > 1
                      || isset($filter["naznacenie"]) && count($filter["naznacenie"]) > 1
                      || isset($filter["god"]) && count($filter["god"]) > 1
e8923005   Administrator   29.06.16
254
  
8afa1bf2   Administrator   29.06.16
255
256
257
258
259
260
261
                  ) {
                      $this->getView()->registerMetaTag([
                          'name' => 'robots',
                          'content' => 'noindex,nofollow'
                      ]);
  
                  } else if (
a4d63ed9   Administrator   20.07.16
262
263
                      isset($filter['brands']) && count($filter['brands']) <= 1 && isset($filter) && count($filter, COUNT_RECURSIVE) >= 4
                      || isset($filter) && count($filter, COUNT_RECURSIVE) > 4
8afa1bf2   Administrator   29.06.16
264
265
266
267
268
269
270
271
272
273
274
275
                      || !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
276
                  }
0d0c080c   Dmytry Fedorchuk   seo module filter...
277
278
  
  
e8923005   Administrator   29.06.16
279
280
  
  
0d0c080c   Dmytry Fedorchuk   seo module filter...
281
                  break;
3f2bc3d0   Administrator   first commit
282
283
284
285
286
287
288
289
          }
  
  
      }
  
      protected function replaceData($str)
      {
  
e21450c9   Dmytry Fedorchuk   SEO
290
291
292
          if (!empty($this->fields)) {
              foreach ($this->fields as $field_name => $field_value) {
                  $str = str_replace('{' . $field_name . '}', $field_value, $str);
3f2bc3d0   Administrator   first commit
293
294
295
              }
          }
          $str = str_replace('{project_name}', $this->project_name, $str);
4495dea0   Administrator   проапдейтил роли
296
          return $str;
3f2bc3d0   Administrator   first commit
297
298
      }
  
1b898c16   Administrator   20.07.16
299
      protected static function findSeoByUrl($url)
3f2bc3d0   Administrator   first commit
300
      {
1b898c16   Administrator   20.07.16
301
302
303
304
305
          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
306
307
308
309
      }
  
      protected function findSeoByDynamic()
      {
1f3add0a   Dmytry Fedorchuk   All seo
310
311
312
313
314
315
  
          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
316
  
1f3add0a   Dmytry Fedorchuk   All seo
317
              $query = SeoDynamic::find()->joinWith('seoCategory')->where(['controller' => \Yii::$app->controller->id, 'action' => \Yii::$app->controller->action->id]);
3f2bc3d0   Administrator   first commit
318
          }
1f3add0a   Dmytry Fedorchuk   All seo
319
  
3f2bc3d0   Administrator   first commit
320
321
322
323
          return $query->one();
      }
  
  
466144f8   Administrator   20.07.16
324
325
326
327
328
      protected function findSeoByDynamicForFilters(){
          return SeoDynamic::find()->joinWith('seoCategory')->where(['param' =>'filters'])->one();
      }
  
  
e21450c9   Dmytry Fedorchuk   SEO
329
330
      protected function getViewData()
      {
3f2bc3d0   Administrator   first commit
331
          $params = $this->getView()->params;
e21450c9   Dmytry Fedorchuk   SEO
332
          if (isset($params['seo'])) {
3f2bc3d0   Administrator   first commit
333
334
335
336
337
338
              return $params['seo'];
          } else {
              return [];
          }
      }
  
e21450c9   Dmytry Fedorchuk   SEO
339
340
      protected function selectSeoData($param)
      {
3f2bc3d0   Administrator   first commit
341
342
          $result = '';
  
1b898c16   Administrator   20.07.16
343
          $widgetData = static::findSeoByUrl($this->url);
3f2bc3d0   Administrator   first commit
344
  
e21450c9   Dmytry Fedorchuk   SEO
345
          if ($widgetData instanceof \common\models\Seo) {
3f2bc3d0   Administrator   first commit
346
  
e21450c9   Dmytry Fedorchuk   SEO
347
              $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
348
  
e21450c9   Dmytry Fedorchuk   SEO
349
          } else if (!empty($this->$param)) {
3f2bc3d0   Administrator   first commit
350
351
  
              $result = $this->$param;
3f2bc3d0   Administrator   first commit
352
353
354
355
          } else {
  
              $widgetData = $this->findSeoByDynamic();
  
e21450c9   Dmytry Fedorchuk   SEO
356
              if ($widgetData instanceof SeoDynamic) {
3f2bc3d0   Administrator   first commit
357
  
e21450c9   Dmytry Fedorchuk   SEO
358
                  $result = $widgetData->$param;
3f2bc3d0   Administrator   first commit
359
360
361
362
363
364
365
366
367
  
              }
  
          }
  
          return $this->replaceData($result);
  
      }
  
1f3add0a   Dmytry Fedorchuk   All seo
368
      public function getTitleString($array){
466144f8   Administrator   20.07.16
369
370
371
372
373
374
375
376
  
          $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
377
          }
466144f8   Administrator   20.07.16
378
379
  
          return false;
1f3add0a   Dmytry Fedorchuk   All seo
380
381
382
  
      }
  
3f2bc3d0   Administrator   first commit
383
384
  
  }