$form->field($model, 'name[]') Как валидировать?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
magicoder
Сообщения: 133
Зарегистрирован: 2015.12.16, 23:33
Контактная информация:

$form->field($model, 'name[]') Как валидировать?

Сообщение magicoder »

Есть список (прайс товаров), каждый пункт которого выводится в отдельном

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

<li>"имя" "цена за единицу"</li>
с помощью цикла. Рядом с ним

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

<?= $form->field($model, 'count'.['$i++'].') ->textInput();?> 
для того, чтобы указывать количество товара
Весь список обрамлен в

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

ActiveForm::begin(['id' => 'calc_form'])
Для того, чтобы получать из формы массив веденных чисел в модели прописал

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

public $count = [];
Однако возник вопрос как сделать валидацию введенных данных, т.к. если прописать так

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

  public function rules()
    {
        
        return [
         
            ['count', 'each', 'rule' => ['integer']],

            
        ];
    }
то ошибка выводится под всеми полями в форме?
Последний раз редактировалось magicoder 2017.02.22, 20:47, всего редактировалось 2 раза.
Разработка на yii2 или чистом php.| email: site4coder@gmail.com | skype: for-web1
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: $form->field c именем в виде name[]

Сообщение rak »

а это точно должно быть count[], а не отдельные связанные модели?
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: $form->field c именем в виде name[]

Сообщение Onotole »

Если правильно помню, то 'allowMessageFromRule' => false
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: $form->field c именем в виде name[]

Сообщение Onotole »

И лучше в форме выводить просто

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

<?= $form->field($model, 'count[]') ->textInput();?>
Аватара пользователя
magicoder
Сообщения: 133
Зарегистрирован: 2015.12.16, 23:33
Контактная информация:

Re: $form->field c именем в виде name[]

Сообщение magicoder »

Я имею ввиду, что в форме будут выводиться одинаковые (40 шт.) поля <?= $form->field($model, 'count[]') ->textInput();?> Для их идентификации имя формируется как 'count[]' т.е. в виде массива.
В хтмл получится

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

 <input id="price-count-1"  name="Price[count][1]"  type="text">
 <input id="price-count-2"  name="Price[count][2]"  type="text">
 <input id="price-count-3"  name="Price[count][3]"  type="text">
.....
Поэтому в модели всего один атрибут

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

class Price extends Model
{
    public $count = [];
    ......
    
Но при валидации сообщения об ошибках появляются у всех инпутов ,т.к. атрибут указывактся как 'count'

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

   public function rules()
    {
        return [
            [['count'], 'safe'],
            ['count', 'each', 'rule' => ['integer']],
       ];
    }
Можно ли штатными способами сделать , чтобы сообщение об ошибке валидации появлялось только под полем с ошибкой?
Разработка на yii2 или чистом php.| email: site4coder@gmail.com | skype: for-web1
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: $form->field($model, 'name[]') Как валидировать?

Сообщение ElisDN »

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

$form->field($model, '[' . $i++ . ']count') ->textInput();
Аватара пользователя
magicoder
Сообщения: 133
Зарегистрирован: 2015.12.16, 23:33
Контактная информация:

Re: $form->field($model, 'name[]') Как валидировать?

Сообщение magicoder »

ElisDN писал(а): 2017.02.22, 21:42

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

$form->field($model, '[' . $i++ . ']enyname') ->textInput();
Так выкидывает ошибку

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

PHP Notice – yii\base\ErrorException
Array to string conversion


1. in C:\xampp\htdocs\site.local\vendor\yiisoft\yii2\helpers\BaseHtml.php at line 537
* See [[renderTagAttributes()]] for details on how attributes are being rendered.
     * @return string the generated input tag
     */
    public static function input($type, $name = null, $value = null, $options = [])
    {
        if (!isset($options['type'])) {
            $options['type'] = $type;
        }
        $options['name'] = $name;
        $options['value'] = $value === null ? null : (string) $value;
        return static::tag('input', '', $options);
    }
Разработка на yii2 или чистом php.| email: site4coder@gmail.com | skype: for-web1
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: $form->field c именем в виде name[]

Сообщение rak »

magicoder писал(а): 2017.02.22, 20:32 Я имею ввиду, что в форме будут выводиться одинаковые (40 шт.) поля <?= $form->field($model, 'count[]') ->textInput();?>
где и как потом будут храниться значения этих полей?
Аватара пользователя
magicoder
Сообщения: 133
Зарегистрирован: 2015.12.16, 23:33
Контактная информация:

Re: $form->field c именем в виде name[]

Сообщение magicoder »

rak писал(а): 2017.02.22, 22:36
magicoder писал(а): 2017.02.22, 20:32 Я имею ввиду, что в форме будут выводиться одинаковые (40 шт.) поля <?= $form->field($model, 'count[]') ->textInput();?>
где и как потом будут храниться значения этих полей?
В модели, которая связана с формой создается виртуальный атрибут public $count = [];
Разработка на yii2 или чистом php.| email: site4coder@gmail.com | skype: for-web1
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: $form->field($model, 'name[]') Как валидировать?

Сообщение rak »

это понятно, я про другое, как они будут храниться в БД?
Аватара пользователя
magicoder
Сообщения: 133
Зарегистрирован: 2015.12.16, 23:33
Контактная информация:

Re: $form->field($model, 'name[]') Как валидировать?

Сообщение magicoder »

Их хранить не нужно. Из поста будут перебираться все значения и складываться - это будет результат работы формы. Эти имена инпутов нужны для валидации, чтобы было понятно под каким полем выводить ошибку в форме (когда ввели не число, например). Вот все пердназначение input name тут. Ну а так как input _ов много ,то имена генерируются так <?= $form->field($model, 'имяатрибутавмодели[$i++]') ->textInput();?>
Модель содержит только один атрибут public $имяатрибутавмодели = [];
Модель нужна только для валидации.
Но так как в правилах валидации прописывается имя атрибута и валидатор, а имя атрибута содержит массив атрибутов, то сообщение об ошибке выводится под всеми полями формы.
Вопрос в том, как сделать, чтобы выводилось под полем с ошибкой и все.
Разработка на yii2 или чистом php.| email: site4coder@gmail.com | skype: for-web1
Ответить