Для начала необходимо скачать расширение.
Это можно сделать с официального сайта Yii, раздел расширения:
http://www.yiiframework.com/extension/cimagemodifier/
Или по прямой ссылки с сайта кодер.укр:
Распаковываем архив в папку с проектом /protected/extensions/imagemodifier. И начинаем работать с ним ;)
- Простой пример работы с изображениями с помощью расширения CImageModifier для Yii Framework
- Основные свойства расширения CImageModifier для Yii Framework
- Подробный пример работы с изображениями с помощью расширения CImageModifier для Yii Framework
Простой пример работы с изображениями с помощью расширения CImageModifier для Yii Framework
В месте, где нам необходимо выполнить загрузку и обработку изображения подключаем расширение и выполняем требуемые операции:
<?php
//...код...
Yii::app()->setComponents(
array('imagemod' => array(
'class' => 'application.extensions.imagemodifier.CImageModifier')
)
);
Yii::app()->imagemod->setLanguage('ru_RU');
$imageModifier = Yii::app()->imagemod->load($_FILES['formFieldName']);
if ($imageModifier->uploaded) {
$imageModifier->image_resize = true;
$imageModifier->image_ratio_y = true;
$imageModifier->image_x = 50;
$imageModifier->file_new_name_body = md5($img->file_src_name);
$imageModifier->process(Yii::getPathOfAlias('webroot') . '/images/');
if ($imageModifier->processed) {
Yii::app()->user->setFlash('success', 'Изображение загружено успешно');
$imageModifier->clean();
} else {
Yii::app()->user->setFlash('error', $imageModifier ->error);
}
}
//...код...
Если Вам необходимо изменить уже загруженное изображение, то в параметре Yii::app()->imagemod->load (строка: 13) укажите путь к этому изображению, пример:
//...
Yii::app()->imagemod->setLanguage('ru_RU');
$img = Yii::app()->imagemod->load('путь/к/изображению');
if ($imageModifier->uploaded) {
//...
Основные свойства расширения CImageModifier для Yii Framework
Обработка файла
| Свойство | Тип | Описание |
|---|---|---|
| file_new_name_body | string | Заменяет имя файла. Пример: $handle->file_new_name_body = 'new_file_name'; |
| file_name_body_add | string | Добавочная строка к имени файла (добавляется к концу имени). Пример: $handle->file_name_body_add = '_uploaded'; |
| file_name_body_pre | string | Префикс к названию
Пример: $handle->file_name_body_pre = 'thumb_';
|
| file_safe_name | boolean | Форматирует имя (заменяет 'space', '-' и т.п. на '_') (по умолчанию: true)
Пример: $handle->file_safe_name = true;
|
| file_auto_rename | boolean | Автоматически переименовывает файл, если он уже существует (по умолчанию: true)
Пример: $handle->file_auto_rename = true;
|
Обработка изображения
| Свойство | Тип | Описание |
|---|---|---|
| image_convert | |'png'|'jpeg'|'gif'|'bmp | Если установлено, изображение будет преобразовано
Пример: $handle->image_convert = 'jpg';
|
| png_compression | integer | Устанавливает уровень сжатия для изображений в формате PNG, где 1 (быстрых, большие файлы) и 9 (медленных, маленькие файлы) (по умолчанию: null)
Пример: $handle->png_compression = 9;
|
| jpeg_quality | integer | Устанавливает качество сжатия для изображений в формате JPEG (по умолчанию: 85)
Пример: $handle->jpeg_quality = 50;
|
Изменение размеров изображений
| Свойство | Тип | Описание |
|---|---|---|
| image_resize | boolean | Разрешает изменять размеры изображения (по умолчанию: false)
Пример: $handle->image_resize = true;
|
| image_x | integer | Ширина изображения в пикселях (по умолчанию: 150)
Пример: $handle->image_x = 100;
|
| image_y | integer | Высота изображения в пикселях (по умолчанию: 150)
Пример: $handle->image_y = 200;
|
| image_ratio | boolean | true - сохраняет размер исходного соотношения сторон (по умолчанию: false)
Пример: $handle->image_ratio = true;
|
| image_ratio_crop | boolean | true - сохранить соотношение оригинальных размеров при подрезке (по умолчанию: false)
Пример: $handle->image_ratio_crop = true;
|
| image_ratio_x | boolean | true - сохраняет соотношение сторон изображения по ширине (по умолчанию: false)
Пример: $handle->image_ratio_x = true;
|
| image_ratio_y | boolean | true - сохраняет соотношение сторон изображения по высоте (по умолчанию: false)
Пример: $handle->image_ratio_y = true;
|
Текст изображения
| Свойство | Тип | Описание |
|---|---|---|
| image_text | string | Текст на изображении (по умолчанию: null)
Пример: $handle->image_text = 'тест';
|
| image_text_direction | 'v'|'h' | Направление текста, 'h' по горизонтали, 'v' по вертикали (по умолчанию: 'h')
Пример: $handle->image_text_direction = 'v';
|
| image_text_color | string | Цвет текста (по умолчанию: #FFFFFF)
Пример: $handle->image_text_color = '#000000';
|
| image_text_opacity | integer | Прозрачность текста, число от 0 до 100, где 100 - без прозрачности (по умолчанию 100)
Пример: $handle->image_text_opacity = 50;
|
| image_text_font | integer | Встроенный шрифт для текста, от 1 до 5. 1 является наименьшим (по умолчанию: 5)
Пример: $handle->image_text_font = 4;
|
| image_text_x | integer | Абсолютное положение текста, в пикселях от левого края. Может быть отрицательным (по умолчанию: null)
Пример: $handle->image_text_x = 5;
|
| image_text_y | integer | Абсолютное положение текста, в пикселях от верхней границы. Может быть отрицательным (по умолчанию: null)
Пример: $handle->image_text_y = 5;
|
| image_text_position | string | Положение текста на изображении, сочетание одной или двух букв из "TBLR", где T - сверху, B - снизу, L - слева, R - справа (по умолчанию: null)
Пример: $handle->image_text_position = 'LR';
|
Водяной знак изображения
| Свойство | Тип | Описание |
|---|---|---|
| image_watermark | string | Добавляет водяной знак на изображения, значением является путь к изображению водяного знака. Принимаемые файлы gif, jpg, bmp, png (по умолчанию: null)
Пример: $handle->image_watermark = '/путь/watermark.png';
|
| image_watermark_x | integer | Абсолютное положение водяного знака, в пикселях от левого края. Может быть отрицательным (по умолчанию: null)
Пример: $handle->image_watermark_x = 5;
|
| image_watermark_y | integer | Абсолютное положение водяного знака, в пикселях от верхней границы. Может быть отрицательным (по умолчанию: null)
Пример: $handle->image_watermark_y = 5;
|
| image_watermark_position | string | Позиция водяного знака на изображении, сочетание одной или двух букв из "TBLR", где T- сверху, B - снизу, L - слева, T - справа (по умолчанию: null)
Пример: $handle->image_watermark_position = 'LR';
|
Официальная документация: https://github.com/verot/class.upload.php/blob/master/README.md
Подробный пример работы с изображениями с помощью расширения CImageModifier для Yii Framework
Перейдем к подробному примеру использования расширения CImageModifier для загрузки изображения на сайт. Разберем загрузку изображений на сайт на примере добавления/редактирования статей. Создадим простую таблицу для статей и стандартную модель к ним (путь к модели: /protected/models/Posts.php):
<?php
class Posts extends CActiveRecord {
public function tableName() {
return 'posts';
}
public function rules() {
return array(
array('url, header, metaTitle', 'required'),
array('shortText, text, metaKeywords, '
. 'metaDescription, visibility, date, '
. 'img, imgAlt, imgTitle', 'safe'),
array('visibility', 'numerical', 'integerOnly' => true),
array('url, header, metaTitle, '
. 'metaKeywords, img, imgAlt, '
. 'imgTitle', 'length', 'max' => 255),
array('url', 'unique'),
array('id, url, header, '
. 'shortText, text, metaTitle, '
. 'metaKeywords, metaDescription, '
. 'visibility, date, img, '
. 'imgAlt, imgTitle', 'safe', 'on' => 'search'),
);
}
public function relations() {
return array(
//...
);
}
public function attributeLabels() {
return array(
'id' => 'ID',
'url' => 'Url',
'header' => 'Заголовок',
'shortText' => 'Краткий текст',
'text' => 'Текст',
'metaTitle' => 'Meta Title',
'metaKeywords' => 'Meta Keywords',
'metaDescription' => 'Meta Description',
'visibility' => 'Выводить',
'date' => 'Дата',
'img' => 'Изображение',
'imgAlt' => 'Alt для изображения',
'imgTitle' => 'Title для изображения',
);
}
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('url', $this->url, true);
$criteria->compare('header', $this->header, true);
$criteria->compare('shortText', $this->shortText, true);
$criteria->compare('text', $this->text, true);
$criteria->compare('metaTitle', $this->metaTitle, true);
$criteria->compare('metaKeywords', $this->metaKeywords, true);
$criteria->compare('metaDescription', $this->metaDescription, true);
$criteria->compare('visibility', $this->visibility);
$criteria->compare('date', $this->date);
$criteria->compare('img', $this->img);
$criteria->compare('imgAlt', $this->imgAlt);
$criteria->compare('imgTitle', $this->imgTitle);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
public static function model($className = __CLASS__) {
return parent::model($className);
}
}
Теперь перейдем к контроллеру (controller) управления нашими записями. Приведем пример стандартных действий (actions) добавления/редактирования для статей (путь к контроллеру /protected/modules/admin/controllers/PostsController.php):
<?php
class PostsController extends BackEndController {
//...код...
public function actionAdd() {
$model = new AdminPosts;
$this->breadcrumbsTitle = $this->pageHeader = $this->pageTitle = 'Добавление записи';
$this->breadcrumbs = array(
'Записи' => '/posts',
$this->breadcrumbsTitle
);
if (isset($_POST['AdminPosts']) && !isset($_POST['yt2'])) {
$model->attributes = $_POST['AdminPosts'];
if ($model->save()) {
Yii::app()->user->setFlash('success', 'Запись успешно добавлена.');
Yii::app()->request->redirect(
(isset($_POST['yt1']) ?
'/posts' :
'/admin/posts/edit/' . $model->id)
);
} else {
Yii::app()->user->setFlash('error', 'Проверте поля еще раз.');
}
}
$this->render('_form', array('model' => $model));
}
public function actionEdit($id) {
$model = AdminPosts::model()->findByPk($id);
$model->oldImg = $model->img;
$this->breadcrumbsTitle = $this->pageHeader = $this->pageTitle = 'Редактирование записи';
$this->breadcrumbs = array(
'Записи' => '/posts',
$this->breadcrumbsTitle
);
if (isset($_POST['AdminPosts']) && !isset($_POST['yt2'])) {
$model->attributes = $_POST['AdminPosts'];
if ($model->save()) {
Yii::app()->user->setFlash('success', 'Запись успешно отредактирована.');
Yii::app()->request->redirect(
(isset($_POST['yt1']) ?
'/posts' :
'/admin/posts/edit/' . $model->id)
);
} else {
Yii::app()->user->setFlash('error', 'Проверьте поля еще раз.');
}
}
$this->render('_form', array('model' => $model));
}
}
Далее пример представления (view) формы для редактирования/добавления статьи (путь к view: /themes/themeName/views/admin/posts/_form.php):
<div class="page-header">
<h1><?php echo $this->pageHeader; ?></h1>
</div>
<?php
$form = $this->beginWidget('CActiveForm', array(
'focus' => array($model, 'header'),
'htmlOptions' => array(
'class' => '',
'enctype' => 'multipart/form-data',
'role' => 'form'
),
'clientOptions' => array(
'validateOnSubmit' => false,
'validateOnChange' => true,
'validateOnType' => false,
'errorCssClass' => 'has-error',
),
));
?>
<small>Поля отмеченные <span class="required">*</span> обязательны для заполнения</small>
<div class="checkbox">
<label>
<?php echo $form->checkBox($model, 'visibility', array('class' => '')); ?>
<span class="lbl"><?php echo $form->label($model, 'visibility', array()); ?></span>
</label>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'header'); ?>
<?php echo $form->textField($model, 'header', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'header'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'url'); ?>
<?php echo $form->textField($model, 'url', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'url'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'date'); ?>
<?php echo $form->textField($model, 'date', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'date'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'metaTitle'); ?>
<?php echo $form->textField($model, 'metaTitle', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'metaTitle'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'metaKeywords'); ?>
<?php echo $form->textField($model, 'metaKeywords', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'metaKeywords'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'metaDescription'); ?>
<?php echo $form->textField($model, 'metaDescription', array(
'class' => 'form-control',
'rows' => 3)
); ?>
<?php echo $form->error($model, 'metaDescription'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'shortText'); ?>
<?php echo $form->textArea($model, 'shortText', array(
'class' => 'form-control',
'rows' => 10,
'id' => 'editor-desc')
); ?>
<?php echo $form->error($model, 'shortText'); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'text'); ?>
<?php echo $form->textArea($model, 'text', array(
'class' => 'form-control',
'rows' => 35, 'id' => 'editor-text')
); ?>
<?php echo $form->error($model, 'text'); ?>
</div>
<h4>Изображение (200x150)</h4>
<table class="table">
<tr>
<td>
<div class="input-group">
<?php echo $form->labelEx($model, 'img'); ?>
<?php echo $form->fileField($model, 'img', array(
'class' => 'btn btn-default form-control',
'title' => 'Выберите изображение',
'accept' => 'image/gif, image/jpeg, image/png')
); ?>
<?php echo $form->error($model, 'img', array('class' => 'help-block small')); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'imgAlt'); ?>
<?php echo $form->textField($model, 'imgAlt', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'imgAlt', array('class' => 'help-block small')); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'imgTitle'); ?>
<?php echo $form->textField($model, 'imgTitle', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'imgTitle', array('class' => 'help-block small')); ?>
</div>
</td>
<td class="pre-img<?php echo ($model->isNewRecord ? ' hidden' : ''); ?>">
Вывод превью изображения и кнопка удаления изображения
</td>
</tr>
</table>
<div class="form-actions">
<button type="submit" name="yt0" class="btn btn-info">
<i class="icon-ok bigger-110"></i>
Сохранить
</button>
<button type="submit" class="btn btn-primary" name="yt1">
<i class="icon-arrow-right icon-on-right bigger-110"></i>
Сохранить и выйти
</button>
<button type="reset" class="btn">
<i class="icon-undo bigger-110"></i>
Отмена
</button>
</div>
<?php
$this->endWidget();
И модель статей в которой мы будем обрабатывать и загружать изображения (путь к модели: /protected/modules/admin/models/AdminPosts.php):
<?php
class AdminPosts extends Posts {
/**
* Имя старого изображения
*
* @var string
*/
public $oldImg = '';
static function model($className = __CLASS__) {
return parent::model($className);
}
/**
* Действия перед сохранением записи
*
* @return boolean
*/
protected function beforeSave() {
$this->img = $this->oldImg;
parent::beforeSave();
return true;
}
/**
* Действия после сохранения записи
*
* @return boolean
*/
protected function afterSave() {
//...код...
//
//загружаем изображение
$this->uploadImage();
//...код...
return parent::afterSave();
}
/**
* Загрузка изображения
*
* @return string - имя изображения
*/
public function uploadImage() {
$pathToFolder = Yii::getPathOfAlias('webroot') . '/images/posts/';
if (empty($_FILES['AdminPosts'])) {
return $this->oldImg;
}
$imgName = $this->oldImg;
Yii::import('application.extensions.upload.Upload');
Yii::app()->setComponents(
array('imagemod' =>
array('class' => 'application.extensions.imagemodifier.CImageModifier')
)
);
Yii::app()->imagemod->setLanguage('ru_RU');
$handle = Yii::app()->imagemod->load($_FILES['AdminPosts']);
if ($handle->uploaded) {
//удаляем старое изображение
$this->deleteImage();
//путь к водяному знако для изображения
$handle->image_watermark = Yii::getPathOfAlias('webroot') .
'/images/watermark/watermark.png';
//место размещения водяного знака на изображении
$handle->image_watermark_position = 'BR';
//имя файла сохраняем как есть
$handle->file_safe_name = false;
//не переименовывать имя файла
$handle->file_auto_rename = false;
//качество jpg = 100%
$handle->jpeg_quality = 100;
//разрешить изменение размера изображения
$handle->image_resize = true;
//не сохранить соотношения размеров
$handle->image_ratio = false;
//сохранить соотношение оригинальных размеров при подрезке
$handle->image_ratio_crop = true;
//ширина изображения
$handle->image_x = 150;
//высота изображения
$handle->image_y = 200;
//добавляем префикс к имени файла (в данном случае - это id записи)
$handle->file_name_body_pre = $this->primaryKey . '-';
$handle->process($pathToFolder);
if ($handle->processed) {
$imgName = $handle->file_dst_name;
$handle->clean();
} else {
Yii::app()->user->setFlash('error', $handle->error);
}
}
$this->isNewRecord = false;
$this->saveAttributes(array('img' => $imgName));
return $imgName;
}
/**
* Удаление изображение
*
* @return boolean
*/
public function deleteImage() {
$pathToFolder = Yii::getPathOfAlias('webroot') . '/images/posts/';
if (file_exists($pathToFolder . $this->img)) {
unlink($pathToFolder . $this->img);
$this->isNewRecord = false;
$this->saveAttributes(array($fieldImage => ''));
return true;
} else {
return false;
}
}
}
Вот и все, приятной работы с изображениями при помощи расширения CImageModifier для Yii Framework.
devreadwrite.com


Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Комментарии отсутствуют, Вы можете быть первым