Загрузка файлов в 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(); ?>
Добавить комментарий