Возможно ли убрать id из адресной строки?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

на самом деле сейчас у вас присутствует еще и вторая пара перекрытия

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

 '<mark-name:[\w]+>' => 'car/search-by-mark',

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

 '<region-name:[\w\-]+>' => 'car/search-by-region',
-----
З.Ы. rename(shnir) -> andku83
Последний раз редактировалось andku83 2018.03.13, 20:40, всего редактировалось 2 раза.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

для того чтобы урлМанагер мог определить на какой контроллер передавать управление, нужно это указать каким-то явным маркером или префиксом:

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

 'm_<mark-name:[\w\-]+>/<model-name:[\w\-]+>' => 'car/search-by-mark',
 'm_<mark-name:[\w]+>' => 'car/search-by-mark',
 'r_<region-name:[\w\-]+>/<city-name:[\w\-]+>' => 'car/search-by-city',
 'r_<region-name:[\w\-]+>' => 'car/search-by-region',
либо чтобы работало по вашим требованиям вам нужно создавать кастомный UrlRule который внутри по наличию определенных данных сможет понять куда осуществляется переход
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

на самом деле сейчас у вас присутствует еще и вторая пара перекрытия
Но остальные правила работают, переход идёт на те действия, которые мне нужны.
для того чтобы урлМанагер мог определить на какой контроллер передавать управление, нужно это указать каким-то явным маркером или префиксом:
эти префиксы должны быть и в ссылках?
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

Блин. Вообще странно всё работает.
Сейчас зашёл на сайт, все ссылки нормально отработали...
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

slo_nik писал(а): 2018.03.13, 21:01 эти префиксы должны быть и в ссылках?
да
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

andku83 писал(а): 2018.03.14, 15:42
slo_nik писал(а): 2018.03.13, 21:01 эти префиксы должны быть и в ссылках?
да
Благодарю. Конечно же в ссылках, это я затупил)))
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

andku83 писал(а): 2018.03.02, 15:58
это видео посмотрите и главное послушайте
Просмотрел в очередной раз видео. Попытался создать свой класс для правил.

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

class CarUrlRule extends BaseObject implements UrlRuleInterface
{
    public function createUrl($manager, $route, $params)
    {
       if($route === 'car/search-by-mark'){

           if(isset($params['mark-name'], $params['model-name'])){
               return $params['mark-name'] . '/' . $params['model-name'];
           }
           elseif(isset($params['model-name'])){
               return $params['model-name'];
           }
           elseif(isset($params['mark-name'])){
               return $params['mark-name'];
           }
       }
       elseif($route === 'car/search-by-city'){
           if(isset($params['region-name'], $params['city-name'])){
               return $params['region-name'] . '/' . $params['city-name'];
           }
       }
       elseif($route === 'car/show'){
           if(isset($params['region'], $params['city'], $params['mark'], $params['model'], $params['id'])){
               return $params['region'] . '/' . $params['city'] . '/' . $params['mark'] . '/' . $params['model'] . '/' . $params['id'];
           }
       }
       return false;
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();
        
        if(preg_match('#^([\w\-]+)(/([\w\-]+))?$#', $pathInfo, $matches)){
              return ['car/search-by-mark', array_filter(['mark-name' => $matches[1], 'model-name' => $matches[3]])];
        }
        elseif(preg_match('#^([\w\-]+)(/([\w\-]+))?(/([\w\-]+))?(/([\w\-]+))?(/(\d+))?$#', $pathInfo, $matches)){
            return ['car/show', ['region' => $matches[1], 'city' => $matches[3], 'mark' => $matches[5], 'model' => $matches[7], 'id' => $matches[9]]];
        }
        else{
            echo 'error url';
        }

        return false;
    }

}
В методе parseRequest(), первая проверка подходит и для car/search-by-mark и для car/search-by-city.
Как мне определить в методе какой именно rout используется? Чтобы была возможность проверить как методе createUrl() на какое действие возвращать.
Или делать запросы в базу данных и опять же проверять, если есть не пустой ответ, то подставлять действие в зависимости от того, какой запрос вернул не пустой ответ.
Вот как-то так

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

        if(preg_match('#^([\w\-]+)(/([\w\-]+))?$#', $pathInfo, $matches)){
            if(Car::find()->where(['mark-name' => $matches['1']])){
                $action = 'search-by-mark';
                $params = array_filter(['mark-name' => $matches[1], 'model-name' => $matches[3]]);
            }
            elseif(City::find()->where(['city-name' => $matches[1]])){
                $action = 'search-by-city';
                $params = array_filter(['region-name' => $matches[1], 'city-name' => $matches[3]]);
            }
              return ['car/' . $action, $params];
        }
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Возможно ли убрать id из адресной строки?

Сообщение ElisDN »

Да, искать в базе:

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

if (Car::find()->where(['mark-name' => $matches['1']])->exists()) {
    ...
}
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

ElisDN писал(а): 2018.03.25, 09:53 Да, искать в базе:

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

if (Car::find()->where(['mark-name' => $matches['1']])->exists()) {
    ...
}
Понятно, буду искать)))
Благодарю за подсказку.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

slo_nik писал(а): 2018.03.01, 18:36
https://habrahabr.ru/post/308948/
Ответить