Загрузка и валидация множества однотипных файлов

День добрый!

Прошу помочь в решении следующего вопроса (дать совет как лучше будет изобразить грамотно программно):

  1. Есть форма, несколько инпутов с типом file.

  2. Нужно одним постом формы загрузить сразу несколько файлов с изображением (batchем), но возник вопрос. А как сразу нескольким полям назначить валидацию и загрузить через цикл все сразу.

В контроллере так:




            $model->attributes = $_POST['Fotos'];

            $model->image = CUploadedFile::getInstance($model, 'image');

            $fname = $model->image->getName();


            $model->fotofilename = $fname;

            if ($model->save())

            {

               $model->image->saveAs('static/fotos/'.$model->image->getName());

            }



В модели




		return array(

                        array('image', 'file', 'types'=>'jpg'),



Во вью:




<div id="form">

<?php echo CHtml::form('', 'post', array('enctype'=>'multipart/form-data')); ?>

<?php echo CHtml::errorSummary($model); ?>




    <div class="row">

        <?php echo CHtml::activeFileField($model, 'image'); ?>

    </div>

    

    <div class="row">

        <?php echo CHtml::submitButton('Отправить'); ?>

    </div>


<?php echo CHtml::endForm(); ?>

</div>



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

Эта тема есть в guide: http://www.yiiframework.com/doc/guide/form.table

Решил следующим образом.

Принцип работы почти весь взят из мануала, но новичкам, думаю, будет полезным - в случае создания (а не обновления update как это написано в мане).

Суть кода заключается в том что загрузка файлов не произойдет полностью до тех пор, пока полностью все файлы не будут "корректными", если все ок - то загружаем все целиком.

Контроллер:




    public function actionAdd()

    {

        

    // @TODO : 3 - значение из параметра (кол-во обходов файлов = инпутов)

    for ($i = 1; $i <= 3; $i++) 

    {

    	$items[$i] = new Fotos();

    }

		$valid = true;

    	foreach ($items as $i=>$item):

    		// ВАЛИДАЦИЯ ->

	   		if (isset( $_POST['Fotos'][$i]))

	        {

	                $item->attributes = $_POST['Fotos'][$i];

	                $item->image = CUploadedFile::getInstance($item, '['.$i.']image');

	

	                // проверка на пустое значение инпута и валидация

	                if (($item->image !== null))

	                {

	                		$valid=$valid && $item->validate();

	                		

	               }

	       }

	   endforeach;

	   // Если все ок -> то сохраняем

	   if ($valid)

	   {

	   		foreach($items as $i=>$item)

	   		{

	                $item->attributes = $_POST['Fotos'][$i];

	                $item->image = CUploadedFile::getInstance($item, "[$i]image");

	                if (($item->image !== null))

	                {

	                    	$fname = $item->image->getName();

	                    	$item->fotofilename = $fname;

	                    	if ($item->save())

	                       		$item->image->saveAs('static/fotos/'.$fname);

	                }

	        }

	   }


        $this->render('add', array('items'=>$items));

    }

}



Модель:




	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

            array('image', 'file', 'types'=>'jpg'),

			array('fotofilename', 'length', 'max'=>100),

		);

	}



Вью:




<div id="form">

<?php echo CHtml::form('', 'post', array('enctype'=>'multipart/form-data')); ?>


<?php 

	foreach ($items as $i => $item) 

	{ 

		echo CHtml::errorSummary($item); 

	}	

?>


<?php foreach ($items as $i => $item): ?> 

    <div class="row">

        <?php echo CHtml::activeFileField($item, "[$i]image"); ?>

    </div>

<?php endforeach; ?>

    

    <div class="row">

        <?php echo CHtml::submitButton('Отправить'); ?>

    </div>


<?php echo CHtml::endForm(); ?>

</div>



Был бы благодарен за комментарии и наметки (подсказки) на оптимизацию подобного рода схемы работы

Спасибо, пригодится :)