Прошу помочь в решении следующего вопроса (дать совет как лучше будет изобразить грамотно программно):
Есть форма, несколько инпутов с типом file.
Нужно одним постом формы загрузить сразу несколько файлов с изображением (batchем), но возник вопрос. А как сразу нескольким полям назначить валидацию и загрузить через цикл все сразу.
Принцип работы почти весь взят из мануала, но новичкам, думаю, будет полезным - в случае создания (а не обновления 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),
);
}