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) ?? '' ?> |