Для начала необходимо скачать расширение.
Это можно сделать с официального сайта 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.
Комментарии
Комментарии отсутствуют, Вы можете быть первым