Form, method get. Переменная в виде массива.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Form, method get. Переменная в виде массива.

Сообщение Chelobaka »

Приветствую,
Не ясно как передать переменную из формы методом GET

Вывожу в виде виджет:

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

echo $form->field($monthSelectorForm, 'date')->widget(
        DatePicker::class, [
        'inline' => true,
        'value' => date('M-Y', strtotime('+2 days')),
        'template' => '<div class="well well-sm" style="background-color: #fff; width:225px; ">{input}</div>',
        'clientOptions' => [
            'autoclose' => true,
            'startView'=>'year',
            'minViewMode'=>'months',
            'format' => 'M-yyyy',
            'todayHighlight' => true
        ],
    ]);
    
Все работает отлично, но если в ActiveForm указать 'method' => 'get':

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

$form = ActiveForm::begin([
            'method' => 'get',
    ]); 
    
То переменные в строке выглядят так:

/index.php?r=doctor%2Fview&id=1&MonthSelectorForm%5Bdate%5D=Feb-2019

Хотя задумывалось что будет передаваться так:
/index.php?r=doctor/view&id=1&date=Feb-2019

Остаётся не ясным как получить переменную.
Модель формы:

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

<?php

namespace app\forms;

use yii\base\Model;

class MonthSelectorForm extends Model
{
    public $date;

    public function __construct( $config = [])
    {
        parent::__construct($config);
    }

    public function init()
    {
        $this->date = empty($this->date) ? date('M-Y', strtotime('+2 days')): $this->date;
    }

    public function rules()
    {
        return [
            [['date'], 'required'],
            [['date'], 'date', 'format' => 'php:M-Y'],
        ];
    }

    public function getMonth()
    {
        return date("Y-M", strtotime($this->date));
    }

    public function getBeginDate()
    {
        return date("Y-m-d", strtotime($this->date));
    }

    public function getEndDate()
    {
        return date("Y-m-t", strtotime($this->date));
    }

    public function attributeLabels()
    {
        return [
            'date' => 'Период: ' . self::getMonth(),
        ];
    }
}
frid-karatel
Сообщения: 50
Зарегистрирован: 2017.03.06, 15:37
Откуда: Владивосток

Re: Form, method get. Переменная в виде массива.

Сообщение frid-karatel »

Chelobaka писал(а): 2019.03.02, 14:14 То переменные в строке выглядят так:
/index.php?r=doctor%2Fview&id=1&MonthSelectorForm%5Bdate%5D=Feb-2019
Yii тут не причём, как и любой другой движок.
Отображение в строке адреса - это браузер, и он кодирует некоторые символы.
Chelobaka писал(а): 2019.03.02, 14:14 Все работает отлично, но если в ActiveForm указать 'method' => 'get':
Вообще не имеет значения, каким способом передаётся.
Важно то - как пробрасываются данные в форму.
Судя по всему, в контроллере стоит:

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

$form->load(Yii::$app->request->post());
А должно быть:

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

$form->load(Yii::$app->request->get());
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Re: Form, method get. Переменная в виде массива.

Сообщение Chelobaka »

frid-karatel писал(а): 2019.03.02, 15:15
Chelobaka писал(а): 2019.03.02, 14:14 То переменные в строке выглядят так:
/index.php?r=doctor%2Fview&id=1&MonthSelectorForm%5Bdate%5D=Feb-2019
Yii тут не причём, как и любой другой движок.
Отображение в строке адреса - это браузер, и он кодирует некоторые символы.
Chelobaka писал(а): 2019.03.02, 14:14 Все работает отлично, но если в ActiveForm указать 'method' => 'get':
Вообще не имеет значения, каким способом передаётся.
Важно то - как пробрасываются данные в форму.
Судя по всему, в контроллере стоит:

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

$form->load(Yii::$app->request->post());
А должно быть:

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

$form->load(Yii::$app->request->get());
Да, оказалось не нужно было обращать внимание на то что в строке. Но пока наблюдал за этим возникла другая проблема.
Если я перешел с формы по методу GET то параметры приклеились к url, и отобразилась та же страница. Если еще раз отправить форму то параметры приклеиваются к адресной строке и получается что один и тот же параметр дублируется?
Возможно нужно делать редирект что бы этого избежать или есть другой способ?
frid-karatel
Сообщения: 50
Зарегистрирован: 2017.03.06, 15:37
Откуда: Владивосток

Re: Form, method get. Переменная в виде массива.

Сообщение frid-karatel »

Явно указать во вьюшке в форме 'action' => 'тут url без параметров'.
Usick
Сообщения: 42
Зарегистрирован: 2017.04.11, 12:07

Re: Form, method get. Переменная в виде массива.

Сообщение Usick »

Chelobaka писал(а): 2019.03.02, 14:14 То переменные в строке выглядят так:

/index.php?r=doctor%2Fview&id=1&MonthSelectorForm%5Bdate%5D=Feb-2019

Хотя задумывалось что будет передаваться так:
/index.php?r=doctor/view&id=1&date=Feb-2019
Tip: Если в форме только одна модель, и вы хотите упростить имена полей ввода, то можете сделать это, переопределив метод formName() модели так, чтобы он возвращал пустую строку. Это может пригодиться для получения более красивых URL при фильтрации моделей в GridView.

Взято отсюда https://yiiframework.com.ua/ru/doc/guide/2/input-forms/
Ответить