Installation
The preferred way to install this extension is through composer., (*1)
Either run, (*2)
composer require dkhlystov/yii2-uploadimage
or add, (*3)
"dkhlystov/yii2-uploadimage": "*"
to the require section of your composer.json file., (*4)
Usage
For using widget at first you need to add dkhlystov\uploadimage\Module to your application config:, (*5)
    'modules' => [
        //...
        'uploadimage' => 'dkhlystov\uploadimage\Module',
    ],
Single image
Upload single image to model attribute:, (*6)
<?= \dkhlystov\uploadimage\widgets\UploadImage::widget([
        'model' => $model,
        'attribute' => 'image',
]); ?>
With ActiveForm:, (*7)
<?= $form->field($model, 'image')->widget(\dkhlystov\uploadimage\widgets\UploadImage::className()) ?>
If thumbnail needed:, (*8)
<?= \dkhlystov\uploadimage\widgets\UploadImage::widget([
        'model' => $model,
        'attribute' => 'image',
        'thumbAttribute' => 'thumb',
]); ?>
Multiple images
Upload multiple images as array to model attribute. Property fileKey is required:, (*9)
<?= \dkhlystov\uploadimage\widgets\UploadImages::widget([
        'model' => $model,
        'attribute' => 'images',
        'fileKey' => 'file',
]); ?>
If you need to create thumbnail use thumbKey property. To limit image count use maxCount property., (*10)
Default size of every item in widget is 112×84. If you want to render widget with other size use width and height properties., (*11)
<?= $form->field($model, 'image')->widget(\dkhlystov\uploadimage\widgets\UploadImage::className(), [
    'width' => 100,
    'height' => 100,
]) ?>
Maximum image size
All images will be optimized while uploading. By default maximun width of uploaded image is 1000 and heigh is 750. To change this values use maxImageWidth and maxImageHeight properties., (*12)
<?= $form->field($model, 'image')->widget(\dkhlystov\uploadimage\widgets\UploadImage::className(), [
    'maxImageWidth' => 640,
    'maxImageHeight' => 480,
]) ?>
Thumbnail size
When thumbnails uses, its size is similar to widget item size. To change it, use thumbWidth and thumbHeight properties., (*13)
<?= $form->field($model, 'image')->widget(\dkhlystov\uploadimage\widgets\UploadImage::className(), [
    'thumbAttribute' => 'thumb',
    'thumbWidth' => 200,
    'thumbHeight' => 150,
]) ?>
Use data property to add extra data to every image item in widget. You can use simple array or Closure for this property:, (*14)
<?= \dkhlystov\uploadimage\widgets\UploadImages::widget([
    'model' => $model,
    'attribute' => 'images',
    'fileKey' => 'file',
    'data' => function($item) {
        return [
            'id' => $item['id'],
            'description' => $item['description'],
        ];
    },
]) ?>
For working with buttons there are two steps: at first you should to declare buttons on server-side, and then you need to handle events from buttons on client-side., (*15)
server-side
To add custom buttons use buttons property. This is array where key is button identifier and value is buttons configuration., (*16)
<?= \dkhlystov\uploadimage\widgets\UploadImages::widget([
    'model' => $model,
    'attribute' => 'images',
    'id' => 'images',
    'fileKey' => 'file',
    'data' => function($item) {
        return ['main' => $item['main']];
    },
    'buttons' => [
        'main' => [
            'label' => '<i class="fa fa-star"></i>',
            'title' => 'Main image',
            'active' => function($item) {
                return $item['main'];
            },
        ],
    ],
]) ?>
Button configuration:, (*17)
- 
label string that will be rendered as button label, required 
- 
title string that added to title attribute of button 
- 
active if set to true, button will be rendered in active state 
If property sets as Closure, $item parameter is item for which the buttons are rendered. For new uploaded images $item is null., (*18)
Note that you can use Font Awesome icons, because its in reqirements and will be installed automatically., (*19)
client-side
In your javascript attach handler for ui-btnclick event to widget. In handler there are id, item and other parameters, that represents API for working with widget items., (*20)
- 
id button identifier. 
- 
ui.item current item management object. 
- 
ui.other data management object for all items, except current. 
Data management:, (*21)
- 
item.button(id) return jQuery object of button with specified id
 
- 
item.data(name) return value of item data with specified name. 
- 
item.data(name, value) set item data value with specified name. 
- 
item.data({name1: value1, ...}) set multiple data values. 
$(document).on('ui-btnclick', '#images', function(e, id, item, other) {
    if (id == 'main') {
        item.button('main').addClass('active');
        item.data('main', 1);
        other.button('main').removeClass('active');
        other.data('main', 0);
    }
});
Other properties
By default, all images will be uploaded to /upload directory in your web root. If you want to change it, use uploadPath property. To set this path globally use uploadPath property in application module., (*22)
To restrict the size of files uploaded by user, use maxFileSize property. Set in megabytes. To set its globally use maxFileSize property in application module., (*23)
You can change image quality (for JPEG only) by setting quality property. Default quality is 80., (*24)
You can specify custom error messages with proprties:, (*25)
- 
messageMaxFileSize shows when size of the uploading files exeeds maxFileSize. 
- 
messageMaxCount shows when user try to upload more files then in maxCount specified. 
- 
messageFormat shows when the format of uploaded files is not supported. 
- 
messageOther shows when other error occured. 
Every message may contain {files} substring, that will be replaced by actual files., (*26)