И снова вопрос по UrlManager :)
И снова вопрос по UrlManager :)
Есть 3 контроллера:
City
User
Product
Возможные урлы
http://site.com/moscow/
http://site.com/new-york/
http://site.com/alex/
http://site.com/marina/
http://site.com/nikon-d40/
http://site.com/nokia-6120-classic/
Нужно что бы по этим URLам отрабатывали CityController, UserController, ProductController (у всех actionView).
Как такое сделать?
City
User
Product
Возможные урлы
http://site.com/moscow/
http://site.com/new-york/
http://site.com/alex/
http://site.com/marina/
http://site.com/nikon-d40/
http://site.com/nokia-6120-classic/
Нужно что бы по этим URLам отрабатывали CityController, UserController, ProductController (у всех actionView).
Как такое сделать?
Re: И снова вопрос по UrlManager :)
смотрите "Использование своего класса правила URL" http://yiiframework.ru/doc/guide/ru/topics.url
но что будет если кто-то возьмет себе логин "new-york" ???
но что будет если кто-то возьмет себе логин "new-york" ???
Re: И снова вопрос по UrlManager :)
При добавлении я буду проверять, что бы URL был уникальный.Ryadnov писал(а):но что будет если кто-то возьмет себе логин "new-york" ???
Re: И снова вопрос по UrlManager :)
не нормальнее будет
http://site.com/city/moscow/
http://site.com/user/alex/
а продукт, к примеру http://site.com/nikon-d40/
???
иначе в parseUrl вы не сможете однозначно сказать что это город, логин или продукт/ Следовательно придется делать от 1 до 3 запросов к БД
http://site.com/city/moscow/
http://site.com/user/alex/
а продукт, к примеру http://site.com/nikon-d40/
???
иначе в parseUrl вы не сможете однозначно сказать что это город, логин или продукт/ Следовательно придется делать от 1 до 3 запросов к БД
Re: И снова вопрос по UrlManager :)
Конечно, так сделать легче и это будет более "нормально".Ryadnov писал(а):не нормальнее будет
http://site.com/city/moscow/
http://site.com/user/alex/
а продукт, к примеру http://site.com/nikon-d40/
???
Хочется понять как решить задачу которая описана в первом посте.
Прочитал http://yiiframework.ru/doc/guide/ru/topics.url, понял что нужно создать свой класс унаследованный от CBaseUrlRule.Ryadnov писал(а):иначе в parseUrl вы не сможете однозначно сказать что это город, логин или продукт
В нём нужно сделать написать 2 метода, createUrl и parseUrl.
Можно ли сделать только parseUrl для начала?
Насколько я понял, эти запросы нужно делать в parseUrl, а parseUrl должен вернуть новый маршрут? Верно?Ryadnov писал(а):Следовательно придется делать от 1 до 3 запросов к БД
Что то типа:
city/view/15
user/view/100
product/view/230
Re: И снова вопрос по UrlManager :)
по идее так
писалось без проверки, так что строго не судите
Код: Выделить всё
class SuperUrlRule extends CBaseUrlRule {
public function createUrl($manager, $route, $params, $ampersand) {
if (in_array($route, array('city/view', 'user/view', 'product/view'))) {
if (isset($params['name'])) {
return $params['name'];
}
}
return false; // не применяем данное правило
}
public function parseUrl($manager, $request, $pathInfo, $rawPathInfo) {
$data = City::model()->find('name = :NAME', array(':NAME' => $pathInfo));
if (isset($data)) {
$_GET['name'] = $data->name;
$_GET['id'] = $data->getPrimaryKey();
return 'city/view';
}
$data = User::model()->find('name = :NAME', array(':NAME' => $pathInfo));
if (isset($data)) {
$_GET['name'] = $data->name;
$_GET['id'] = $data->getPrimaryKey();
return 'user/view';
}
$data = Product::model()->find('name = :NAME', array(':NAME' => $pathInfo));
if (isset($data)) {
$_GET['name'] = $data->name;
$_GET['id'] = $data->getPrimaryKey();
return 'product/view';
}
return false; // не применяем данное правило
}
}
Re: И снова вопрос по UrlManager :)
Ryadnov, огромное спасибо. Ваш пример многое прояснил!
Re: И снова вопрос по UrlManager :)
Пожалуйста)
Re: И снова вопрос по UrlManager :)
А можно вдогонку вопрос))
действительный адрес такой:
/index.php?r=rabota/category&id=5&alias=IT-web
URL Manager автоматом делает такой :
/rabota/category/id/5/alias/IT-web
Подскажите , а правило можно сделать, чтобы получалось так:
/rabota/category/IT-web
действительный адрес такой:
/index.php?r=rabota/category&id=5&alias=IT-web
URL Manager автоматом делает такой :
/rabota/category/id/5/alias/IT-web
Подскажите , а правило можно сделать, чтобы получалось так:
/rabota/category/IT-web
Re: И снова вопрос по UrlManager :)
/rabota/category/5/IT-web
/rabota/category/IT-web?id=5
Код: Выделить всё
'<controller:\w+>/<action:\w+>/<id:\d+>/<alias>' => '<controller>/<action>',
Код: Выделить всё
'<controller:\w+>/<action:\w+>/<alias>' => '<controller>/<action>',