Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP для продвинутых.docx
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
12.54 Mб
Скачать

14. Обработка изображений

Для того, чтобы форма могла отдавать файлы на сервер, элемент form должен содержать атрибут enctype

Добавление атрибута enctype к форме. Листинг 14.1

<? $form=$this->beginWidget('CActiveForm', array(

'id'=>'contact-form',

'enableClientValidation'=>true,

'htmlOptions' => array(

'enctype'=>'multipart/form-data',

)

)); ?>

Предположим, имеется элемент формы file:

Элемент формы file. Листинг 14.2

<input type="file" id="Candidats_picture" name="Candidats[picture]">

Необходимо поместить файл в нужную дирректориию и сделать соответствующую запись в таблице базы данных.

Для извлечения файлов можно воспользоваться классом CuploadedFile и статичным метом getInstance.

Часть экшна, отвечающая за обработку формы. Листинг 14.3

$model = new Candidats;

if (Yii::app()->request->getPost('Candidats')) {

$model->attributes = Yii::app()->request->getPost('Candidats');

$file = CUploadedFile::getInstance($model, 'picture');

$uploaded = false;

if($model->validate()){

$uploaded = $file->saveAs($_SERVER['DOCUMENT_ROOT']. '/'.Yii::app()->createUrl('/').'/images/'.$file->getName());

}

$model->picture = $file->getName();

if (!$model->save()) {

$model->getErrors();

}

}

Таким образом файл из формы обзора попадает в папку images, которая находится в корневой дирректории сайта.

Кроме того, имя файла добавляется в базу данных, в таблицу candidats через модель $model.

Валидация для загружаемого файла

Чтобы разрешить добавлять только файлы отвечающие заданным параметрам, можно в модели прописать правила.

Валидация загружаемых файлов в модели. Листинг 14.4

class Item extends CActiveRecord {

public $image;

// другие свойства

public function rules(){

return array(

//устанавливаем правила для файла, позволяющие загружать

// только картинки!

array('image', 'file', 'types'=>'jpg, gif, png'),

);

}

}

Кроме элемента массива types можно использовать элементы allowEmpty (можно ли не загружать файл), maxSize (разрешенный вес файла в байтах) и tooLarge (текстовое сообщение, если файл превышает допустимый размер):

Валидация загружаемых файлов в модели. Листинг 14.5

array('picture', 'file', 'types'=>'jpg, gif, png', 'allowEmpty'=>true,'maxSize'=>Yii::app()->params['bannersFilesUploadSize'], 'tooLarge'=>'Слишком большой файл.',),

Вернемся к экшну.

Если экшн перед сохранением данных обрабатывает ошибки:

Обработка ошибок перед сохранением данных. Листинг 14.6

if (!$model->save()) {

$model->getErrors();

}

То, если файл не соответсвует заданным параметрам, браузер сообщит об ошибке.

Удаление файлов

Перед удалением записи из таблицы базы данных, необходимо удалить сам файл.

Обработка ошибок перед сохранением данных. Листинг 14.7

$model=$this->loadModel($id);

if($model->picture){

$dir = $_SERVER['DOCUMENT_ROOT'].'/'.Yii::app()->createUrl('/').'/images/';

$pic = $dir.$model->picture;

@unlink($pic);

}

$this->loadModel($id)->delete();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]