Croppic Π²ΠΈΠ΄ΠΆΠ΅Ρ Π΄Π»Ρ Yii2 Framework
Croppic - ΡΡΠΎ JQuery ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π·ΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ., (*1)
-
Github - https://github.com/sconsult/croppic
-
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ - http://www.croppic.net/
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· composer., (*2)
ΠΡΠΎΡΡΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:, (*3)
php composer.phar require --prefer-dist wise5lin/yii2-croppic "*"
ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅, (*4)
"wise5lin/yii2-croppic": "*"
Π² require
ΡΠ΅ΠΊΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ composer.json
ΡΠ°ΠΉΠ»Π°., (*5)
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΡΠΌ ΠΊΠΎΠ΄Π΅:, (*6)
use wise5lin\croppic\Croppic;
= Croppic::widget([
'options' => [
'class' => 'croppic',
],
'pluginOptions' => [
'uploadUrl' => $model->urlUpload,
'cropUrl' => $model->urlCrop,
'cropData' => [
// ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΡΡΠΈ Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
'path' => '@frontend/web/img/user/avatar/'.$model->id,
// ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ URL Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
'url' => '/img/user/avatar/'.$model->id,
],
'modal' => false,
'doubleZoomControls' => false,
'enableMousescroll' => true,
'loaderHtml' => '
',
]
]) ?>
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈ ΠΎΠ±ΡΠ΅Π·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'upload' => ['post'],
'crop' => ['post'],
],
],
];
}
public function actions()
{
return [
/**
* ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
'upload' => [
'class' => 'wise5lin\croppic\actions\UploadAction',
// ΠΠ±ΡΠΎΠ»ΡΡΠ½ΡΠΉ ΠΏΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ).
'tempPath' => '@frontend/web/img/temp',
// URL Π°Π΄ΡΠ΅Ρ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ).
'tempUrl' => 'img/temp/',
// ΠΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
'validatorOptions' => [
'checkExtensionByMimeType' => true,
'extensions' => 'jpeg, jpg, png',
'maxSize' => 3000000,
'tooBig' => 'ΠΡΠ±ΡΠ°Π½Π½ΠΎΠ΅ Π²Π°ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠ΅ (ΠΌΠ°ΠΊΡ. 3ΠΌΠ±)',
],
],
/**
* ΠΠ±ΡΠ΅Π·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
'crop' => [
'class' => 'wise5lin\croppic\actions\CropAction',
// ΠΠ±ΡΠΎΠ»ΡΡΠ½ΡΠΉ ΠΏΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
'path' => '@frontend/web/img/user/avatar',
// URL Π°Π΄ΡΠ΅Ρ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
'url' => 'img/user/avatar/',
],
];
}
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Π§ΡΠΎΠ±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ:, (*7)
public function beforeAction($action)
{
if ($action->id === 'upload' || $action->id === 'crop') {
if ($action->hasProperty('model')) {
$action->model = $this->findModel(Yii::$app->request->get('id'));
}
}
if (!parent::beforeAction($action)) {
return false;
}
return true;
}
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ RBAC
ΠΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ RBAC:, (*8)
public function actions()
{
return [
/**
* ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
'upload' => [
'class' => 'wise5lin\croppic\actions\UploadAction',
'tempPath' => '@frontend/web/img/temp',
'tempUrl' => 'img/temp/',
'validatorOptions' => [
'checkExtensionByMimeType' => true,
'extensions' => 'jpeg, jpg, png',
'maxSize' => 3000000,
'tooBig' => 'ΠΡΠ±ΡΠ°Π½Π½ΠΎΠ΅ Π²Π°ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠ΅ (ΠΌΠ°ΠΊΡ. 3ΠΌΠ±)',
],
// Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ RBAC
'permissionRBAC' => 'updateProfile',
// ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ RBAC
'parameterRBAC' => 'profile',
],
/**
* ΠΠ±ΡΠ΅Π·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
'crop' => [
'class' => 'wise5lin\croppic\actions\CropAction',
'path' => '@frontend/web/img/user/avatar',
'url' => 'img/user/avatar/',
// Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ RBAC
'permissionRBAC' => 'updateProfile',
// ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ RBAC
'parameterRBAC' => 'profile',
],
];
}
ΠΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°: Yii::$app->user->can('updateProfile', ['profile' => $this->model])
., (*9)
Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΡΡΠΈ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² Π±Π°Π·Ρ
public function actions()
{
return [
/**
* ΠΠ±ΡΠ΅Π·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
'crop' => [
'class' => 'wise5lin\croppic\actions\CropAction',
'path' => '@frontend/web/img/user/avatar',
'url' => 'img/user/avatar/',
'modelAttribute' => 'avatar', // <--- ΠΏΡΠΈΠΌΠ΅Ρ β1
'modelScenario' => 'saveAvatar', // <--- ΠΏΡΠΈΠΌΠ΅Ρ β2
'modelAttributeSavePath' => false, // <--- ΠΏΡΠΈΠΌΠ΅Ρ β3
],
];
}
ΠΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ crop:
- ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ (ΠΏΡΠΈΠΌΠ΅Ρ β1).
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Ρ
ΠΎΠ΄ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
(ΠΏΡΠΈΠΌΠ΅Ρ β2).
- ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π΄Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° modelAttributeSavePath
ΡΠΊΠ°ΠΆΠΈΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false (ΠΏΡΠΈΠΌΠ΅Ρ β3)., (*10)