Commit 7164d2a700617423e5840cfccd8e969a0b049412
1 parent
7dfb61f2
1)Cделал редирект / в .htaccess
2) В страницах выводится seo->h1 если не присвоен свой заголовок в Page table
Showing
3 changed files
with
237 additions
and
234 deletions
Show diff stats
.htaccess
@@ -4,6 +4,11 @@ AddDefaultCharset utf-8 | @@ -4,6 +4,11 @@ AddDefaultCharset utf-8 | ||
4 | <IfModule mod_rewrite.c> | 4 | <IfModule mod_rewrite.c> |
5 | RewriteEngine On | 5 | RewriteEngine On |
6 | 6 | ||
7 | + | ||
8 | + # Remove trailing slashes | ||
9 | + RewriteCond %{REQUEST_FILENAME} !-d | ||
10 | + RewriteRule ^(.*)/$ /$1 [L,R=301] | ||
11 | + | ||
7 | # the main rewrite rule for the frontend application | 12 | # the main rewrite rule for the frontend application |
8 | RewriteCond %{REQUEST_URI} !^/(backend/web|admin|storage) | 13 | RewriteCond %{REQUEST_URI} !^/(backend/web|admin|storage) |
9 | RewriteRule !^frontend/web /frontend/web%{REQUEST_URI} [L] | 14 | RewriteRule !^frontend/web /frontend/web%{REQUEST_URI} [L] |
frontend/components/UrlManager.php
1 | <?php | 1 | <?php |
2 | - | ||
3 | - namespace frontend\components; | ||
4 | - | ||
5 | - use artbox\core\models\Alias; | ||
6 | - use artbox\core\models\Language; | ||
7 | - use artbox\core\services\Languages; | ||
8 | - use yii\helpers\Json; | ||
9 | - use yii\web\NotFoundHttpException; | ||
10 | - use yii\web\Request; | ||
11 | - | ||
12 | - | ||
13 | - /** | ||
14 | - * Url manager extended to work with aliases and languages | ||
15 | - * | ||
16 | - * @package artbox\core\seo | ||
17 | - */ | ||
18 | - class UrlManager extends \yii\web\UrlManager | ||
19 | - { | ||
20 | - /** | ||
21 | - * @var bool | ||
22 | - */ | ||
23 | - public $hideDefaultLanguagePrefix = false; | ||
24 | - | ||
25 | - /** | ||
26 | - * @see \yii\web\UrlManager | ||
27 | - * @var bool | ||
28 | - */ | ||
29 | - public $enablePrettyUrl = true; | ||
30 | - | ||
31 | - /** | ||
32 | - * @see \yii\web\UrlManager | ||
33 | - * @var bool | ||
34 | - */ | ||
35 | - public $showScriptName = false; | ||
36 | - | ||
37 | - /** | ||
38 | - * @var \artbox\core\services\Languages | ||
39 | - */ | ||
40 | - protected $languages; | ||
41 | - | ||
42 | - /** | ||
43 | - * UrlManager constructor. | ||
44 | - * | ||
45 | - * @param \artbox\core\services\Languages $languages | ||
46 | - * @param array $config | ||
47 | - */ | ||
48 | - | ||
49 | - public $params = [ | ||
50 | - 'id' => 'id', | ||
51 | - 'page' => 'page', | ||
52 | - 'per-page' => 'per_page', | ||
53 | - 'book_id' => 'book_id', | ||
54 | - 'q' => 'q', | ||
55 | - 'tag' => 'tag', | ||
56 | - ]; | ||
57 | - public function __construct(Languages $languages, array $config = []) | ||
58 | - { | ||
59 | - $this->languages = $languages; | ||
60 | - | ||
61 | - parent::__construct($config); | ||
62 | - } | ||
63 | - | ||
64 | - /** | ||
65 | - * @param \yii\web\Request $request | ||
66 | - * | ||
67 | - * @return array|bool | ||
68 | - * @throws \artbox\core\exceptions\AliasOverwriteException | ||
69 | - * @throws \yii\base\ExitException | ||
70 | - * @throws \yii\base\InvalidConfigException | ||
71 | - */ | ||
72 | - public function parseRequest($request) | ||
73 | - { | ||
74 | - $redirect = $this->checkRedirect($request->url); | ||
75 | - | ||
76 | - if ($redirect !== null) { | ||
77 | - | ||
78 | - \Yii::$app->response->redirect("/" . $redirect->value, 301); | ||
79 | - } | ||
80 | - $request = $this->parseLanguage($request); | ||
81 | - $path=$request->pathInfo; | ||
82 | - | ||
83 | - if (strlen($path) && $path[strlen($path) - 1] == '/' | ||
84 | - # && $path[strlen($path)-2]=='/' | ||
85 | - ) | ||
86 | - { | ||
87 | - throw new NotFoundHttpException(); | ||
88 | - } | ||
89 | - | ||
90 | - | ||
91 | - /** | ||
92 | - * @var Alias $alias | ||
93 | - */ | ||
94 | - $alias = Alias::find() | ||
95 | - ->where( | ||
96 | - [ | ||
97 | - 'value' => trim($request->pathInfo, '/'), | ||
98 | - ] | ||
99 | - ) | ||
100 | - ->andWhere( | ||
101 | - [ | ||
102 | - 'language_id' => $this->languages->getCurrent()->id, | ||
103 | - ] | ||
104 | - ) | ||
105 | - ->one(); | ||
106 | - $this->invalidParams(\Yii::$app->request->queryParams); | ||
107 | - if ($alias !== null) { | ||
108 | - $params = Json::decode($alias->route); | ||
109 | - | ||
110 | - $route = array_shift($params); | ||
111 | - | ||
112 | - /** | ||
113 | - * @todo REFACTOR AS SOO AS POSIBLE! | ||
114 | - * remove service locator, and implement Dependency Injection | ||
115 | - * @var \artbox\core\components\SeoComponent $seo | ||
116 | - */ | ||
117 | - $seo = \Yii::$app->get('seo'); | ||
118 | - $seo->setAlias($alias); | ||
119 | - return [ | ||
120 | - $route, | ||
121 | - $params, | ||
122 | - ]; | ||
123 | - } | ||
124 | - | ||
125 | - return parent::parseRequest($request); | ||
126 | - } | ||
127 | - | ||
128 | - /** | ||
129 | - * @param array|string $params | ||
130 | - * | ||
131 | - * @return string | ||
132 | - */ | ||
133 | - public function createUrl($params) | ||
134 | - { | ||
135 | - if ($this->hideDefaultLanguagePrefix && ( $this->languages->getCurrent( | ||
136 | - )->url == $this->languages->getDefault()->url )) { | ||
137 | - $prefix = ''; | ||
138 | - } else { | ||
139 | - $prefix = '/' . $this->languages->getCurrent()->url; | ||
140 | - } | ||
141 | - | ||
142 | - if (isset($params[ 'alias' ])) { | ||
143 | - if ($params[ 'alias' ] instanceof Alias) { | ||
144 | - return $prefix . '/' . $params[ 'alias' ]->value; | ||
145 | - } elseif (is_array($params[ 'alias' ])) { | ||
146 | - return $prefix . '/' . $params[ 'alias' ][ 'value' ]; | ||
147 | - } | ||
148 | - } | ||
149 | - | ||
150 | - return $prefix . parent::createUrl($params); | ||
151 | - } | ||
152 | - | ||
153 | - /** | ||
154 | - * @param $request | ||
155 | - * | ||
156 | - * @return mixed | ||
157 | - * @throws \yii\base\ExitException | ||
158 | - * @throws \yii\base\InvalidConfigException | ||
159 | - */ | ||
160 | - protected function parseLanguage(Request $request) | ||
161 | - { | ||
162 | - $split = explode('/', $request->pathInfo); | ||
163 | - if (in_array($split[ 0 ], array_keys($this->languages->getActive()))) { | ||
164 | - if ($this->hideDefaultLanguagePrefix && ( $split[ 0 ] == $this->languages->getDefault()->url )) { | ||
165 | - unset($split[ 0 ]); | ||
166 | - | ||
167 | - \Yii::$app->response->redirect('/' . implode('/', $split), 301) | ||
168 | - ->send(); | ||
169 | - \Yii::$app->end(); | ||
170 | - } else { | ||
171 | - $this->languages->setCurrent($split[ 0 ]); | ||
172 | - | ||
173 | - unset($split[ 0 ]); | ||
174 | - | ||
175 | - $request->setPathInfo(implode('/', $split)); | ||
176 | - } | ||
177 | - } else { | ||
178 | - if ($this->hideDefaultLanguagePrefix) { | ||
179 | - $this->languages->setCurrentDefault(); | ||
180 | - } else { | ||
181 | - \Yii::$app->response->redirect( | ||
182 | - '/' . $this->languages->getDefault()->url . '/' . implode('/', $split), | ||
183 | - 301 | ||
184 | - ) | ||
185 | - ->send(); | ||
186 | - \Yii::$app->end(); | ||
187 | - } | ||
188 | - } | ||
189 | - | ||
190 | - return $request; | ||
191 | - } | ||
192 | - | ||
193 | - /** | ||
194 | - * Looks for rule in table(column) | ||
195 | - * `redirect.from` if findes - | ||
196 | - * redirects to `redirect.to` | ||
197 | - * | ||
198 | - * @param string $url | ||
199 | - */ | ||
200 | - protected function checkRedirect(string $url) | ||
201 | - { | ||
202 | - $url1 = parse_url($url); | ||
203 | - | ||
204 | - | ||
205 | - $string = '{"0":"' . ltrim($url1['path'], "/") . '"'; | ||
206 | - if (isset($url1['query'])) { | ||
207 | - parse_str($url1['query'], $url1['query']); | ||
208 | - $string .= (isset($url1['query']['id'])) | ||
209 | - ? ',"id":' . $url1['query']['id'] | ||
210 | - : ''; | ||
211 | - } | ||
212 | - | ||
213 | - $string .= '}'; | ||
214 | - | ||
215 | - $alias = Alias::find() | ||
216 | - ->where(['like', 'route', $string]) | ||
217 | - ->limit(1) | ||
218 | - ->one(); | ||
219 | - return $alias; | ||
220 | - | ||
221 | - | ||
222 | - | ||
223 | - | ||
224 | - } | ||
225 | - | ||
226 | - protected function invalidParams($requestParams){ | ||
227 | - foreach ($requestParams as $key =>$param){ | ||
228 | - | ||
229 | - if (!array_key_exists($key, $this->params)){ | ||
230 | - throw new NotFoundHttpException(); | ||
231 | - } | ||
232 | - } | ||
233 | - } | ||
234 | - } | ||
235 | \ No newline at end of file | 2 | \ No newline at end of file |
3 | + | ||
4 | +namespace frontend\components; | ||
5 | + | ||
6 | +use artbox\core\models\Alias; | ||
7 | +use artbox\core\models\Language; | ||
8 | +use artbox\core\services\Languages; | ||
9 | +use yii\helpers\Json; | ||
10 | +use yii\web\NotFoundHttpException; | ||
11 | +use yii\web\Request; | ||
12 | + | ||
13 | + | ||
14 | +/** | ||
15 | + * Url manager extended to work with aliases and languages | ||
16 | + * | ||
17 | + * @package artbox\core\seo | ||
18 | + */ | ||
19 | +class UrlManager extends \yii\web\UrlManager | ||
20 | +{ | ||
21 | + /** | ||
22 | + * @var bool | ||
23 | + */ | ||
24 | + public $hideDefaultLanguagePrefix = false; | ||
25 | + | ||
26 | + /** | ||
27 | + * @see \yii\web\UrlManager | ||
28 | + * @var bool | ||
29 | + */ | ||
30 | + public $enablePrettyUrl = true; | ||
31 | + | ||
32 | + /** | ||
33 | + * @see \yii\web\UrlManager | ||
34 | + * @var bool | ||
35 | + */ | ||
36 | + public $showScriptName = false; | ||
37 | + | ||
38 | + /** | ||
39 | + * @var \artbox\core\services\Languages | ||
40 | + */ | ||
41 | + protected $languages; | ||
42 | + | ||
43 | + /** | ||
44 | + * UrlManager constructor. | ||
45 | + * | ||
46 | + * @param \artbox\core\services\Languages $languages | ||
47 | + * @param array $config | ||
48 | + */ | ||
49 | + | ||
50 | + public $params = [ | ||
51 | + 'id' => 'id', | ||
52 | + 'page' => 'page', | ||
53 | + 'per-page' => 'per_page', | ||
54 | + 'book_id' => 'book_id', | ||
55 | + 'q' => 'q', | ||
56 | + 'tag' => 'tag', | ||
57 | + ]; | ||
58 | + | ||
59 | + public function __construct(Languages $languages, array $config = []) | ||
60 | + { | ||
61 | + $this->languages = $languages; | ||
62 | + | ||
63 | + parent::__construct($config); | ||
64 | + } | ||
65 | + | ||
66 | + /** | ||
67 | + * @param \yii\web\Request $request | ||
68 | + * | ||
69 | + * @return array|bool | ||
70 | + * @throws \artbox\core\exceptions\AliasOverwriteException | ||
71 | + * @throws \yii\base\ExitException | ||
72 | + * @throws \yii\base\InvalidConfigException | ||
73 | + */ | ||
74 | + public function parseRequest($request) | ||
75 | + { | ||
76 | + $redirect = $this->checkRedirect($request->url); | ||
77 | + | ||
78 | + if ($redirect !== null) { | ||
79 | + | ||
80 | + \Yii::$app->response->redirect("/" . $redirect->value, 301); | ||
81 | + } | ||
82 | + $request = $this->parseLanguage($request); | ||
83 | + $path = $request->pathInfo; | ||
84 | + | ||
85 | + if (strlen($path) && $path[strlen($path) - 1] == '/' | ||
86 | + # && $path[strlen($path)-2]=='/' | ||
87 | + ) { | ||
88 | + throw new NotFoundHttpException(); | ||
89 | + } | ||
90 | + | ||
91 | + | ||
92 | + /** | ||
93 | + * @var Alias $alias | ||
94 | + */ | ||
95 | + $alias = Alias::find() | ||
96 | + ->where( | ||
97 | + [ | ||
98 | + 'value' => trim($request->pathInfo, '/'), | ||
99 | + ] | ||
100 | + ) | ||
101 | + ->andWhere( | ||
102 | + [ | ||
103 | + 'language_id' => $this->languages->getCurrent()->id, | ||
104 | + ] | ||
105 | + ) | ||
106 | + ->one(); | ||
107 | + $this->invalidParams(\Yii::$app->request->queryParams); | ||
108 | + if ($alias !== null) { | ||
109 | + $params = Json::decode($alias->route); | ||
110 | + | ||
111 | + $route = array_shift($params); | ||
112 | + | ||
113 | + /** | ||
114 | + * @todo REFACTOR AS SOO AS POSIBLE! | ||
115 | + * remove service locator, and implement Dependency Injection | ||
116 | + * @var \artbox\core\components\SeoComponent $seo | ||
117 | + */ | ||
118 | + $seo = \Yii::$app->get('seo'); | ||
119 | + $seo->setAlias($alias); | ||
120 | + return [ | ||
121 | + $route, | ||
122 | + $params, | ||
123 | + ]; | ||
124 | + } | ||
125 | + | ||
126 | + return parent::parseRequest($request); | ||
127 | + } | ||
128 | + | ||
129 | + /** | ||
130 | + * @param array|string $params | ||
131 | + * | ||
132 | + * @return string | ||
133 | + */ | ||
134 | + public function createUrl($params) | ||
135 | + { | ||
136 | + if ($this->hideDefaultLanguagePrefix && ($this->languages->getCurrent()->url == $this->languages->getDefault()->url)) { | ||
137 | + $prefix = ''; | ||
138 | + } else { | ||
139 | + $prefix = '/' . $this->languages->getCurrent()->url; | ||
140 | + } | ||
141 | + | ||
142 | + if (isset($params['alias'])) { | ||
143 | + if ($params['alias'] instanceof Alias) { | ||
144 | + return $prefix . '/' . $params['alias']->value; | ||
145 | + } elseif (is_array($params['alias'])) { | ||
146 | + return $prefix . '/' . $params['alias']['value']; | ||
147 | + } | ||
148 | + } | ||
149 | + | ||
150 | + return $prefix . parent::createUrl($params); | ||
151 | + } | ||
152 | + | ||
153 | + /** | ||
154 | + * @param $request | ||
155 | + * | ||
156 | + * @return mixed | ||
157 | + * @throws \yii\base\ExitException | ||
158 | + * @throws \yii\base\InvalidConfigException | ||
159 | + */ | ||
160 | + protected function parseLanguage(Request $request) | ||
161 | + { | ||
162 | + $split = explode('/', $request->pathInfo); | ||
163 | + if (in_array($split[0], array_keys($this->languages->getActive()))) { | ||
164 | + if ($this->hideDefaultLanguagePrefix && ($split[0] == $this->languages->getDefault()->url)) { | ||
165 | + unset($split[0]); | ||
166 | + | ||
167 | + \Yii::$app->response->redirect('/' . implode('/', $split), 301) | ||
168 | + ->send(); | ||
169 | + \Yii::$app->end(); | ||
170 | + } else { | ||
171 | + $this->languages->setCurrent($split[0]); | ||
172 | + | ||
173 | + unset($split[0]); | ||
174 | + | ||
175 | + $request->setPathInfo(implode('/', $split)); | ||
176 | + } | ||
177 | + } else { | ||
178 | + if ($this->hideDefaultLanguagePrefix) { | ||
179 | + $this->languages->setCurrentDefault(); | ||
180 | + } else { | ||
181 | + \Yii::$app->response->redirect( | ||
182 | + '/' . $this->languages->getDefault()->url . '/' . implode('/', $split), | ||
183 | + 301 | ||
184 | + ) | ||
185 | + ->send(); | ||
186 | + \Yii::$app->end(); | ||
187 | + } | ||
188 | + } | ||
189 | + | ||
190 | + return $request; | ||
191 | + } | ||
192 | + | ||
193 | + /** | ||
194 | + * Looks for rule in table(column) | ||
195 | + * `redirect.from` if findes - | ||
196 | + * redirects to `redirect.to` | ||
197 | + * | ||
198 | + * @param string $url | ||
199 | + */ | ||
200 | + protected function checkRedirect(string $url) | ||
201 | + { | ||
202 | + $url1 = parse_url($url); | ||
203 | + | ||
204 | + | ||
205 | + $string = '{"0":"' . ltrim($url1['path'], "/") . '"'; | ||
206 | + if (isset($url1['query'])) { | ||
207 | + parse_str($url1['query'], $url1['query']); | ||
208 | + $string .= (isset($url1['query']['id'])) | ||
209 | + ? ',"id":' . $url1['query']['id'] | ||
210 | + : ''; | ||
211 | + } | ||
212 | + | ||
213 | + $string .= '}'; | ||
214 | + | ||
215 | + $alias = Alias::find() | ||
216 | + ->where(['like', 'route', $string]) | ||
217 | + ->limit(1) | ||
218 | + ->one(); | ||
219 | + return $alias; | ||
220 | + | ||
221 | + | ||
222 | + } | ||
223 | + | ||
224 | + protected function invalidParams($requestParams) | ||
225 | + { | ||
226 | + foreach ($requestParams as $key => $param) { | ||
227 | + | ||
228 | + if (!array_key_exists($key, $this->params)) { | ||
229 | + throw new NotFoundHttpException(); | ||
230 | + } | ||
231 | + } | ||
232 | + } | ||
233 | +} | ||
236 | \ No newline at end of file | 234 | \ No newline at end of file |
frontend/views/site/about.php
@@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
17 | <div class="row"> | 17 | <div class="row"> |
18 | <div class="col-xs-12 col-sm-12"> | 18 | <div class="col-xs-12 col-sm-12"> |
19 | 19 | ||
20 | - <h1 class="card-desk-title"><?= ($page->language->title) ?? '' ?></h1> | 20 | + <h1 class="card-desk-title"><?= ($page->language->title) ?? $seo->h1 ?></h1> |
21 | </div> | 21 | </div> |
22 | <div class="col-xs-12 col-sm-12 card-desk-text blog-view"> | 22 | <div class="col-xs-12 col-sm-12 card-desk-text blog-view"> |
23 | <?= ($page->language->body) ?? '' ?> | 23 | <?= ($page->language->body) ?? '' ?> |