Загрузка файлов в Yii используя модель

Yii
/
2013-09-19 23:58
Просмотры: 4106

Часто, особенно при написании бэкендов, стоит задача загрузки файла к определенной сущности. Это может быть изображение к статье, файл прайса к товару, установочный файл приложения и т.д. Данные при заполнении будут приходить с формы. Поэтому лучший вариант это использование модели для валидации входящих данных.

Модель

Файла для сохранения будем хранить в переменной $image класса модели. Так же, в правилах валидации объявляем правило для проверки файла, так как он приходи из формы.

class Item extends CActiveRecord
{
    public $image;
    // ... остальный аттрибуты
 
    public function rules()
    {
        return array(
            array('image', 'file', 'types'=>'jpg, gif, png'),
        );
    }
}

Контроллер

В экшене контроллера файл для сохранения присваиваем аттрибуту модели.

class ItemController extends CController
{
    public function actionCreate()
    {
        $model=new Item;
        if(isset($_POST['Item']))
        {
            $model->attributes=$_POST['Item'];
            $model->image=CUploadedFile::getInstance($model,'image');
            if($model->validate())
            {
                $model->image->saveAs('path/to/localFile');
                $model->save();
                // перенаправление на страницу успешной загрузки
            }
        }
        $this->render('create', array('model'=>$model));
    }
}

CUploadedFile::saveAs() - один из методов CUploadedFile.

Представление

$form = $this->beginWidget(
    'CActiveForm',
    array(
        'id' => 'upload-form',
        'enableAjaxValidation' => false,
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
    )
);
// ...
echo $form->labelEx($model, 'image');
echo $form->fileField($model, 'image');
echo $form->error($model, 'image');
// ...
$this->endWidget();

При использовании статического вызова CHtml, вместо CActiveForm

<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>
//...
<?php echo CHtml::activeFileField($model, 'image'); ?>
//...
<?php echo CHtml::endForm(); ?>

Добавить комментарий

comments powered by Disqus