Blame view

frontend/widgets/LangLink.php 7.54 KB
950817c6   Alex Savenko   first commit
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  <?php
      
      namespace frontend\widgets;
      
      use artbox\core\models\Alias;
      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) {
                      if (\Yii::$app->requestedRoute == 'category/view') {
                          $aliasValues = [ \Yii::$app->request->get('category') ];
                          $filter = \Yii::$app->request->get('filter');
                          if (!empty($filter)) {
                              $aliasValues = array_merge($aliasValues, explode('_', $filter));
                          }
                          if (!empty($aliasValues)) {
                              $aliases = Alias::find()
                                              ->where(
                                                  [
                                                      'route' => Alias::find()
                                                                      ->select('route')
                                                                      ->where([ 'value' => $aliasValues ]),
                                                  ]
                                              )
                                              ->andWhere(
                                                  [
                                                      'language_id' => [
                                                          $languageId,
                                                          Language::getCurrent()->id,
                                                      ],
                                                  ]
                                              )
                                              ->asArray()
                                              ->all();
                              $map = $this->mapAliases($aliases);
                              $params = $this->replaceParams($map);
                              $this->links[ $languageId ] = Html::a(
                                  $url,
                                  Url::to(
                                      [ \Yii::$app->requestedRoute ] + $params + [ 'language_id' => $languageId ],
                                      true
                                  )
                              );
                          } else {
                              $this->links[ $languageId ] = $url;
                          }
                      } elseif (\Yii::$app->requestedRoute == 'special/category') {
                          $aliasValue = \Yii::$app->request->get('category');
                          if (!empty($aliasValue)) {
                              $aliases = Alias::find()
                                              ->where(
                                                  [
                                                      'route' => Alias::find()
                                                                      ->select('route')
                                                                      ->where([ 'value' => $aliasValue ]),
                                                  ]
                                              )
                                              ->andWhere(
                                                  [
                                                      'language_id' => [
                                                          $languageId,
                                                          Language::getCurrent()->id,
                                                      ],
                                                  ]
                                              )
                                              ->asArray()
                                              ->all();
                              $map = $this->mapAliases($aliases);
                              $params = $this->replaceParams($map);
                              $this->links[ $languageId ] = Html::a(
                                  $url,
                                  Url::to(
                                      [ \Yii::$app->requestedRoute ] + $params + [ 'language_id' => $languageId ],
                                      true
                                  )
                              );
                          } else {
                              $this->links[ $languageId ] = $url;
                          }
                      } else {
                          $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;
          }
      }