Blame view

console/controllers/SiteMapController.php 8.17 KB
38ed47e1   Administrator   20.07.16
1
2
3
4
5
6
7
8
9
10
  <?php
  
  namespace console\controllers;
  
  use common\models\Articles;
  use common\models\Seo;
  use common\modules\product\helpers\FilterHelper;
  use common\modules\product\models\Brand;
  use common\modules\product\models\Category;
  use common\modules\product\models\Product;
126e8b02   Administrator   rm node nodule
11
  use common\modules\product\models\ProductVariant;
38ed47e1   Administrator   20.07.16
12
13
14
15
  use frontend\models\ProductFrontendSearch;
  use Yii;
  use common\models\Page;
  use common\models\PageSearch;
126e8b02   Administrator   rm node nodule
16
17
  use yii\data\Pagination;
  use yii\db\ActiveQuery;
38ed47e1   Administrator   20.07.16
18
19
20
21
22
23
  use yii\helpers\ArrayHelper;
  use yii\helpers\Url;
  use yii\console\Controller;
  use yii\web\NotFoundHttpException;
  use yii\filters\VerbFilter;
  use developeruz\db_rbac\behaviors\AccessBehavior;
315ebf90   Alex Savenko   sitemap controlle...
24
25
  
  
38ed47e1   Administrator   20.07.16
26
27
28
29
30
31
  /**
   * PageController implements the CRUD actions for Page model.
   */
  class SiteMapController extends Controller
  {
  
ed79ac78   Yarik   Https possible fixes
32
      private $urlList = ['https://www.rukzachok.com.ua/'];
fccb31d5   Alex Savenko   sitemap controlle...
33
      private $urlBlockedList = [];
38ed47e1   Administrator   20.07.16
34
35
      private $count = 1;
  
315ebf90   Alex Savenko   sitemap controlle...
36
      public function getAddStatic() {
3d1a900d   Alex Savenko   sitemap controlle...
37
  
315ebf90   Alex Savenko   sitemap controlle...
38
          return [
ed79ac78   Yarik   Https possible fixes
39
40
              'https://www.rukzachok.com.ua',
              'https://www.rukzachok.com.ua/catalog'
315ebf90   Alex Savenko   sitemap controlle...
41
          ];
3d1a900d   Alex Savenko   sitemap controlle...
42
  
315ebf90   Alex Savenko   sitemap controlle...
43
44
45
      }
  
      public function getStaticPages() {
3d1a900d   Alex Savenko   sitemap controlle...
46
  
315ebf90   Alex Savenko   sitemap controlle...
47
          return Page::find()->all();
3d1a900d   Alex Savenko   sitemap controlle...
48
  
315ebf90   Alex Savenko   sitemap controlle...
49
50
51
      }
  
      public function getCategories() {
3d1a900d   Alex Savenko   sitemap controlle...
52
  
8a41134e   Alex Savenko   sitemap controlle...
53
          return Category::find()->andWhere(['not like', 'meta_robots', 'noindex'])->all();
3d1a900d   Alex Savenko   sitemap controlle...
54
  
315ebf90   Alex Savenko   sitemap controlle...
55
      }
38ed47e1   Administrator   20.07.16
56
  
d57c2c62   Alex Savenko   sitemap controlle...
57
      public function checkFilter($category, $filter) {
3d1a900d   Alex Savenko   sitemap controlle...
58
  
38ed47e1   Administrator   20.07.16
59
60
          $productModel = new ProductFrontendSearch();
          $productProvider = $productModel->search($category, $filter);
a54d86cf   Alex Savenko   sitemapcontroller...
61
          if(!empty($productProvider->models)){
38ed47e1   Administrator   20.07.16
62
             return true;
a54d86cf   Alex Savenko   sitemapcontroller...
63
          } else {
38ed47e1   Administrator   20.07.16
64
             return false;
a54d86cf   Alex Savenko   sitemapcontroller...
65
          }
3d1a900d   Alex Savenko   sitemap controlle...
66
  
38ed47e1   Administrator   20.07.16
67
68
      }
  
38ed47e1   Administrator   20.07.16
69
      public function getProducts() {
3d1a900d   Alex Savenko   sitemap controlle...
70
  
38ed47e1   Administrator   20.07.16
71
72
73
74
          return Product::find()->all();
  
      }
  
38ed47e1   Administrator   20.07.16
75
      public function getSeoLinks() {
3d1a900d   Alex Savenko   sitemap controlle...
76
  
fccb31d5   Alex Savenko   sitemap controlle...
77
78
79
80
81
82
          return Seo::find()->all();
  
      }
  
      public function getBlocked() {
  
9014e327   Alex Savenko   sitemap controlle...
83
          return Seo::find()->where(['like', 'meta', 'noindex'])->all();
3d1a900d   Alex Savenko   sitemap controlle...
84
  
38ed47e1   Administrator   20.07.16
85
86
      }
  
d57c2c62   Alex Savenko   sitemap controlle...
87
      public function getArticles() {
3d1a900d   Alex Savenko   sitemap controlle...
88
  
38ed47e1   Administrator   20.07.16
89
          return Articles::find()->all();
3d1a900d   Alex Savenko   sitemap controlle...
90
  
38ed47e1   Administrator   20.07.16
91
92
      }
  
d57c2c62   Alex Savenko   sitemap controlle...
93
      public function getBrands($category) {
38ed47e1   Administrator   20.07.16
94
95
96
97
  
          return $category->brands;
      }
  
f9849059   Administrator   06.09.16
98
99
100
101
      /**
       * @param $category Category;
       * @return mixed
       */
d57c2c62   Alex Savenko   sitemap controlle...
102
      public function getFilters($category) {
38ed47e1   Administrator   20.07.16
103
104
105
106
107
  
          return $category->getActiveFilters()->all();
  
      }
  
d57c2c62   Alex Savenko   sitemap controlle...
108
      public function checkUrl($url) {
a54d86cf   Alex Savenko   sitemapcontroller...
109
110
111
112
113
  
          if (preg_match('/filters:[^=]+=[^=]+;[^=]+=[^=]+/', $url)) {
              $reverse_url = preg_replace('/filters:([^=]+=[^=]+);([^=]+=[^=]+)/', 'filters:$2;$1', $url);
          }
  
fccb31d5   Alex Savenko   sitemap controlle...
114
          if(in_array($url, $this->urlList) || (isset($reverse_url) && in_array($reverse_url, $this->urlList)) || in_array($url, $this->urlBlockedList)) {
a54d86cf   Alex Savenko   sitemapcontroller...
115
116
              return false;
          } else {
38ed47e1   Administrator   20.07.16
117
118
              $this->urlList[] = $url;
              return true;
38ed47e1   Administrator   20.07.16
119
          }
3d1a900d   Alex Savenko   sitemap controlle...
120
  
38ed47e1   Administrator   20.07.16
121
122
      }
  
d57c2c62   Alex Savenko   sitemap controlle...
123
      public function createRow( $url, $priority, &$content ) {
3d1a900d   Alex Savenko   sitemap controlle...
124
  
38ed47e1   Administrator   20.07.16
125
126
127
          if($this->checkUrl($url)){
              print $this->count++ . "\n";
              $content .= '<url>' .
126e8b02   Administrator   rm node nodule
128
                  '<loc>' . htmlspecialchars($url) . '</loc>' .
38ed47e1   Administrator   20.07.16
129
                  '<lastmod>' . date('Y-m-d') . '</lastmod>' .
126e8b02   Administrator   rm node nodule
130
                  '<changefreq>Weekly</changefreq>' .
38ed47e1   Administrator   20.07.16
131
132
133
                  '<priority>' . $priority .'</priority>' .
                  '</url>';
          }
3d1a900d   Alex Savenko   sitemap controlle...
134
  
38ed47e1   Administrator   20.07.16
135
136
      }
  
38ed47e1   Administrator   20.07.16
137
138
139
140
141
142
143
144
145
146
      public function actionProcess() {
  
          $config = ArrayHelper::merge(
              require(__DIR__ . '/../../frontend/config/main.php'),
              require(__DIR__ . '/../../common/config/main.php')
  
          );
  
          Yii::$app->urlManager->addRules($config['components']['urlManager']['rules']);
  
dbceaf12   Administrator   20.07.16
147
          $dirName = Yii::getAlias('@frontend').'/web';
38ed47e1   Administrator   20.07.16
148
  
dbceaf12   Administrator   20.07.16
149
          $filename = 'sitemap.xml';
38ed47e1   Administrator   20.07.16
150
151
  
          setlocale(LC_ALL, 'ru_RU.CP1251');
3d1a900d   Alex Savenko   sitemap controlle...
152
  
38ed47e1   Administrator   20.07.16
153
154
155
156
          $handle = fopen($dirName .'/'. $filename, "w");
  
          $content = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
  
fccb31d5   Alex Savenko   sitemap controlle...
157
158
159
160
161
162
          //init $urlBlockedList
          foreach ($this->getBlocked() as $link) {
              $url = Yii::$app->urlManager->baseUrl.$link->url;
              $this->urlBlockedList[] = $url;
          }
  
dde8e67e   Alex Savenko   sitemap controlle...
163
          //home page + home catalog
38ed47e1   Administrator   20.07.16
164
          foreach ($this->getAddStatic() as $page) {
dbceaf12   Administrator   20.07.16
165
              $this->createRow($page , 1,$content);
38ed47e1   Administrator   20.07.16
166
167
          }
  
dde8e67e   Alex Savenko   sitemap controlle...
168
          //static pages (contacts, about, etc)
38ed47e1   Administrator   20.07.16
169
170
171
172
173
          foreach ($this->getStaticPages() as $page) {
              $url = Url::to(['text/index','translit' => $page->translit]);
              $this->createRow($url , 1,$content);
          }
  
dde8e67e   Alex Savenko   sitemap controlle...
174
          //categories
38ed47e1   Administrator   20.07.16
175
          foreach ($this->getCategories() as $category) {
126e8b02   Administrator   rm node nodule
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
              /**
               * @var $query  ActiveQuery
               */
              $query = $category->getProducts()->select(['product.*']);
              $query->joinWith(['enabledVariants']);
              $query->andWhere(['!=', ProductVariant::tableName() .'.stock', 0]);
              $count = $query->count();
              $pages = new Pagination(['totalCount' => $count,'pageSize'=>16]);
  
  
              for($i=1; $i<=$pages->getPageCount(); $i++){
                  if($i==1){
                      $url = Url::to(['catalog/category', 'category' => $category]);
                  } else {
                      $url = Url::to(['catalog/category', 'category' => $category, 'page'=>$i, 'per-page'=>$pages->pageSize]);
                  }
                  $this->createRow($url , 1,$content);
              }
38ed47e1   Administrator   20.07.16
194
195
          }
  
dde8e67e   Alex Savenko   sitemap controlle...
196
          //products
3d1a900d   Alex Savenko   sitemap controlle...
197
198
199
200
201
202
          foreach ($this->getProducts() as $product) {
  
              $url = Url::to(['catalog/product', 'product' => $product]);
              $this->createRow($url , 0.9, $content);
          }
  
dde8e67e   Alex Savenko   sitemap controlle...
203
          //articles
3d1a900d   Alex Savenko   sitemap controlle...
204
205
          foreach ($this->getArticles() as $article) {
  
08cb3deb   Alex Savenko   sitemap controlle...
206
              $url = Url::to(['articles/show', 'translit' => $article->translit]);
3d1a900d   Alex Savenko   sitemap controlle...
207
208
209
210
211
              $this->createRow($url , 0.8,$content);
  
          }
  
          //brands
8fd6962f   Alex Savenko   sitemap controlle...
212
          foreach($this->getCategories() as $category) {
c79ebdb9   Alex Savenko   sitemap controlle...
213
  
8fd6962f   Alex Savenko   sitemap controlle...
214
215
              foreach ($this->getBrands($category) as $brand) {
                  if($this->checkFilter($category, ['brands' => [$brand->brand_id]])){
3f16b059   Alex Savenko   sitemap controlle...
216
                      $url = Url::to(['catalog/category', 'category' => $category, 'filters' => ['brands' => [$brand->alias]]]);
8fd6962f   Alex Savenko   sitemap controlle...
217
218
219
                      $this->createRow($url , 0.8, $content);
                  }
              }
c79ebdb9   Alex Savenko   sitemap controlle...
220
  
3f16b059   Alex Savenko   sitemap controlle...
221
              foreach ($this->getBrands($category) as $brand) {
6aa51c0d   Alex Savenko   sitemap controlle...
222
                  $url = Url::to(['catalog/brand', 'brand' => $brand->alias]);
3f16b059   Alex Savenko   sitemap controlle...
223
                  $this->createRow($url, 0.8, $content);
62ffca64   Alex Savenko   sitemap controlle...
224
              }
c79ebdb9   Alex Savenko   sitemap controlle...
225
  
62ffca64   Alex Savenko   sitemap controlle...
226
227
          }
  
3f16b059   Alex Savenko   sitemap controlle...
228
          //filters 1 lvl
783ae9be   Alex Savenko   sitemap controlle...
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
          foreach($this->getCategories() as $category) {
              foreach ($this->getFilters($category) as $filter) {
                  if($this->checkFilter($category, [$filter['group_alias'] => [$filter['option_alias']]])){
                      $url = Url::to(['catalog/category', 'category' => $category, 'filters' => [$filter['group_alias'] => [$filter['option_alias']]] ]);
                      $this->createRow($url , 0.8, $content);
                  }
  
              }
          }
  
          //seo links
          foreach($this->getSeoLinks() as $link) {
              $url = Yii::$app->urlManager->baseUrl.$link->url;
              $this->createRow($url , 0.7, $content);
  
          }
  
          //filters 2 lvl
          foreach($this->getCategories() as $category) {
              foreach ($this->getFilters($category) as $filter1) {
                  foreach ($this->getFilters($category) as $filter2) {
                      if($this->checkFilter($category, [$filter1['group_alias'] => [$filter1['option_alias']],$filter2['group_alias'] => [$filter2['option_alias']]] )){
                          $url = Url::to(['catalog/category', 'category' => $category, 'filters' => [$filter1['group_alias'] => [$filter1['option_alias']],$filter2['group_alias'] => [$filter2['option_alias']]] ]);
                          $this->createRow($url , 0.7, $content);
                      }
  
                  }
  
                  foreach ($this->getBrands($category) as $brand) {
                      if($this->checkFilter($category, ['brands' => [$brand->brand_id], $filter1['group_alias'] =>  [$filter1['option_alias']]] )){
                          $url = Url::to(['catalog/category', 'category' => $category, 'filters' => ['brands' => [$brand->alias],$filter1['group_alias'] => [$filter1['option_alias']]]]);
                          $this->createRow($url , 0.7,$content);
                      }
  
                  }
              }
          }
38ed47e1   Administrator   20.07.16
266
267
268
269
270
271
272
273
274
275
276
277
  
  
  
          $content .= '</urlset>';
  
          fwrite($handle, $content);
          fclose($handle);
  
          print $dirName .'/'. $filename;
      }
  
  }