a42025b8
Yarik
Sitemap and slugb...
|
1
2
3
4
5
6
7
8
|
<?php
namespace common\components;
use common\models\SitemapDynamic;
use common\models\SitemapStatic;
use yii\base\Object;
use yii\db\ActiveRecord;
use yii\helpers\Html;
|
9af79e71
Yarik
Sitemap and slugb...
|
9
|
use yii\web\UrlManager;
|
a42025b8
Yarik
Sitemap and slugb...
|
10
11
12
13
14
|
class Sitemap extends Object
{
public $entities = [];
public $path = '@frontend/web/sitemap.xml';
|
9af79e71
Yarik
Sitemap and slugb...
|
15
|
public $url = 'sitemap.xml';
|
a42025b8
Yarik
Sitemap and slugb...
|
16
17
|
/**
|
9af79e71
Yarik
Sitemap and slugb...
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
* Get absolute url to sitemap.xml
*
* @return string
*/
public function getUrl(): string
{
/**
* @var UrlManager $urlManager
*/
$urlManager = \Yii::$app->get('urlManagerFrontend');
return $urlManager->createAbsoluteUrl('/' . $this->url);
}
/**
* Check whether sitemap.xml exist
*
* @return bool
*/
public function checkFileExist(): bool
{
return file_exists(\Yii::getAlias($this->path));
}
/**
|
a42025b8
Yarik
Sitemap and slugb...
|
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
|
* 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
{
|
9af79e71
Yarik
Sitemap and slugb...
|
74
75
76
77
|
/**
* @var UrlManager $urlManager
*/
$urlManager = \Yii::$app->get('urlManagerFrontend');
|
a42025b8
Yarik
Sitemap and slugb...
|
78
79
80
81
82
83
84
85
86
87
88
89
90
|
$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',
|
9af79e71
Yarik
Sitemap and slugb...
|
91
|
$item->frequency
|
a42025b8
Yarik
Sitemap and slugb...
|
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
123
124
125
126
127
128
129
130
|
) . 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',
|
9af79e71
Yarik
Sitemap and slugb...
|
131
|
$urlManager->createAbsoluteUrl(
|
a42025b8
Yarik
Sitemap and slugb...
|
132
133
134
|
[
$entity[ 'url' ],
'id' => $record->getAttribute('id'),
|
9af79e71
Yarik
Sitemap and slugb...
|
135
|
]
|
a42025b8
Yarik
Sitemap and slugb...
|
136
137
138
|
)
) . Html::tag('lastmod', date('Y-m-d')) . Html::tag(
'changefreq',
|
9af79e71
Yarik
Sitemap and slugb...
|
139
|
$model->frequency
|
a42025b8
Yarik
Sitemap and slugb...
|
140
141
142
143
144
145
146
147
148
149
|
) . Html::tag('priority', $model->priority)
);
}
}
}
}
$content .= '</urlset>';
return $content;
}
}
|