Open SlimSavernake opened 8 years ago
Сразу скажу, что это расширение предусматривает cropping только для уже загруженных файлов, оно не сможет обрезать файл до его загрузки.
Так же для обрезания я использую composer-пакет "yurkinx/yii2-image": "dev-master"
, без него не обойтись.
Если предположить, что в бд у $model есть поле image_name
, где и будет храниться путь к загруженному файлу относительно директории /images/example/
:
<?= $form->field($model, 'image_name')->fileInput(['accept' => 'image/*']) ?>
Original:
<?= Html::img(Yii::$app->request->baseUrl . '/images/example/' . $model->image_name) ?>
<br />
Cropped:
<?= Html::img(Yii::$app->request->baseUrl . '/images/example/cropped_' . $model->image_name, ['id' => 'myImage']) ?>
<br />
<?= Cropper::widget([
'modal' => true,
'cropUrl' => ['cropImage', 'id' => $model->id],
'image' => Yii::$app->request->baseUrl . '/images/example/' . $model->image_name,
'aspectRatio' => 4 / 3,
'pluginOptions' => [
'minCropBoxWidth' => 400, // minimal crop area width
'minCropBoxHeight' => 300, // minimal crop area height
],
// HTML-options for widget container
'options' => [],
// HTML-options for cropper image tag
'imageOptions' => [],
// Additional ajax-options for send crop-request. See jQuery $.ajax() options
'ajaxOptions' => [
'success' => new JsExpression(<<<JS
function(data) {
// data - your JSON response from [[cropUrl]]
$("#myImage").attr("src", data.croppedImageSrc);
}
JS
),
],
]); ?>
После нужно настроить экшен cropUrl, для этого в текущем контроллере добавляем функцию:
public function actionCropImage($id)
{
$request = Yii::$app->request;
$model = ModelClass::find()->where(['id' => $id])->one();
$imagePath = Yii::getAlias('@app/images/example/') . $model->image_name;
$cropImagePath = Yii::getAlias('@app/images/example/') . 'cropped_' . $model->image_name;
$x = $request->get('x');
$y = $request->get('y');
$width = $request->get('width');
$height = $request->get('height');
$rotate = $request->get('rotate');
$yiiImage = Yii::createObject([
'class' => 'yii\image\ImageDriver',
]);
/* @var $image \yii\image\drivers\Image_GD|\yii\image\drivers\Image_Imagick */
$image = $yiiImage->load($imagePath);
$image->crop($width, $height, $x, $y);
$image->rotate($rotate);
$image->save($cropImagePath);
$response = Yii::$app->response;
// if is AJAX request
if ($request->isAjax) {
$response->getHeaders()->set('Vary', 'Accept');
$response->format = Response::FORMAT_JSON;
return [
'status' => 'success',
'croppedImageSrc' => $request->baseUrl . '/images/example/cropped_' . $model->image_name,
];
} else {
return $this->redirect(['update' => $model->id]);
}
}
Подскажите как подключить это к обычному полю загрузки картинки? <?= $form->field($model, 'image_name')->fileInput(['accept' => 'image/*']) ?>