"Сохранение" пути картинки в CHtml::activeFileField если другие поля не проходят валидацию

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Gogi
Сообщения: 103
Зарегистрирован: 2015.04.16, 09:20

"Сохранение" пути картинки в CHtml::activeFileField если другие поля не проходят валидацию

Сообщение Gogi »

Контроллер:

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

$model->attributes=$_POST['StudentReg'];
$model->avatar=CUploadedFile::getInstance($model,'avatar');
if($model->validate())
            {
                $model->avatar->saveAs("/images/avatars/name.jpg");
....
} 
View:
<?php echo CHtml::activeFileField($model, 'avatar'); ?>

Форма отправляется постом(без аякс валидации), страница обновляется.
Если текстовые поля формы не проходят валидацию - форма рендерится с ошибками и поля которые были заполнены так и остаются заполненными. С файлом же не так - фото нужно загружать заново.
Как это можно обойти?
pegas1981
Сообщения: 35
Зарегистрирован: 2012.05.15, 16:54

Re: "Сохранение" пути картинки в CHtml::activeFileField если другие поля не проходят валидацию

Сообщение pegas1981 »

Валидировать и сохранять файл во временную папку до валидации других полей.
Gogi
Сообщения: 103
Зарегистрирован: 2015.04.16, 09:20

Re: "Сохранение" пути картинки в CHtml::activeFileField если другие поля не проходят валидацию

Сообщение Gogi »

Переписал на аякс валидацию.
Модель:

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

array('avatar', 'file','types'=>'jpg, gif, png','maxSize' => 1024*1024*5, 'allowEmpty' => true), 
View:

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

<?php $form = $this->beginWidget('CActiveForm', array(
        'id' => 'registration-form',
        'action' => array('studentreg/registration'),
        'enableAjaxValidation'=>true,
        'clientOptions'=>array('validateOnSubmit'=>true,'validateOnChange'=>false),
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
    )); ?>
<?php echo CHtml::activeFileField($model, 'avatar',array('tabindex'=>'-1',"class"=>"chooseAvatar","onchange"=>"getName(this.value)")); ?>
Контроллер:

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

if (isset($_POST['ajax']) && $_POST['ajax'] === 'registration-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
        if (isset($_POST['Reg'])) {
...
        if (isset($model->avatar)) $model->avatar = CUploadedFile::getInstance($model, 'avatar');
            if ($model->validate()) {
                if (isset($model->avatar)) {
                    $fileName = ''text.jpg";
                    $model->avatar->saveAs(Yii::getpathOfAlias('webroot') . "/images/avatars/" . $fileName);
                    $model->avatar = $fileName;
                } else $model->avatar = 'noname.png';
...
        $model->save();
}
Теперь проблема с самой валидацией файла. Если убрать 'allowEmpty' => true - валидирует аяксом и хочет файла. А если оставить - не валидирует если файл 5.6 МБ. Если не загружать вообще файл то не сохраняет в базу $model->avatar = 'noname.png'; а заносит туда Null - это пока самая большая проблема. Как установить дефолтное имя если файл пустой
Ответить