И снова вопрос по UrlManager :)

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
vastzp
Сообщения: 99
Зарегистрирован: 2011.05.17, 16:38

И снова вопрос по UrlManager :)

Сообщение vastzp »

Есть 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).

Как такое сделать?
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: И снова вопрос по UrlManager :)

Сообщение Ryadnov »

смотрите "Использование своего класса правила URL" http://yiiframework.ru/doc/guide/ru/topics.url

но что будет если кто-то возьмет себе логин "new-york" ???
vastzp
Сообщения: 99
Зарегистрирован: 2011.05.17, 16:38

Re: И снова вопрос по UrlManager :)

Сообщение vastzp »

Ryadnov писал(а):но что будет если кто-то возьмет себе логин "new-york" ???
При добавлении я буду проверять, что бы URL был уникальный.
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: И снова вопрос по UrlManager :)

Сообщение Ryadnov »

не нормальнее будет
http://site.com/city/moscow/
http://site.com/user/alex/
а продукт, к примеру http://site.com/nikon-d40/
???

иначе в parseUrl вы не сможете однозначно сказать что это город, логин или продукт/ Следовательно придется делать от 1 до 3 запросов к БД
vastzp
Сообщения: 99
Зарегистрирован: 2011.05.17, 16:38

Re: И снова вопрос по UrlManager :)

Сообщение vastzp »

Ryadnov писал(а):не нормальнее будет
http://site.com/city/moscow/
http://site.com/user/alex/
а продукт, к примеру http://site.com/nikon-d40/
???
Конечно, так сделать легче и это будет более "нормально".
Хочется понять как решить задачу которая описана в первом посте.
Ryadnov писал(а):иначе в parseUrl вы не сможете однозначно сказать что это город, логин или продукт
Прочитал http://yiiframework.ru/doc/guide/ru/topics.url, понял что нужно создать свой класс унаследованный от CBaseUrlRule.
В нём нужно сделать написать 2 метода, createUrl и parseUrl.
Можно ли сделать только parseUrl для начала?
Ryadnov писал(а):Следовательно придется делать от 1 до 3 запросов к БД
Насколько я понял, эти запросы нужно делать в parseUrl, а parseUrl должен вернуть новый маршрут? Верно?
Что то типа:
city/view/15
user/view/100
product/view/230
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: И снова вопрос по UrlManager :)

Сообщение Ryadnov »

по идее так

Код: Выделить всё

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; // не применяем данное правило
    }

} 
писалось без проверки, так что строго не судите
vastzp
Сообщения: 99
Зарегистрирован: 2011.05.17, 16:38

Re: И снова вопрос по UrlManager :)

Сообщение vastzp »

Ryadnov, огромное спасибо. Ваш пример многое прояснил!
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: И снова вопрос по UrlManager :)

Сообщение Ryadnov »

Пожалуйста)
oki84
Сообщения: 72
Зарегистрирован: 2011.08.01, 14:09

Re: И снова вопрос по UrlManager :)

Сообщение oki84 »

А можно вдогонку вопрос))
действительный адрес такой:
/index.php?r=rabota/category&id=5&alias=IT-web
URL Manager автоматом делает такой :
/rabota/category/id/5/alias/IT-web
Подскажите , а правило можно сделать, чтобы получалось так:
/rabota/category/IT-web
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: И снова вопрос по UrlManager :)

Сообщение Ryadnov »

/rabota/category/5/IT-web

Код: Выделить всё

'<controller:\w+>/<action:\w+>/<id:\d+>/<alias>' => '<controller>/<action>',
/rabota/category/IT-web?id=5

Код: Выделить всё

'<controller:\w+>/<action:\w+>/<alias>' => '<controller>/<action>',
Ответить