Как пройти валидацию для нескольких файлов?

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Как пройти валидацию для нескольких файлов?

Сообщение solo »

В рецепте Как загрузить файл используя модель указанно:
http://www.yiiframework.ru/doc/cookbook ... ile.upload

Если происходит загрузка нескольких файлов, код будет таким:

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

if($model->save()){
    foreach($model->image as $file){
        $file->saveAs('path/to/localFile');
    }
    // перенаправляем на страницу, где выводим сообщение об
    // успешной загрузке
} 
Но как в таком случае пройти валидацию?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как пройти валидацию для нескольких файлов?

Сообщение futbolim »

перенести проверку и сохранение файлов в beforeSave
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Можно пример именно самой валидации файлов. Например если в представлении:

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

<?php echo CHtml::activeFileField($model, 'img[]', ['multiple' => 'multiple']); ?>
А файлы нужно проверить например на тип и размер.
Аватара пользователя
howard
Сообщения: 528
Зарегистрирован: 2012.11.16, 18:55
Откуда: Україна, Вінниця

Re: Как пройти валидацию для нескольких файлов?

Сообщение howard »

'maxFiles'=>5, 'on'=>'upload'
Агрегатор цен на услуги хостинга - https://hostcost.net
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

howard писал(а):'maxFiles'=>5, 'on'=>'upload'
Ну причем здесь это
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Даю код, может так будет понятнее вопрос.

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

public function actionB()
    {
        $info = false;
        $model = new File;

        if(isset($_FILES['File']))
        {
            $model->img = CUploadedFile::getInstance($model, 'img');
            if($model->validate())
            {
                $info = true;
            }
        }

        $this->render('b',['model'=>$model, 'info'=>$info]);
    } 

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

<?php
class File extends CFormModel
{
    public $img;

    public function rules()
    {
        return[
            ['img', 'file', 'types'=> 'png, jpg'],
        ];
    }
} 

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

<?php
/**
 * @var UploadController $this
 * @var File $model
 * @var CActiveForm $form
 */
?>

<?php if($info===false):?>
    <div class="form">
        <?php $form = $this->beginWidget('CActiveForm',[
            'method' => 'POST',
            'htmlOptions'=>[
                'enctype'=>'multipart/form-data'
            ],
        ]); ?>
        <?php echo $form->errorSummary($model); ?>
        <div class="row">
            <?php echo $form->labelEx($model, 'img'); ?>
            <?php echo $form->fileField($model, 'img'); ?>
            <?php echo $form->error($model, 'img'); ?>
        </div>
        <?php echo CHtml::SubmitButton('Загрузить'); ?>
        <?php $this->endWidget(); ?>
    </div>
<?php else: ?>
    Файл(ы) успешно загружен(ы)
<?php endif; ?>
Загрузка одного файла.

Как пройти валидацию множества файлов? Если в виде

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

<?php echo $form->fileField($model, 'img', ['multiple' => 'multiple']); ?>
а в контроллере

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

$model->img = CUploadedFile::getInstances($model, 'img');
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Если кому интересно что пришло на ум после просмотра темы Обработка табличного ввода

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

public function actionB()
    {
        $model = new File;
        $info = false;
        if(isset($_FILES['File']))
        {
            $valid=true;
            foreach($_FILES['File']['name'] as $i => $item)
            {
                $model->img = CUploadedFile::getInstance($model, '['.$i.']img');
                $valid=$model->validate() && $valid;
            }

            if($valid)
            {
                echo 'valid';
            }
        }

        $this->render('b',['model'=>$model, 'info'=>$info]);
    }

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

<?php
class File extends CFormModel
{
    public $img;

    public function rules()
    {
        return[
            ['img', 'file', 'types'=> 'png, jpg'],
        ];
    }
}

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

<?php
/**
 * @var UploadController $this
 * @var File $model
 * @var CActiveForm $form
 */
?>

<?php if($info===false):?>
    <div class="form">
        <?php $form = $this->beginWidget('CActiveForm',[
            'method' => 'POST',
            'htmlOptions'=>[
                'enctype'=>'multipart/form-data'
            ],
        ]); ?>
        <?php echo $form->errorSummary($model); ?>
        <div class="row">
            <?php echo $form->labelEx($model, 'img'); ?>
            <?php echo $form->fileField($model, '[]img', ['multiple' => 'multiple']); ?>
            <?php echo $form->error($model, 'img'); ?>
        </div>
        <?php echo CHtml::SubmitButton('Загрузить'); ?>
        <?php $this->endWidget(); ?>
    </div>
