ActiveForm и динамически добавляемые поля

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

ActiveForm и динамически добавляемые поля

Сообщение agrail »

Допустим у меня есть ActiveForm и я хочу добавить поле динамически(например, мне нужна пакетная обработка данных). Есть какие-то примеры, как это сделать? Я знаю, что в api activeForm добавили метод add для того чтобы "оживить" добавленyые поля, чтобы для них работала валидация и прочее, но как красиво добавить новое поле? На данный момент это легко сделать с Html::beginForm(), но там нет кучи фич, которые есть у ActiveForm.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: ActiveForm и динамически добавляемые поля

Сообщение astronin »

на этом форме уже были подобные вопросы
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

на этом форме уже были подобные вопросы
я пролистал темы, но не нашел ничего похожего
Александр, я читал этот пост, но очень не нравится предлагаемый автором подход - создавать фейковую запись в БД, а потом выводить поле под нее. Хотелось бы чтобы это можно было сделать как в 1 версии фрейморка, через Html::activeText(), Html::error() и.т.д. - там можно было при добавлении поля послать запрос на экшн, вернуть этот хтмл, вставть в форму и все - валидация работала, поля подсвечивались и.т.д. - при этом фейковую запись создавать не обязательно было.
Во второй же версии при использовании Html::error() и Html::activeText() получаются самые базовые инпаты, без валидации, без навешанного клиентского кода - без ничего вообще, и это нормально, я понимаю почему так сделали. Но вот использовать ActiveForm со всеми наворотами и просто добавить еще один инпат через нативное API - этого очень сильно не хватает.
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: ActiveForm и динамически добавляемые поля

Сообщение iAchilles »

agrail писал(а):Я знаю, что в api activeForm добавили метод add
Я не могу этот метод в API найти.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveForm и динамически добавляемые поля

Сообщение zelenin »

agrail писал(а):Я знаю, что в api activeForm добавили метод add для того чтобы "оживить" добавленyые поля
найдите его в коде и посмотрите описание.
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

Я видел его описание. Метод добавляет возможность использовать client-side валидацию на только что добавленном поле. Вопрос не в этом. Вопрос в том, как это поле добавить вообще. Пока я вижу только один вариант - клонировать кусок DOMа с полем, через прегреплейсы заменить необходимые поля и индексы и потом "оживить" через activeForm.add(). Хотелось бы чтобы это было как-то решено на уровне самого виджета ActiveForm
Аватара пользователя
Besedin
Сообщения: 88
Зарегистрирован: 2012.07.30, 11:09
Откуда: Kyiv

Re: ActiveForm и динамически добавляемые поля

Сообщение Besedin »

1. Оберните форму в Pjax
2. Добавьте ссылку в контейнер Pjax, к примеру, /add-item
3. метод actionAddItem можете оформить приблизительно так (он добавит 1 незаполненное поле)

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

public function actionAddItem()
    {
        $models = MyModel::find()->all();
        $model = new MyModel();
        $models[] = $model;
        return $this->renderAjax('table-view', ['models' => $models]);
    }
 
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

Да, на хабре приведен аналогичный пример - но меня не устраивает, что в базу будут писаться пустые значения. архитектура моей базы данных не предусматривает таких ситуаций.
Аватара пользователя
Besedin
Сообщения: 88
Зарегистрирован: 2012.07.30, 11:09
Откуда: Kyiv

Re: ActiveForm и динамически добавляемые поля

Сообщение Besedin »

Почему пустые? Вы просто добавляете пустую модель и наполняете её из формы. А сохраняете в базу уже сабмитом формы.
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

Да, действительно...Эта идея уже лучше, но тоже не то что нужно. Смотрите, человек может заполнить несколько полей, потом нажать на плюс - и все, Pjax сбросит несохраненные изменения при обновлении кантейнера. Значит мы должны форсированно сохранять добавленные поля. Это не хорошо.
LDN
Сообщения: 62
Зарегистрирован: 2014.07.28, 10:13

Re: ActiveForm и динамически добавляемые поля

Сообщение LDN »

agrail
не по теме вопрос, т.е. не могу тебе помочь по теме :)
как использовать api activeForm?
подскажи где почитать? или пример? что то не получается найти :(
как я понимаю использовать yii.ActiveForm.js?
Столкнулся с аналогичной проблемой viewtopic.php?f=19&t=20163.
Аватара пользователя
Besedin
Сообщения: 88
Зарегистрирован: 2012.07.30, 11:09
Откуда: Kyiv

Re: ActiveForm и динамически добавляемые поля

Сообщение Besedin »

Самый простой способ.
И не забудьте во view добавлять hidden поле с id записи.

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

public function actionAddItem()
    {
        $models = []
        if(isset($_POST['MyModel'])) { 
          $post = Yii::$app->request->post('MyModel');
          foreach($post as $index => $data) {        
            if(!empty($data['id'])) {
              $model = MyModel::findOne(['id' => $data['id']]); 
            } else {
              $model = new MyModel();
            }
          $models[] = $model;
          }
        }
        return $this->renderAjax('table-view', ['models' => $models]);
    }
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

Besedin писал(а):Самый простой способ.
И не забудьте во view добавлять hidden поле с id записи.

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

public function actionAddItem()
    {
        $models = []
        if(isset($_POST['MyModel'])) { 
          $post = Yii::$app->request->post('MyModel');
          foreach($post as $index => $data) {        
            if(!empty($data['id'])) {
              $model = MyModel::findOne(['id' => $data['id']]); 
            } else {
              $model = new MyModel();
            }
          $models[] = $model;
          }
        }
        return $this->renderAjax('table-view', ['models' => $models]);
    }
 
Кажется то что надо. Я попробую, спасибо!
agrail
Сообщения: 107
Зарегистрирован: 2011.06.19, 23:19

Re: ActiveForm и динамически добавляемые поля

Сообщение agrail »

LDN писал(а):agrail
не по теме вопрос, т.е. не могу тебе помочь по теме :)
как использовать api activeForm?
подскажи где почитать? или пример? что то не получается найти :(
как я понимаю использовать yii.ActiveForm.js?
Столкнулся с аналогичной проблемой viewtopic.php?f=19&t=20163.
http://habrahabr.ru/post/238447/ - вот тут есть, раздел про формы:

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

$('#myform').yiiActiveForm('add', {
    'id': 'address',
    'name': 'address',
    'container': '.field-address',
    'input': '#address',
    'error': '.field-address .help-block'
});
 
Ответить