[ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * @inheritdoc */ public function beforeAction($action) { //disable CSRF Validation $this->enableCsrfValidation = false; return parent::beforeAction($action); } /** * Lists all ImageManager models. * @return mixed */ public function actionIndex() { //set asset ImageManagerModuleAsset::register($this->view); //get iframe parameters $viewMode = Yii::$app->request->get("view-mode", "page"); $selectType = Yii::$app->request->get("select-type", "input"); $inputFieldId = Yii::$app->request->get("input-id"); $cropAspectRatio = Yii::$app->request->get("aspect-ratio"); $cropViewMode = Yii::$app->request->get("crop-view-mode", 1); $defaultImageId = Yii::$app->request->get("image-id"); //set blank layout if viewMode = iframe if ($viewMode == "iframe") { //set layout $this->layout = "blank"; //set stylesheet for modal $aCssFiles = \Yii::$app->controller->module->cssFiles; if (is_array($aCssFiles) && count($aCssFiles) > 0) { //if exists loop through files and add them to iframe mode foreach ($aCssFiles AS $cssFile) { //registrate file $this->view->registerCssFile($cssFile, ['depends' => 'yii\bootstrap\BootstrapAsset']); } } } //set baseUrl from image manager $sBaseUrl = Url::to(['/imagemanager/manager']); //set base url $this->view->registerJs("imageManagerModule.baseUrl = '" . $sBaseUrl . "';", 3); $this->view->registerJs("imageManagerModule.defaultImageId = '" . $defaultImageId . "';", 3); $this->view->registerJs("imageManagerModule.fieldId = '" . $inputFieldId . "';", 3); $this->view->registerJs("imageManagerModule.cropRatio = '" . $cropAspectRatio . "';", 3); $this->view->registerJs("imageManagerModule.cropViewMode = '" . $cropViewMode . "';", 3); $this->view->registerJs("imageManagerModule.selectType = '" . $selectType . "';", 3); $this->view->registerJs("imageManagerModule.message = " . Json::encode([ 'deleteMessage' => Yii::t('imagemanager', 'Are you sure you want to delete this image?'), ]) . ";", 3); $searchModel = new ImageManagerSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); //render template return $this->render( 'index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, 'viewMode' => $viewMode, 'selectType' => $selectType, ]); } /** * Creates a new ImageManager model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionUpload() { //set response header Yii::$app->getResponse()->format = Response::FORMAT_JSON; // Check if the user is allowed to upload the image if (Yii::$app->controller->module->canUploadImage == false) { // Return the response array to prevent from the action being executed any further return []; } // Create the transaction and set the success variable $transaction = Yii::$app->db->beginTransaction(); $bSuccess = false; //disable Csrf Yii::$app->controller->enableCsrfValidation = false; //return default $return = $_FILES; //set media path $sMediaPath = \Yii::$app->imagemanager->mediaPath; //create the folder BaseFileHelper::createDirectory($sMediaPath); //check file isset if (isset($_FILES['imagemanagerFiles']['tmp_name'])) { //loop through each uploaded file foreach ($_FILES['imagemanagerFiles']['tmp_name'] AS $key => $sTempFile) { //collect variables $sFileName = $_FILES['imagemanagerFiles']['name'][$key]; $sFileExtension = pathinfo($sFileName, PATHINFO_EXTENSION); $iErrorCode = $_FILES['imagemanagerFiles']['error'][$key]; //if uploaded file has no error code than continue; if ($iErrorCode == 0) { //create a file record $model = new ImageManager(); $model->fileName = str_replace("_", "-", $sFileName); $model->fileHash = Yii::$app->getSecurity()->generateRandomString(32); //if file is saved add record if ($model->save()) { //move file to dir $sSaveFileName = $model->id . "_" . $model->fileHash . "." . $sFileExtension; //move_uploaded_file($sTempFile, $sMediaPath."/".$sFileName); //save with Imagine class Image::getImagine()->open($sTempFile)->save($sMediaPath . "/" . $sSaveFileName); $bSuccess = true; } } } } if ($bSuccess) { // The upload action went successful, save the transaction $transaction->commit(); } else { // There where problems during the upload, kill the transaction $transaction->rollBack(); } //echo return json encoded return $return; } /** * Crop image and create new ImageManager model. * @return mixed */ public function actionCrop() { //return $return = null; //disable Csrf Yii::$app->controller->enableCsrfValidation = false; //set response header Yii::$app->getResponse()->format = Response::FORMAT_JSON; //set media path $sMediaPath = \Yii::$app->imagemanager->mediaPath; //get post $ImageManager_id = Yii::$app->request->post("ImageManager_id"); $aCropData = Yii::$app->request->post("CropData"); //get details $modelOriginal = $this->findModel($ImageManager_id); //check if path is not null if ($modelOriginal->imagePathPrivate !== null && $aCropData !== null) { //dimension $iDimensionWidth = round($aCropData['width']); $iDimensionHeight = round($aCropData['height']); //collect variables $sFileNameReplace = preg_replace("/_crop_\d+x\d+/", "", $modelOriginal->fileName); $sFileName = pathinfo($sFileNameReplace, PATHINFO_FILENAME); $sFileExtension = pathinfo($sFileNameReplace, PATHINFO_EXTENSION); $sDisplayFileName = $sFileName . "_crop_" . $iDimensionWidth . "x" . $iDimensionHeight . "." . $sFileExtension; //start transaction $transaction = Yii::$app->db->beginTransaction(); $bCropSuccess = false; //create a file record $model = new ImageManager(); $model->fileName = $sDisplayFileName; $model->fileHash = Yii::$app->getSecurity()->generateRandomString(32); //if file is saved add record if ($model->save()) { //do crop in try catch try { // create file name $sSaveFileName = $model->id . "_" . $model->fileHash . "." . $sFileExtension; // get current/original image data $imageOriginal = Image::getImagine()->open($modelOriginal->imagePathPrivate); $imageOriginalSize = $imageOriginal->getSize(); $imageOriginalWidth = $imageOriginalSize->getWidth(); $imageOriginalHeight = $imageOriginalSize->getHeight(); $imageOriginalPositionX = 0; $imageOriginalPositionY = 0; // create/calculate a canvas size (if canvas is out of the box) $imageCanvasWidth = $imageOriginalWidth; $imageCanvasHeight = $imageOriginalHeight; // update canvas width if X position of croparea is lower than 0 if($aCropData['x'] < 0){ //set x postion to Absolute value $iAbsoluteXpos = abs($aCropData['x']); //set x position of image $imageOriginalPositionX = $iAbsoluteXpos; //add x position to canvas size $imageCanvasWidth += $iAbsoluteXpos; //update canvas width if croparea is biger than original image $iCropWidthWithoutAbsoluteXpos = ($aCropData['width'] - $iAbsoluteXpos); if($iCropWidthWithoutAbsoluteXpos > $imageOriginalWidth){ //add ouside the box width $imageCanvasWidth += ($iCropWidthWithoutAbsoluteXpos - $imageOriginalWidth); } } else { // add if crop partly ouside image $iCropWidthWithXpos = ($aCropData['width'] + $aCropData['x']); if($iCropWidthWithXpos > $imageOriginalWidth){ //add ouside the box width $imageCanvasWidth += ($iCropWidthWithXpos - $imageOriginalWidth); } } // update canvas height if Y position of croparea is lower than 0 if($aCropData['y'] < 0){ //set y postion to Absolute value $iAbsoluteYpos = abs($aCropData['y']); //set y position of image $imageOriginalPositionY = $iAbsoluteYpos; //add y position to canvas size $imageCanvasHeight += $iAbsoluteYpos; //update canvas height if croparea is biger than original image $iCropHeightWithoutAbsoluteYpos = ($aCropData['height'] - $iAbsoluteYpos); if($iCropHeightWithoutAbsoluteYpos > $imageOriginalHeight){ //add ouside the box height $imageCanvasHeight += ($iCropHeightWithoutAbsoluteYpos - $imageOriginalHeight); } } else { // add if crop partly ouside image $iCropHeightWithYpos = ($aCropData['height'] + $aCropData['y']); if($iCropHeightWithYpos > $imageOriginalHeight){ //add ouside the box height $imageCanvasHeight += ($iCropHeightWithYpos - $imageOriginalHeight); } } // round values $imageCanvasWidthRounded = round($imageCanvasWidth); $imageCanvasHeightRounded = round($imageCanvasHeight); $imageOriginalPositionXRounded = round($imageOriginalPositionX); $imageOriginalPositionYRounded = round($imageOriginalPositionY); $imageCropWidthRounded = round($aCropData['width']); $imageCropHeightRounded = round($aCropData['height']); // set postion to 0 if x or y is less than 0 $imageCropPositionXRounded = $aCropData['x'] < 0 ? 0 : round($aCropData['x']); $imageCropPositionYRounded = $aCropData['y'] < 0 ? 0 : round($aCropData['y']); // echo "canvas: ". $imageCanvasWidth ." x ".$imageCanvasHeight ."
"; // echo "img pos x: ". $imageOriginalPositionX ." y ".$imageOriginalPositionY ."
"; // die(); // //todo: check if rotaded resize canvas (http://stackoverflow.com/questions/9971230/calculate-rotated-rectangle-size-from-known-bounding-box-coordinates) // merge current image in canvas, crop image and save $imagineRgb = new RGB(); $imagineColor = $imagineRgb->color('#FFF', 0); // create image Image::getImagine()->create(new Box($imageCanvasWidthRounded, $imageCanvasHeightRounded), $imagineColor) ->paste($imageOriginal, new Point($imageOriginalPositionXRounded, $imageOriginalPositionYRounded)) ->crop(new Point($imageCropPositionXRounded, $imageCropPositionYRounded), new Box($imageCropWidthRounded, $imageCropHeightRounded)) ->save($sMediaPath . "/" . $sSaveFileName); //set boolean crop success to true $bCropSuccess = true; //set return id $return = $model->id; // Check if the original image must be delete if ($this->module->deleteOriginalAfterEdit) { $modelOriginal->delete(); } } catch (ErrorException $e) { } } //commit transaction if boolean is true if($bCropSuccess){ $transaction->commit(); } } //echo return json encoded return $return; } public function actionSaveImageInfo() { \Yii::$app->response->format = Response::FORMAT_JSON; if (\Yii::$app->request->isPost) { $id = Yii::$app->request->post("image_id"); $model = $this->findModel($id); $languages = ImageManagerLang::find() ->where([ 'image_id' => $model->id ]) ->indexBy('language_id') ->all(); foreach (Language::getActive() as $lang_id => $language) { if (empty($languages[ $lang_id ])) { $lang = new ImageManagerLang(); } else { $lang = $languages[ $lang_id ]; } /** * @var ImageManagerLang $lang */ $lang->alt = \Yii::$app->request->post('image_info')[ $lang_id ][ 'alt' ]; $lang->title = \Yii::$app->request->post('image_info')[ $lang_id ][ 'title' ]; $lang->description = \Yii::$app->request->post('image_info')[ $lang_id ][ 'description' ]; $lang->image_id = $model->id; $lang->language_id = $lang_id; $lang->save(); } } return 'oki'; } /** * Get view details * @return mixed */ public function actionView() { //disable Csrf Yii::$app->controller->enableCsrfValidation = false; //return default $return = []; //set response header Yii::$app->getResponse()->format = Response::FORMAT_JSON; //get post $ImageManager_id = Yii::$app->request->post("ImageManager_id"); //get details $model = $this->findModel($ImageManager_id); //set return details $return['id'] = $model->id; $return['fileName'] = $model->fileName; $return['created'] = Yii::$app->formatter->asDate($model->created); $return['fileSize'] = $model->imageDetails['size']; $return['dimensionWidth'] = $model->imageDetails['width']; $return['dimensionHeight'] = $model->imageDetails['height']; $return['image'] = \Yii::$app->imagemanager->getImagePath($model->id, 400, 400, "inset") . "?t=" . time(); $languages = ImageManagerLang::find() ->where([ 'image_id' => $model->id ]) ->indexBy('language_id') ->all(); $div = $this->renderPartial( '_image_info', [ 'languages' => $languages, 'model' => $model, ] ); $return[ 'div' ] = $div; //return json encoded return $return; } /** * Get full image * @return mixed */ public function actionGetOriginalImage() { //disable Csrf Yii::$app->controller->enableCsrfValidation = false; //set response header Yii::$app->getResponse()->format = Response::FORMAT_JSON; //get post $ImageManager_id = Yii::$app->request->post("ImageManager_id"); //get details $model = $this->findModel($ImageManager_id); //set return $return = \Yii::$app->imagemanager->getImagePath($model->id, $model->imageDetails['width'], $model->imageDetails['height'], "inset"); //return json encoded return $return; } /** * Deletes an existing ImageManager model. * If deletion is successful, the browser will be redirected to the 'index' page. * @return mixed */ public function actionDelete() { //return $return = ['delete' => false]; //set response header Yii::$app->getResponse()->format = Response::FORMAT_JSON; if (Yii::$app->controller->module->canRemoveImage == false) { // User can not remove this image, return false status return $return; } //get post $ImageManager_id = Yii::$app->request->post("ImageManager_id"); //get details $model = $this->findModel($ImageManager_id); //delete record if ($model->delete()) { $return['delete'] = true; } return $return; } /** * Finds the ImageManager model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return ImageManager the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = ImageManager::findOne($id)) !== null) { /* @var $model ImageManager */ // Get the module instance $module = Module::getInstance(); // Check if the model belongs to this user if ($module->setBlameableBehavior) { // Check if the user and record ID match if (Yii::$app->user->id != $model->createdBy) { throw new NotFoundHttpException(Yii::t('imagemanager', 'The requested image does not exist.')); } } return $model; } else { throw new NotFoundHttpException(Yii::t('imagemanager', 'The requested image does not exist.')); } } }