<?php else: ?>
    Файл(ы) успешно загружен(ы)
<?php endif; ?>
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Как пройти валидацию для нескольких файлов?

Сообщение lancedevnull »

model::rules

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

array('photo', 'file', 'allowEmpty' => false, 'maxFiles' => 5, 'mimeTypes' => 'image/gif, image/jpeg', 'on' => 'insert'),
array('photo', 'file', 'allowEmpty' => true, 'maxFiles' => 5, 'mimeTypes' => 'image/gif, image/jpeg', 'on' => 'update'),
 

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

public function beforeSave(){

        if (parent::beforeSave()) {
            if ($this->photo instanceof CMultiUploadedFile) {
               $photos = $this->photo;
               $this->photo = array();
                foreach ($photos as $photo) {
                     do {
                         $filename = md5(rand(0,100)).$photo->getExtensionName();
                     }while(self::model()->exists(array('condition' => 'photo = :photo', 'params' => array(':photo' => $filename))));
                     $saved = $saved && $photo->saveAs($filename);
                     if ($saved)
                           $this->photo[] = $filename;
                }
                $this->photo = implode(',', $this->photo);
            }
            return true;
        }
        return false;
    }
 
тут нет удаление старых при апдейте и возможно иногда понадобится добавлять файлы к уже существующим, тогда тоже надо пересмотреть алгоритм, а лучше файлы хранить в другой таблице
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Как пройти валидацию для нескольких файлов?

Сообщение lancedevnull »

и условие на уникальность будет другим, я код для 1 файла переделывался для мульти.
В контроллере не надо ничего сохранять, хотя дело вкуса
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Тема вообще то Как пройти валидацию для нескольких файлов?
А не скописастить блог. (Если обидел простите, но не оффтопьте)
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Опять 45 я эти темы уже смотрел тестил, но о валидации там ни слова! Мне было интересно как сделать валидацию чтобы не писать велосипед, а помогла в этом тема Обработка табличного ввода
Аватара пользователя
howard
Сообщения: 528
Зарегистрирован: 2012.11.16, 18:55
Откуда: Україна, Вінниця

Re: Как пройти валидацию для нескольких файлов?

Сообщение howard »

вот правильно тебе человек написал и я еще раньше с maxFiles все отлично валидируется
http://www.yiiframework.com/doc/api/1.1 ... ator#c4905
недавно делал мультизагрузку, так что с уверенностью, могу сказать, что этот метод работает!
Агрегатор цен на услуги хостинга - https://hostcost.net
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Как пройти валидацию для нескольких файлов?

Сообщение solo »

Прошу прощения всех кого оскорбил. Был молод и глуп :). Сейчас решил написать MVC чтобы новички не мучились.

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

<?php
class Upload extends CFormModel
{
    public $file;

    public function rules()
    {
        return [
            ['file', 'file', 'types'=>'zip', 'maxFiles'=>3],
        ];
    }
} 

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

<?php if($uploaded): ?>
    <p>Файлы загружены в <?php echo $dir; ?> !</p>
<?php else: ?>
    <?php echo CHtml::beginForm('', 'post', ['enctype'=>'multipart/form-data']); ?>
    <?php echo CHtml::error($model, 'file'); ?>


    <?php echo CHtml::activeFileField($model, "file[]", ['multiple'=>true]); ?><br/>

    <?php /*
    <?php echo CHtml::activeFileField($model, "file[0]"); ?><br/>
    <?php echo CHtml::activeFileField($model, "file[1]"); ?><br/>
    <?php echo CHtml::activeFileField($model, "file[2]"); ?><br/><br/>
    */?>

    <?php echo CHtml::submitButton('Upload'); ?>
    <?php echo CHtml::endForm(); ?>
<?php endif; ?>

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

<?php
class UploadController extends Controller
{
    public function actionMany()
    {
        $dir = Yii::getPathOfAlias('webroot.uploads');

        $uploaded = false;

        $model = new Upload();

        if(isset($_POST['Upload']))
        {
            $model->attributes = $_POST['Upload'];
            $files = CUploadedFile::getInstances($model, 'file');
            if($model->validate())
            {
                foreach($files as $file)
                {
                    $filePath = $dir . DIRECTORY_SEPARATOR . $file->getName();
                    $uploaded = $file->saveAs($filePath);
                    chmod($filePath, 0777);
                }
            }
        }

        $this->render('many', [
            'model'=>$model,
            'uploaded'=>$uploaded,
            'dir'=>$dir
          ]);
    }
}
Ответить