Загрузка файлов в Yii используя модель
Часто, особенно при написании бэкендов, стоит задача загрузки файла к определенной сущности. Это может быть изображение к статье, файл прайса к товару, установочный файл приложения и т.д. Данные при заполнении будут приходить с формы. Поэтому лучший вариант это использование модели для валидации входящих данных.
Модель
Файла для сохранения будем хранить в переменной $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(); ?>
Добавить комментарий