LangLink.php
3.42 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
<?php
namespace artbox\core\widgets;
use artbox\core\models\Language;
use yii\base\Widget;
use yii\bootstrap\Html;
use yii\helpers\Url;
use yii\log\Logger;
class LangLink extends Widget
{
public $languageIds = [];
public $links = [];
public function init()
{
if (empty($this->languageIds)) {
$this->languageIds = Language::find()
->select(
[
'url',
'id',
]
)
->where([ 'status' => true ])
->asArray()
->indexBy('id')
->column();
}
if (count($this->languageIds) < 2) {
return;
}
foreach ($this->languageIds as $languageId => $url) {
if (Language::getCurrent()->id !== $languageId) {
$this->links[ $languageId ] = Html::a(
$url,
Url::to(
[ \Yii::$app->requestedRoute ] + \Yii::$app->request->get(
) + [ 'language_id' => $languageId ],
true
)
);
} else {
$this->links[ $languageId ] = $url;
}
}
}
public function run()
{
return $this->render('_langLink');
}
protected function mapAliases(array $aliases): array
{
$map = [];
$result = [];
$currentLanguageId = Language::getCurrent()->id;
foreach ($aliases as $alias) {
if ($alias[ 'language_id' ] === $currentLanguageId) {
$map[ $alias[ 'route' ] ][ 0 ] = $alias[ 'value' ];
} else {
$map[ $alias[ 'route' ] ][ 1 ] = $alias[ 'value' ];
}
}
foreach ($map as $route => $alias) {
if (!empty($alias[ 0 ]) && !empty($alias[ 1 ])) {
$result[ $alias[ 0 ] ] = $alias[ 1 ];
} else {
\Yii::getLogger()
->log("Missing alias for route $route.", Logger::LEVEL_ERROR);
}
}
return $result;
}
protected function replaceParams(array $map): array
{
$params = \Yii::$app->request->get();
if (isset($params[ 'filter' ])) {
$filter = explode('_', $params[ 'filter' ]);
}
if (array_key_exists($params[ 'category' ], $map)) {
$params[ 'category' ] = $map[ $params[ 'category' ] ];
}
if (!empty($filter)) {
foreach ($filter as $index => $item) {
if (array_key_exists($item, $map)) {
$filter[ $index ] = $map[ $item ];
}
}
$params[ 'filter' ] = implode('_', $filter);
}
return $params;
}
}