yii2-crop-image-section
, (*1)
This widget is based on the Guillotine jQuery plugin plugin., (*2)
, (*3)
Installation
The preferred way to install this extension is through composer., (*4)
Either run, (*5)
php composer.phar require --prefer-dist mackrais/yii2-crop-image-section "dev-master"
or, (*6)
"mackrais/yii2-crop-image-section": "dev-master"
or add, (*7)
composer require mackrais/yii2-crop-image-section:"dev-master"
to the require section of your composer.json
file., (*8)
Usage
use mackrais\cropimage\ImageCropSection;
// usage by model
echo '<label>Cropping section</label>';
echo $form->field($model, "image")->widget(mackrais\cropimage\ImageCropSection::className(), [
'options' => [
'id' => 'mr_file_input1',
'class' => 'hidden',
],
'attribute_x'=>'section1_x',
'attribute_y'=>'section1_y',
'attribute_width'=>'section1_w',
'attribute_height'=>'section1_h',
'attribute_scale'=>'section1_scale',
'attribute_remove'=>'section1_remove',
'class_block'=>'center-block',
'plugin_options' => [
'width' => 400,
'height' => 400,
'id_input_file' => 'mr_file_input1',
'section' => 'section_1'
],
'template_image'=> null
])->label(false);
Example use
For example we have Unit category with image., (*9)
UnitCategory.php
[
'width' => 200,
'height' => 200,
'id_input_file' => 'mr_file_input1',
'section' => 'section_1'
]
];
const DEFAULT_IMG = '/default_img/unit-category.png';
/**
* @return array
*/
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'date_create',
'updatedAtAttribute' => 'date_update',
'value' => new Expression('NOW()'),
],
];
}
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%unit_categories}}';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name'], 'required'],
[['user_id', 'order_num', 'status'], 'integer'],
[['date_create', 'date_update'], 'safe'],
[['slug', 'class_icon', 'name', 'image'], 'string', 'max' => 255],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'slug' => Yii::t('app', 'Slug'),
'user_id' => Yii::t('app', 'User ID'),
'class_icon' => Yii::t('app', 'Class Icon'),
'image' => Yii::t('app', 'Image'),
'name' => Yii::t('app', 'Name'),
'order_num' => Yii::t('app', 'Order Num'),
'status' => Yii::t('app', 'Status'),
'date_create' => Yii::t('app', 'Date Create'),
'date_update' => Yii::t('app', 'Date Update'),
];
}
/**
* @param null $id
* @param bool $withDefault
* @return null|string
*/
public function getImageUrl($id = null, $withDefault = true)
{
$model = $id ? self::findOne($id) : $this;
if (!empty($model) && !empty($model->image)) {
$path = Yii::getAlias('@webroot/uploads/unit-category');
$file = $path . $model->image;
if (file_exists($file) && is_file($file)) {
return Url::to('uploads/unit-category/' . $model->image, true);
}
}
return $withDefault ? Url::to(self::DEFAULT_IMG, true) : null;
}
/**
* @param $id
* @param bool $withDefault
* @return null|string
*/
public static function imageUrl($id, $withDefault = true)
{
$model = self::findOne((int)$id);
if (!empty($model) && !empty($model->image)) {
$path = Yii::getAlias('@unitCategoryImgPath');
$file = $path . $model->image;
if (is_readable($file) && is_file($file)) {
return Url::to(Yii::getAlias('@unitCategoryImgUrl') . $model->image, true);
}
}
return $withDefault ? Url::to(self::DEFAULT_IMG, true) : null;
}
/**
* Save image
* @return bool|mixed
*/
public function saveImage()
{
$data = Yii::$app->request->post();
$fileInstance = UploadedFile::getInstance($this, 'image');
if (isset($data['section1_remove']) && !empty($data['section1_remove'])) {
$this->deleteImage();
}
$path = Yii::getAlias('@unitCategoryImgPath');
if (isset($fileInstance) && !empty($fileInstance))
if ($this->validate(['image'])) {
$this->deleteImage();
$this->image = uniqid('unit_category_') . '_' . date('Y_m_d-H_i_s', time()) . '.' . $fileInstance->extension;
$imagePath = $path . $this->image;
$save = $fileInstance->saveAs($imagePath);
if ($save) {
Image::cropImageSection($imagePath, $imagePath, [
'width' => $data['section1_w'],
'height' => $data['section1_h'],
'y' => $data['section1_y'],
'x' => $data['section1_x'],
'scale' => $data['section1_scale'],
]);
return $imagePath;
}
}
if (isset($this->oldAttributes['image'])) {
$this->image = $this->oldAttributes['image'];
}
return false;
}
/**
* Before save Deleting old image
* @param bool $insert
* @return bool
*/
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if (!$insert) {
if (isset($this->oldAttributes['image']) && empty($this->image)) {
$this->image = $this->oldAttributes['image'];
}
$this->deleteImageBeforeSave();
}
$this->saveImage();
return true;
} else {
return false;
}
}
/**
* After Deleting image
*/
public function afterDelete()
{
parent::afterDelete();
$this->deleteImage();
}
/**
* Delete old image before save
* @return bool
*/
private function deleteImageBeforeSave()
{
$path = Yii::getAlias('@unitCategoryImgPath');
if ($this->image !== $this->oldAttributes['image'] && !empty($this->oldAttributes['image'])) {
$file = $path . $this->oldAttributes['image'];
if (is_readable($file) && is_file($file)) {
return unlink($file);
}
}
return false;
}
/**
* Delete image
* @return bool
*/
private function deleteImage()
{
$path = Yii::getAlias('@unitCategoryImgPath');
$file = $path . $this->image;
if (!empty($this->image) && is_readable($file) && is_file($file)) {
return unlink($file);
}
return false;
}
}
```
## UnitCategory.php
Default controller generated by module [gii](http://www.yiiframework.com/doc-2.0/guide-start-gii.html)
```php
load(Yii::$app->request->post()) && $model->validate()) {
$model->save();
return $this->redirect(['index', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
// ...
}
```
## _form.php
Default controller generated by module gii
```php
isNewRecord ?
Yii::$app->controller->module->id.'/'.Yii::$app->controller->id.'/create'
: Yii::$app->controller->module->id.'/'.Yii::$app->controller->id.'/update?id='.$model->id;
?>
License
yii2-crop-image-section is released under the BSD 3-Clause License. See the bundled LICENSE.md
for details., (*10)