@flammerman
Web Developer / И фронт и сервер

Yii. Как провести валидацию нескольких наборов полей в массиве MySQL и вывести ошибки в форму?

Всем доброго времени суток

Есть таблица:
CREATE TABLE `goods_variations` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`goods_id` INT(10) UNSIGNED NOT NULL,
	`articul` VARCHAR(100) NULL DEFAULT NULL,
	`size` VARCHAR(100) NULL DEFAULT NULL,
	`color` VARCHAR(100) NULL DEFAULT NULL,
	`weight` VARCHAR(100) NULL DEFAULT NULL,
	`stock` INT(5) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `FK_goods_options_goods` (`goods_id`),
	INDEX `articul` (`articul`),


К ней стандартная форма

3a683a5cd6e945e6aba780cdd675e97a.png

Текущий контроллер
public function actionVariations($id) {
        if (Yii::app()->request->isAjaxRequest) {
            $this->layout = 'blank';
            $goods = Goods::model()->findByPk($id);
            $variations = GoodsVariations::model()->findAll(array('condition'=>'goods_id='.$id));
            
            if (isset($_REQUEST['GoodsVariations'])) {
                foreach ($_REQUEST['GoodsVariations'] as $values) {
                    $variation = new GoodsVariations;
                    $values['goods_id'] = $goods->id;
                    $variation->attributes = $values;
                    $variation->save();
                    print_r($_REQUEST);       
                }   
            }
            
            $this->render('_variations',array('variations'=>$variations, 'goods'=>$goods));    
        }  else {
             throw new CHttpException('403', 'Forbidden access.');
        } 
        Yii::app()->end();     
    }


Генератор формы
<table class="table table-bordered">
<thead>
<tr>
    <th>Артикул</th>
    <th>Размер</th>
    <th>Цвет</th>
    <th>Вес</th>
    <th>Количество</th>
</tr>
</thead>
<tbody>
    <?php
       $i=0; 
	   foreach ($variations as $variation) {
	       echo '<tr>';
           echo '<td>'.CHtml::activeTextField($variation,'['.$i.']articul',array('size'=>12,'class'=>'form-control')).'</td>';
           echo '<td>'.CHtml::activeTextField($variation,'['.$i.']size',array('size'=>12,'class'=>'form-control')).'</td>';
           echo '<td>'.CHtml::activeTextField($variation,'['.$i.']color',array('size'=>12,'class'=>'form-control')).'</td>';
           echo '<td>'.CHtml::activeTextField($variation,'['.$i.']weight',array('size'=>12,'class'=>'form-control')).'</td>';
           echo '<td>'.CHtml::activeTextField($variation,'['.$i.']stock',array('size'=>12,'class'=>'form-control')).'</td>';
           echo '</tr>';
           $i++;
	   }
    ?>
    <tr>
        <?php echo '<td>'.CHtml::textField('GoodsVariations['.$i.'][articul]','',array('size'=>12,'class'=>'form-control')).'</td>'; ?>
        <?php echo '<td>'.CHtml::textField('GoodsVariations['.$i.'][size]','',array('size'=>12,'class'=>'form-control')).'</td>'; ?>
        <?php echo '<td>'.CHtml::textField('GoodsVariations['.$i.'][color]','',array('size'=>12,'class'=>'form-control')).'</td>'; ?>
        <?php echo '<td>'.CHtml::textField('GoodsVariations['.$i.'][weight]','',array('size'=>12,'class'=>'form-control')).'</td>'; ?>
        <?php echo '<td>'.CHtml::textField('GoodsVariations['.$i.'][stock]','',array('size'=>12,'class'=>'form-control')).'</td>'; ?>
    </tr>
</tbody>
</table>


Как можно пробежаться по каждой строке с набором полей и провести валидацию с выводом ошибок в форму. В идеале еще и проверить если есть данные в базе (на картинке уже есть строка) то UPDATE если данных нету то INSERT.
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 1
kawabanga
@kawabanga
www.yiiframework.com/doc/guide/1.1/ru/form.table
обработка табличного ввода.

А создавать или обновлять, можно сделать примитивно. делаете hidden поле с id позицией. если id в post не приходит, то создавайте модель, иначе обновляйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы