Динамическая форма. Как сделать?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
myks1992@mail.ru
Сообщения: 64
Зарегистрирован: 2017.11.15, 23:54

Динамическая форма. Как сделать?

Сообщение myks1992@mail.ru » 2019.05.15, 18:56

Доброго вечера! Столнулся с небольшой проблемой и не могу понять как сделать. Сделал композитную форму.

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

class RequestAddForm extends CompositeForm
{
    public $disciplineId;
    public $organizationId;
    public $cityId;
    public $participantAmount;
    public $music;
    public $isMusicCue;
    public $titleNumber;
    public $contactPhone;
    public $contactEmail;

    public $mentors;
    public $participants;

    public function __construct(array $config = [])
    {
        $count = count(Yii::$app->request->post('MentorForm', []));
        $mentors = [new MentorForm()];
        for($i = 1; $i < $count; $i++) {
            $mentors[$i] = new MentorForm();
        }
        $this->mentors = $mentors;
        $this->participants = new ParticipantForm();
        parent::__construct($config);
    }
    
    ///... Другой код
}
Но теперь мне нужно чтобы две формы ParticipantForm(); и MentorForm(); могли дублироваться. То есть чтобы можно было при создании RequestAddForm в полях добавить несколько выше приведенных форм. На разметке это выглядит так:ё

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

<div class="request-mentors">
                    <div class="request-mentor">
                        <?php foreach ($addForm->mentors as $i => $mentor): ?>
                            <div class="row">
                                <div class="col-sm-3">
                                    <?= $form->field($mentor, "[$i]lastName")->textInput() ?>
                                </div>
                                <div class="col-sm-3">
                                    <?= $form->field($mentor, "[$i]firstName")->textInput() ?>
                                </div>
                                <div class="col-sm-3">
                                    <?= $form->field($mentor, "[$i]middleName")->textInput() ?>
                                </div>

                                <div class="col-sm-3">
                                    <?= $form->field($mentor, "[$i]position")->textInput() ?>
                                </div>
                            </div>

                            <?= $form->field($mentor, "[$i]printGratitude")->checkbox() ?>

                        <?php endforeach; ?>
                        <div class="mentor-btn-block">
                            <?= Html::button('Добавить', ['class' => 'btn btn-link mentor-link-add']) ?>
                            <?= Html::button('Удалить', ['class' => 'btn btn-link mentor-link-delete']) ?>
                        </div>
                    </div>
                </div>
                
В итоге приходит такой массив:

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

["MentorForm"]=>
  array(1) {
    [0]=>
    array(5) {
      ["lastName"]=>
      string(12) "фывфыв"
      ["firstName"]=>
      string(12) "фывфыв"
      ["middleName"]=>
      string(10) "фывфы"
      ["position"]=>
      string(1) "1"
      ["printGratitude"]=>
      string(1) "1"
    }
  }
Подскажите, правильно ли я делаю? Как реализуется данный пример. Будет ли правильно работать валидация данных... Знаю, что есть замечательный виджет https://github.com/unclead/yii2-multiple-input, но хотелось бы без него... А хороший

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

https://wbraganca.com/yii2extensions/yii2-dynamicform/installation
выдает ошибку
Your requirements could not be resolved to an installable set of packages.

Problem 1
- Installation request for wbraganca/yii2-dynamicform dev-master -> satisfiable by wbraganca/yii2-dynamicform[dev-master].
- Conclusion: remove symfony/css-selector v4.2.8
- Conclusion: don't install symfony/css-selector v4.2.8
- wbraganca/yii2-dynamicform dev-master requires symfony/css-selector ~2.8|~3.0 -> satisfiable by symfony/css-selector[v2.8.0, v2.8.1, v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.14, v2.8.15,
Добавление новых полей с фамилией и именем будет осуществлен на JS.

Аватара пользователя
leonenco
Сообщения: 54
Зарегистрирован: 2017.01.30, 22:42

Re: Динамическая форма. Как сделать?

Сообщение leonenco » 2019.05.16, 02:38

ну, судя по массиву который приходит он сконструирован правельно, на мой взгляд. А вы не смотрели почему у вас ошибки по зависимости вываливаются?

Аватара пользователя
myks1992@mail.ru
Сообщения: 64
Зарегистрирован: 2017.11.15, 23:54

Re: Динамическая форма. Как сделать?

Сообщение myks1992@mail.ru » 2019.05.16, 10:08

leonenco писал(а):
2019.05.16, 02:38
ну, судя по массиву который приходит он сконструирован правельно, на мой взгляд. А вы не смотрели почему у вас ошибки по зависимости вываливаются?
А как заполнить форму данными? Не подскажете? Использую композитные формы https://elisdn.ru/blog/111/yii2-composite-forms

У меня почему то не работает(

Там такой метод

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

public function load($data, $formName = null)
    {
        $success = parent::load($data, $formName);
        foreach ($this->_forms as $name => $form) {
            if (is_array($form)) {
                $success = Model::loadMultiple($form, $data, $formName === null ? null : $name) && $success;
            } else {
                $success = $form->load($data, $formName !== '' ? null : $name) && $success;
            }
        }
        return $success;
    }

Аватара пользователя
leonenco
Сообщения: 54
Зарегистрирован: 2017.01.30, 22:42

Re: Динамическая форма. Как сделать?

Сообщение leonenco » 2019.05.17, 02:40

myks1992@mail.ru писал(а):
2019.05.16, 10:08
leonenco писал(а):
2019.05.16, 02:38
ну, судя по массиву который приходит он сконструирован правельно, на мой взгляд. А вы не смотрели почему у вас ошибки по зависимости вываливаются?
А как заполнить форму данными? Не подскажете? Использую композитные формы https://elisdn.ru/blog/111/yii2-composite-forms

У меня почему то не работает(

Там такой метод

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

public function load($data, $formName = null)
    {
        $success = parent::load($data, $formName);
        foreach ($this->_forms as $name => $form) {
            if (is_array($form)) {
                $success = Model::loadMultiple($form, $data, $formName === null ? null : $name) && $success;
            } else {
                $success = $form->load($data, $formName !== '' ? null : $name) && $success;
            }
        }
        return $success;
    }

не могу вам в этом помочь.

Дмитрий (ElisDN) или Саня (samdark).
Последний раз редактировалось leonenco 2019.05.19, 01:34, всего редактировалось 1 раз.


Ответить