Blame view

common/components/Sitemap.php 4.19 KB
a42025b8   Yarik   Sitemap and slugb...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  <?php
      namespace common\components;
      
      use common\models\SitemapDynamic;
      use common\models\SitemapStatic;
      use yii\base\Object;
      use yii\db\ActiveRecord;
      use yii\helpers\Html;
      use yii\helpers\Url;
      
      class Sitemap extends Object
      {
          public $entities = [];
          public $path = '@frontend/web/sitemap.xml';
          
          /**
           * Generate sitemap XML in $path
           *
           * @return bool
           */
          public function generateXML(): bool
          {
              return $this->saveXML($this->generateOneShot());
          }
          
          /**
           * Save generated xml to $path file
           *
           * @param string $xml
           *
           * @return bool
           */
          protected function saveXML(string $xml): bool
          {
              $realpath = \Yii::getAlias($this->path);
              if (file_put_contents($realpath, $xml)) {
                  return true;
              } else {
                  return false;
              }
          }
          
          /**
           * Generate xml from configs
           *
           * @return string
           */
          public function generateOneShot(): string
          {
              $content = '<?xml version="1.0" encoding="UTF-8"?>';
              $content .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
              /**
               * @var SitemapStatic[] $static
               */
              // ***** Begin generating static pages
              $static = SitemapStatic::find()
                                     ->all();
              foreach ($static as $item) {
                  $content .= Html::tag(
                      'url',
                      Html::tag('loc', $item->url) . Html::tag('lastmod', date('Y-m-d')) . Html::tag(
                          'changefreq',
                          'monthly'
                      ) . Html::tag('priority', $item->priority)
                  );
              }
              // ***** <<< End
              /**
               * @var SitemapDynamic $dynamic
               */
              $dynamic = SitemapDynamic::find()
                                       ->indexBy('entity')
                                       ->where([ 'status' => 1 ])
                                       ->all();
              $entities = $this->entities;
              foreach ($entities as $entity) {
                  /**
                   * @var string $class
                   */
                  $class = $entity[ 'class' ];
                  /**
                   * @var ActiveRecord $classInstance
                   */
                  $classInstance = new $class();
                  if (is_subclass_of($classInstance, ActiveRecord::className())) {
                      if (!empty( $dynamic[ $class ] )) {
                          /**
                           * @var SitemapDynamic $model
                           */
                          $model = $dynamic[ $class ];
                          $query = $classInstance::find();
                          if (isset( $entity[ 'conditions' ] )) {
                              foreach ($entity[ 'conditions' ] as $condition) {
                                  $query->where($condition);
                              }
                          }
                          $result = $query->all();
                          foreach ($result as $record) {
                              $content .= Html::tag(
                                  'url',
                                  Html::tag(
                                      'loc',
                                      Url::to(
                                          [
                                              $entity[ 'url' ],
                                              'id' => $record->getAttribute('id'),
                                          ],
                                          true
                                      )
                                  ) . Html::tag('lastmod', date('Y-m-d')) . Html::tag(
                                      'changefreq',
                                      'monthly'
                                  ) . Html::tag('priority', $model->priority)
                              );
                          }
                      }
                  }
              }
              $content .= '</urlset>';
              return $content;
          }
      }