Sitemap.php
4.19 KB
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;
}
}