godzie44/yii2-image-behavior

Behavior that will help you to save the modified copy of the uploaded image and give you easy access to them

v1.0.0 2016-06-05 14:42 UTC

This package is not auto-updated.

Last update: 2024-04-19 20:19:39 UTC


README

This behavior will help you to:

  • easy save uploaded image
  • easy save modified copy of the initial image by apply modifiers like resize, flip and others. Also, you can apply more modifiers in an arbitrary sequence.
  • get access to uploaded images
  • delete images when delete record, update images when update record

Installation

composer require godzie44/yii2-image-behavior

Test

$ codecept run

Usage

In controller.

Just put in image attribute FileUpload object (like in official guide) and call $model->save() method

In model (example)

 public function behaviors()
    {
        return [
             [
                'class' => \godzie44\yii\behaviors\image\ImageBehavior::className(),

                'imageAttr' => 'avatar', //attribute in model, instance of FileUploaded

                'images' => [ // array of images that we whant to save
                   'default' => ['default' => []],
                   'small' => ['resize' => [150,200]],
                   'fliped' => ['flip' => [30]],
                   'sharped' => ['sharpen' => [30]],
                   'croped' => ['crop' => [30,40,20,10]],
                   'medium-rotate' => ['resize' => [300,400], 'rotate' => [40]],
                ],

                'saveDirectory' => Yii::getAlias('@webroot/uploads/avatars/'),
            ],
            ...
        ];
    }

Now in 'saveDirectory' directory we have 6 images with names like "<timestapm><default/small/fliped/...>.<file extension>"

Get path to this images by calling $model->getImage('default') - where default is postfix of needed image

Parameters

### Behavior parameters

  • imageAttr (required, string) Name of model attribute that contains FileUploaded object.

  • images (required, array[]) List of output images. Fields in this array must be format:

    [string image_postfix => [string modifiers => array $params, ...]]

    where:

    • image_postfix string, postfix of concrete image
    • modifiers string, modificator that will be applied to the image. (see modificator list and their params in modificators section)
    • params array, params of modificator
  • saveDirectory (required, string) The directory where the images are saved.

  • options (optional, array) where:

    • deleteOldWhenUpdate (optional, boolean) Default True. True - delete old images when upload new file in existing field, false - don't delete.
    • ifNullBehavior (optional, string) Default ImageBehavior::DELETE_IF_NULL. ImageBehavior::DELETE_IF_NULL - when attribute=NULL old images will be deleted, ImageBehavior::DO_NOTHING_IF_NULL - when attribute=NULL old images dont be deleted and field don be rewrite.

### Modifiers

  • default default image, params is empty array [].
  • resize resize image, params [int width,int height].
  • flip flip image, params [int direction].
  • sharpen sharpen image, params [int amount].
  • crop crop image, params [int width, int height,int offset_x,int offset_y].
  • rotate rotate image, params [int degrees].

You can use this modifiers in any number and combinations.

Simple example of usage (user profile with avatar)

In controller

public function actionProfile() {
        $model =  User::findOne(Yii::$app->user->id);
        if ($model->load(Yii::$app->request->post())) {
            $model->avatar = UploadedFile::getInstance($model, 'avatar');
            $model->save();
        }
        return $this->render('profile', ['model' => $model,]);
    }

User model like:

class User extends ActiveRecord
{
    public static function tableName()
    {
        return '{{%user}}';
    }

    public function rules()
    {
        return [
            [['name', 'id'], 'safe'],
            [['avatar'], 'file', 'extensions' => 'png, jpg'],
        ];
    }

    public function behaviors()
    {
        return [
            [
                'class' => ImageBehavior::className(),
                'saveDirectory' => Yii::getAlias('@webroot/uploads/avatars/'),
                'imageAttr' => 'avatar',
                'images' => [
                  '_default' => ['default' => []], //save default upload image
                  '_small' => ['resize' => [150,200]], //and save resized copy
                ],
                'options' => [
                    'ifNullBehavior' => ImageBehavior::DO_NOTHING_IF_NULL, 
                    //when avatar attribute contains null, don't need to deleted images and rewrite avatar field
                ]
            ],
        ];
    }


   //getter of resized image
    public function getSmallAvatar(){
        return = $this->getImage('_small');
    }

}

In view

$form = ActiveForm::begin();

echo $form->field($model, 'name')->textInput();

echo Html::img($model->smallAvatar);
echo $form->field($model, 'avatar')->fileInput()->label('change avatar');

echo Html::submitButton('Save', ['class' => 'btn btn-primary']);
ActiveForm::end();