@Medved_1989

Как правильно настроить роутинг Yii2?

Есть форма
echo Html::beginForm(['main/search'], 'GET');
        echo Html::input('text', 'request');        
        echo Html::submitButton('Поиск);
        echo Html::endForm();


И маршрут
'search/<request:\w+>' => 'main/search'

При вводе к примеру "123" выдает
http://test.com/main/search?request=123

А я хочу чтобы выдавал
http://test.com/search/123

При этом если модифицировать форму(для проверки)
echo Html::beginForm(['main/search', 'request' => '123' ], 'GET');   
        echo Html::submitButton('Поиск);
        echo Html::endForm();


то всё работает.

Подскажите пожалуйста, в чём может быть проблема.
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
@Medved_1989 Автор вопроса
Разобрался, если кому понадобится в будущем скину код
1. Устанавливаем dmirogin/yii2-js-urlmanager

2. Далее нам понадобится добавить id к форме и полю input
echo Html::beginForm(['main/search'], 'GET', $options = ['id' => 'searchForm']);
        echo Html::input('text', 'request', '', $options = ['id' => 'searchinput']);
        echo Html::submitButton('Поиск');
        echo Html::endForm();

3. Пишем скрипт (перед закрывающим тэгом body)
$("#searchForm").submit(function (e) {
            e.preventDefault();
            var url = UrlManager.createUrl('main/search', {request: $("#searchinput").val()});
            window.location.replace(url);
        });

preventDefault(); - для переделки url и отправки своего, обязательно надо предотвратить стандартную отправку формы, что и делает эта функция
UrlManager.createUrl('main/search', {request: $("#searchinput").val()});
- тут как раз мы и формируем наш url с помощью расширения dmirogin/yii2-js-urlmanager
window.location.replace(url); ну а тут мы уже перенаправляем юзера на сформированный ранее url

При прописанном маршруте 'search/<request:\w+>' => 'main/search'
Нас успешно отправляет на Url вида http://test.com/search/123

Благодарю за ответы Дмитрия и Lander, хоть их ответы и не дали прямого решения, но направили меня в правильную сторону.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
usdglander
@usdglander
Yipee-ki-yay
Всё верно. То что вы написали, то он вам и делает. Отправку формы обрабатывает браузер. Как он это делает:
1. При событии submit формы, браузер, берёт параметр action
2. Берёт все поля, заключённые между тегами <form></form>
3. У каждого поля берёт его name и value (для полей типа textarea, думаю понятно, что не value)
4. Формирует из этих полей запрос вида (в случае GET-запроса): name1=value1&name2=value2&...
5. Приписывает запрос из пункта 4 к action из пункта 1 через знак вопроса ?
6. Осуществляет перенаправление по полученному url

Что же нужно сделать, чтобы изменить это поведение? Всё очень просто: просто надо перехватить submit формы и написать свою логику формирования url.
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Рекомендую почитать документацию и посмотреть это видео.
Если у Вас форма поиска, то описывать в конфигурации варианты будет морочительно.
Это потому, что в строке запроса количество данных может меняться.
Если количество данных у Вас фиксировано, то можно начать с этого.
'rules' => [
  // если main у Вас контролер, а search действие
  '' => 'main/index',
 '<_a:(search)>/<request:\w+>' => 'main/search'
]

Эти ссылки тоже помогут Вам.
https://yiiframework.ru/forum/viewtopic.php?f=19&t...
https://yiiframework.ru/forum/viewtopic.php?f=19&t...
https://habr.com/ru/post/308948/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы