ЧПУ после отправки формы методом GET

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.19, 19:31

Всем здоровья и добра!
Пользоваться поиском умею... тема не нова, но за два дня не нашел для себя решения...
Имею вот такой Url: report/metar?CountriesForm%5Bcountry_name%5D=AF
Как его привести к такому виду: report/metar/AF

в настройках:

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

        'urlManager' => [
            'class' => 'codemix\localeurls\UrlManager',
            'languages' => ['en-GB', 'uk', 'ru'],
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [
                '' => 'site/index',
                'report' => 'report/index',
                'report/<metar/:\w{2}>' => 'report/metar',//вот тут чего я уже только не "пихал" 
            ],
        ]
контроллер:

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

    public function actionMetar()
    {
        $request = Yii::$app->request;
        $get = $request->get();
        
        $model = new CountriesForm();        
        $countries = Countries::find()->all();
        $countries_items = ArrayHelper::map($countries,'iso_alpha2','country_name');
        
        if(isset($get['CountriesForm']['country_name']))
        {
        return $this->render('metar-country',[
            'model' => $model,
            'countries_items' => $countries_items,
            'iso_alpha2' => $get['CountriesForm']['country_name'],
        ]);            
        }else{
        return $this->render('metar-default',[
            'model' => $model,
            'countries_items' => $countries_items,
        ]);}
    }
вид metar-default:

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

    <?php
        $form = ActiveForm::begin([
            'id' => 'countries-form',
            'method' => 'get',
            'action' => Url::to(['report/metar']),
            'layout' => 'horizontal',
            'fieldConfig' => [
                'horizontalCssClasses' => [
                    'label' => 'col-sm-4',
                    'offset' => 'col-sm-offset-4',
                    'wrapper' => 'col-sm-5',
                ],
            ],
        ]);
        echo $form->field($model, 'country_name', [
                'inputOptions' => [
                    'prompt' => Yii::t('app', '- select country -'),
                    'onchange'=>'this.form.submit()',
                ],
            ])->dropDownList($countries_items)->label(false);
        ActiveForm::end();
    ?>
вид metar-country:

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

        $form = ActiveForm::begin([
            'id' => 'countries-form',
            'method' => 'get',
            'action' => Url::to(['report/metar']),
            'layout' => 'horizontal',
            'fieldConfig' => [
                'horizontalCssClasses' => [
                    'label' => 'col-sm-4',
                    'offset' => 'col-sm-offset-4',
                    'wrapper' => 'col-sm-5',
                ],
            ],
        ]);
        echo $form->field($model, 'country_name', [
                'inputOptions' => [
                    //'prompt' => Yii::t('app', '- select country -'),
                    'onchange'=>'this.form.submit()',
                ],
            ])->dropDownList($countries_items, [
                'options' => [ 
                    $iso_alpha2 => [
                        'Selected' => true
                        ]
                    ]
                ])->label(false);
        ActiveForm::end();

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 15:02

....По всей вероятности: одни "цены себе сложить не могут", а другие такие же "тупые" как и я....Впервые обратился за помощью и получил тотальный ignore.

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 15:17

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

'report/<metar/:\w{2}>' => 'report/metar'
Сначала почитайте тут - https://www.yiiframework.com/doc/guide/ ... parameters
Потом попробуйте понять что вы тут написали и сравнить с тем, чего хотите добиться.

Вы обрабатываете не "report/metar?CountriesForm%5Bcountry_name%5D=AF"
а "report?metar/=AF" .... Причем параметр metar именно со слэшем.

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 15:42

Это один из моих неправильных "ходов", я прошу у людей с опытом написать правильное для меня решение, а именно: как с помощью правил в UrlManager и "правильного" регулярного выражения вырезать кусок строки из url. А то что я тут написал ('report/<metar/:\w{2}>' => 'report/metar') это одна из попыток оставить для маршрута report/metar два символа после отправки формы. Можете меня ругать, но не посылайте меня к гуглу и туториалу...и за это я Вам буду благодарен. Кто знает, может и я буду в чем-то для Вас полезен...:)

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 15:46

Может так сработает? Вроде как должно.

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

'report/metar/<CountriesForm%5Bcountry_name%5D:\w{2}>' => 'report/metar'
Я такие хитро-деланные GET-запросы никогда не применяю. Обычно "report/metar?country_name=AF"

Или может еще проще :

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

'report/metar/*' => 'report/metar'

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 16:02

1-й способ ничего не дает, я его раньше сам "пробовал", а 2-й, тот что "еще проще :)" добавляет еще и звездочку к тому, что надо вырезать...

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 16:03

....https://www.yiiframework.com/doc/guide/ ... parameters вот это выучил уже "наизусть" :) :) :)

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 16:11

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

'report/metar/<CountriesForm[country_name]:\w{2}>' => 'report/metar'
Если это не сработает, то я бы такие ГЕТ-параметры не стал бы пользовать.

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 16:23

masson писал(а):
2019.06.23, 15:46
Может так сработает? Вроде как должно.

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

'report/metar/<CountriesForm%5Bcountry_name%5D:\w{2}>' => 'report/metar'
Я такие хитро-деланные GET-запросы никогда не применяю. Обычно "report/metar?country_name=AF"

Или может еще проще :

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

'report/metar/*' => 'report/metar'
Вот это вы правильно заметили, для меня тоже загадка, почему в GET появляется имя модели формы, я именно этого и ожидал "report/metar?country_name=AF" в GET, но в url-е отображается "адрес кто и где живет и как его зовут"... :evil:

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 16:28

Тогда надо смотреть то место, где эта ссылка формируется. Если (что скорее всего) где-то форма отправляется методом ГЕТ, там надо ее ПОСТ-ом отправить.

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 16:32

masson писал(а):
2019.06.23, 16:11

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

'report/metar/<CountriesForm[country_name]:\w{2}>' => 'report/metar'
Если это не сработает, то я бы такие ГЕТ-параметры не стал бы пользовать.
это тоже не сработало.
По всей видимости надо делать через POST и делать редирект в контроллере после запроса, попробую покопать в этом направлении...СПАСИБО за внимание!

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 16:38

Не надо никакого редиректа. Всего лишь в контроллере поменять
$get = $request->get();
на $post = $request->post();

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

    public function actionMetar()
    {
        $post = Yii::$app->request->post();
        $iso_alpha2 = $post['CountriesForm']['country_name'] ?? null;
        $view = $iso_alpha2 ? 'metar-country' : 'metar-default';
        
        $countries_items = Countries::find()->select(['country_name'])->indexBy('iso_alpha2')->column();
        
        return $this->render($view, [
            'model' => new CountriesForm(),
            'countries_items' => $countries_items,
            'iso_alpha2' => $iso_alpha2
        ]);
    }
И правила в UrlManager удалить для report/metar.

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 18:11

Плохо что сразу не написал про POST и почему я "уперся" в GET. Все дело в том что мне нужен в url-e "индификатор " страны (AF-Афганистан и тд.), если же использовать POST, то при первом выборе из "select" формы в url не появляется ничего(сама переменная из пост есть и даже срабатывает атрибут "selected" для <options> в форме), при следующем выборе из "selecta" в url появляется этот "индификатор", но от предыдущего запроса т.е. AF, а должен быть например RU...При GET запросе в url сразу с первого запроса есть нужный идентификатор и при последующих работает так как надо только сам url безобразный.
это вариант activeform для POST:

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

    <?php
        $form = ActiveForm::begin([
            'id' => 'countries-form',
            //'method' => 'get',
            'action' => Url::to(['report/metar', 'country' => $iso_alpha2]),
            'layout' => 'horizontal',
            'fieldConfig' => [
                'horizontalCssClasses' => [
                    'label' => 'col-sm-4',
                    'offset' => 'col-sm-offset-4',
                    'wrapper' => 'col-sm-5',
                ],
            ],
        ]);
        echo $form->field($model, 'country_name', [
                'inputOptions' => [
                    //'prompt' => Yii::t('app', '- select country -'),
                    'onchange'=>'this.form.submit()',
                ],
            ])->dropDownList($countries_items, [
                'options' => [ 
                    $iso_alpha2 => [
                        'Selected' => true
                        ]
                    ]
                ])->label(false);
        ActiveForm::end();
    ?>
...За "культурный" код в контроллере отдельное спасибо, только как говорится: "воз и ныне там"...:)

masson
Сообщения: 489
Зарегистрирован: 2012.07.03, 15:59

Re: ЧПУ после отправки формы методом GET

Сообщение masson » 2019.06.23, 18:20

При таком раскладе надо динамически менять $form->action в dropDownList->onchange

Может получится так :

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

'onChange' => 'window.location.search = "country_name=" + $(this).val();'
Но это уже к Yii мало относится, тут я совсем не силен.

milmet
Сообщения: 9
Зарегистрирован: 2019.06.18, 22:05
Откуда: Borispol, Ukraine
Контактная информация:

Re: ЧПУ после отправки формы методом GET

Сообщение milmet » 2019.06.23, 19:24

'onChange' => 'window.location.search = "country_name=" + $(this).val();'
Да! Это оно! Спасибо Вы мне помогли!!!

Закрыто