This behavior will help you to:
composer require godzie44/yii2-image-behavior
$ codecept run
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
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:
saveDirectory (required, string) The directory where the images are saved.
options (optional, array) where:
You can use this modifiers in any number and combinations.
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();
Comments