В этой заметке хочу поделиться классом, который будет автоматически
создавать чпу ссылки из алиасов в зависимости от того, какой
конфигурационный массив будет передан классу.
<?php
namespace app\components;
use yii\web\UrlRule;
class SlugUrlRules extends UrlRule
{
public $pattern = '<module>/<controller>/<action>';
public $route = 'module/<module:\w+>/<controller:\w+>/<action:\w+>';
private $relations = [
'news/view' => '\app\models\ArticleItems',
'tips/view' => '\app\models\ArticleItems',
'fact-and-figures/view' => '\app\models\ArticleItems',
];
/*
Разрешение роута
*/
public function resolveRoute($route, $id)
{
if (isset($this->relations[$route])) {
$modelClass = $this->relations[$route];
$model = $modelClass::findOne($id);
if ($model) {
if (isset($model->alias)) {
return $model;
}
}
}
return false;
}
/*
Разрешение алиаса
*/
public function resolveAlias($alias)
{
$parts = explode('/', $alias);
$route = $parts[0] . '/view';
if (isset($parts[1])) {
$alias = $parts[1];
if (isset($this->relations[$route])) {
$modelClass = $this->relations[$route];
$model = $modelClass::find()
->where(['alias' => $alias])
->one();
if (isset($model)) {
return [$route, ['id' => $model->id]];
}
}
}
return false;
}
public function createUrl($manager, $route, $params)
{
if (isset($params['id'])) {
$model = $this->resolveRoute($route, $params['id']);
if ($model) {
$url = str_replace('/view', '', $route);
$url .= '/' . $model->alias;
return $url;
}
}
return false;
}
public function parseRequest($manager, $request)
{
$pathinfo = $request->pathinfo;
$route = $this->resolveAlias($pathinfo);
return $route;
}
}
Комментариев нет:
Отправить комментарий