Source of file api.photostorage.php
Size: 36,593 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.photostorage.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965 | <?php /** * PhotoStorage allows to attach images for any kind of items on some scope */ class PhotoStorage { /** * Contains system photostorage.ini config as key=>value * * @var array */ protected $photoCfg = array(); /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains array of available images in database as id=>imagedata * * @var array */ protected $allimages = array(); /** * Contains loaded images count for each item in some scope as scope=>itemid=>count * * @var array */ protected $imagesCount = array(); /** * Contains loaded images paths for each item in some scope as scope=>itemid=>imagesList * * @var array */ protected $imagesList = array(); /** * Contains current photostorage items scope * * @var string */ protected $scope = ''; /** * Contains current instance item ID in the current scope * * @var string */ protected $itemId = ''; /** * Contains current administrator login * * @var string */ protected $myLogin = ''; /** * Flag for preventing multiple database requests * * @var bool */ protected $imagesLoadedFlag = false; /** * Use photostorage as image proxy flag * * @var bool */ protected $proxyMode = false; /** * Contains images storage path. May be specified in PHOTOSTORAGE_DIRECTORY option. * * @var string */ protected $storagePath = 'content/documents/photostorage/'; /** * Custom, optional images display prefix URL. Configurable via PHOTOSTORAGE_URL_PREFIX option. * * @var string */ protected $storageUrlPrefix = ''; /** * Some predefined paths and URLs */ const UPLOAD_URL_WEBC = '?module=photostorage&uploadcamphoto=true'; const UPLOAD_URL_FILE = '?module=photostorage&uploadfilephoto=true'; const MODULE_URL = '?module=photostorage'; const ROUTE_PROXY = 'getimg'; const EX_NOSCOPE = 'NO_OBJECT_SCOPE_SET'; const EX_WRONG_EXT = 'WRONG_FILE_EXTENSION'; const WATRERMARK_PATH = 'content/documents/watermark.png'; /** * Initializes photostorage engine for some scope/item id * * @param string $scope * @param string $itemid * * @return void */ public function __construct($scope = '', $itemid = '') { $this->loadConfig(); $this->loadAlter(); $this->setOptions(); $this->setScope($scope); $this->setItemid($itemid); $this->setLogin(); } /** * Object scope setter * * @param string $scope Object actual scope * * @return void */ protected function setScope($scope) { $this->scope = ubRouting::filters($scope, 'mres'); } /** * Object scope item Id setter * * @param string $scope Object actual id in current scope * * @return void */ protected function setItemid($itemid) { $this->itemId = ubRouting::filters($itemid, 'mres'); } /** * Loads system photostorage config into private prop * * @return void */ protected function loadConfig() { global $ubillingConfig; $this->photoCfg = $ubillingConfig->getPhoto(); } /** * Sets some current instance specific options. * * @return void */ protected function setOptions() { if (@$this->altCfg['PHOTOSTORAGE_DIRECTORY']) { $this->storagePath = $this->altCfg['PHOTOSTORAGE_DIRECTORY']; } if (@$this->altCfg['PHOTOSTORAGE_URL_PREFIX']) { $this->storageUrlPrefix = $this->altCfg['PHOTOSTORAGE_URL_PREFIX']; } if (@$this->altCfg['PHOTOSTORAGE_PROXY_MODE']) { $this->proxyMode = true; } } /** * Loads system alter config into private prop * * @return void */ protected function loadAlter() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Administrator login setter * * @return void */ protected function setLogin() { $this->myLogin = whoami(); } /** * Loads images list from database into private prop * * @return void */ protected function loadAllImages() { if ((!empty($this->scope)) and (!empty($this->itemId))) { $query = "SELECT * from `photostorage` ORDER by `id` ASC;"; $all = simple_queryall($query); $this->imagesLoadedFlag = true; if (!empty($all)) { foreach ($all as $io => $each) { $this->allimages[$each['id']] = $each; $this->imagesList[$each['scope']][$each['item']][] = $each['filename']; if (isset($this->imagesCount[$each['scope']][$each['item']])) { $this->imagesCount[$each['scope']][$each['item']]++; } else { $this->imagesCount[$each['scope']][$each['item']] = 1; } } } } } /** * Registers uploaded image in database * * @param string $filename */ protected function registerImage($filename) { if ((!empty($this->scope)) and (!empty($this->itemId))) { $filename = mysql_real_escape_string($filename); $date = curdatetime(); $query = "INSERT INTO `photostorage` (`id`, `scope`, `item`, `date`, `admin`, `filename`) " . "VALUES (NULL, '" . $this->scope . "', '" . $this->itemId . "', '" . $date . "', '" . $this->myLogin . "', '" . $filename . "'); "; nr_query($query); log_register('PHOTOSTORAGE CREATE SCOPE `' . $this->scope . '` ITEM [' . $this->itemId . ']'); } } /** * Deletes uploaded image from database * * @param int $imageid */ protected function unregisterImage($imageid) { if ((!empty($this->scope)) and (!empty($this->itemId))) { $imageid = vf($imageid, 3); $date = curdatetime(); $query = "DELETE from `photostorage` WHERE `id`='" . $imageid . "';"; nr_query($query); log_register('PHOTOSTORAGE DELETE SCOPE `' . $this->scope . '` ITEM [' . $this->itemId . ']'); } } /** * Returns basic image controls * * @param int $imageId existing image ID * @return string */ protected function imageControls($imageId) { $result = wf_tag('br'); $downloadUrl = self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&download=' . $imageId; $result .= wf_Link($downloadUrl, wf_img('skins/icon_download.png') . ' ' . __('Download'), false, 'ubButton') . ' '; if (cfr('PHOTOSTORAGEDELETE')) { $deleteUrl = self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&delete=' . $imageId; $result .= wf_AjaxLink($deleteUrl, web_delete_icon() . ' ' . __('Delete'), 'ajRefCont_' . $imageId, false, 'ubButton') . ' '; } return ($result); } /** * Returns image upload controls * * @return string */ public function uploadControlsPanel() { $result = ''; if ((!empty($this->scope)) and (!empty($this->itemId))) { $result .= wf_Link(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=cam', wf_img('skins/photostorage.png') . ' ' . __('Webcamera snapshot'), false, 'ubButton'); $result .= wf_Link(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=loader', wf_img('skins/photostorage_upload.png') . ' ' . __('Upload file from HDD'), false, 'ubButton'); } return ($result); } /** * Returns custom module backlinks for some scopes * * @return string */ protected function backUrlHelper() { $result = ''; if ($this->scope == 'USERPROFILE') { $result = web_UserControls($this->itemId); } if ($this->scope == 'CUSTMAPSITEMS') { $result = wf_BackLink('?module=custmaps&edititem=' . $this->itemId); } if ($this->scope == 'WAREHOUSEITEMTYPE') { $result = wf_BackLink('?module=warehouse&itemtypes=true'); } if ($this->scope == 'TASKMAN') { $result = wf_BackLink('?module=taskman&edittask=' . $this->itemId); } if ($this->scope == 'UKVUSERPROFILE') { $result = wf_BackLink('?module=ukv&users=true&showuser=' . $this->itemId); } if ($this->scope == 'CFITEMS') { $cleanUserLogin = explode(CustomFields::PHOTOSTORAGE_ITEMID_DELIMITER, $this->itemId); $cleanUserLogin = $cleanUserLogin[0]; $result = wf_BackLink(CustomFields::URL_EDIT_BACK . $cleanUserLogin); } if ($this->scope == 'CRMACTIVITY') { $result = wf_BackLink(PseudoCRM::URL_ME . '&' . PseudoCRM::ROUTE_ACTIVITY_PROFILE . '=' . $this->itemId); } return ($result); } /** * Returns count of loaded images for some itemid in some scope * * @param string $itemId * * @return int */ public function getImagesCount($itemId) { $result = 0; $this->itemId = $itemId; if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (isset($this->imagesCount[$this->scope][$itemId])) { $result = $this->imagesCount[$this->scope][$itemId]; } return ($result); } /** * Returns array of links of images for some itemId in current scope if it exists * * @param string $itemId * * @return array */ public function getImagesList($itemId) { $result = array(); $this->itemId = $itemId; if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (isset($this->imagesList[$this->scope])) { if (isset($this->imagesList[$this->scope][$itemId])) { $imageFiles = $this->imagesList[$this->scope][$itemId]; if (!empty($imageFiles)) { foreach ($imageFiles as $io => $eachFilename) { $result[] = $this->getImageUrl($eachFilename); } } } } return ($result); } /** * Retuns all available scopes and images count in it as scope=>count * * @return array */ public function getAvailScopes() { $result = array(); if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (!empty($this->allimages)) { foreach ($this->allimages as $io => $each) { if (isset($result[$each['scope']])) { $result[$each['scope']]++; } else { $result[$each['scope']] = 1; } } } return ($result); } /** * Returns image HTTP accessable URL * * @param string $filename * * @return string */ protected function getImageUrl($filename) { $result = ''; //Raw HTTP images access if (!$this->proxyMode) { if (empty($this->storageUrlPrefix)) { //seems its local storage $result = $this->storagePath . $filename; } else { //separate images CDN $result = $this->storageUrlPrefix . $filename; } } else { //Access to images in storage via proxy-engine $result = self::MODULE_URL . '&' . self::ROUTE_PROXY . '=' . $filename; } return ($result); } /** * Returns list of all available images for all scopes * * @param int $perPage * @param bool $checkRights * * @return string */ public function renderScopesGallery($perPage = 12, $checkRights = true) { $result = ''; $paginator = ''; $scopeImages = array(); $messages = new UbillingMessageHelper(); if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (!empty($this->allimages)) { $imgTmp = array_reverse($this->allimages); if ($checkRights) { $myImages = array(); if (!cfr('ROOT')) { if (!empty($imgTmp)) { foreach ($imgTmp as $io => $each) { if ($each['admin'] == $this->myLogin) { $myImages[$io] = $each; } } $imgTmp = $myImages; } } } $renderImages = array(); $totalCount = sizeof($imgTmp); $currentPage = (ubRouting::get('page')) ? ubRouting::get('page') : 1; //pagination if ($totalCount > $perPage) { $paginator = wf_pagination($totalCount, $perPage, $currentPage, self::MODULE_URL, 'ubButton', 14); $lowLimit = ($perPage * ($currentPage - 1)); $upperLimit = $lowLimit + $perPage; $i = 0; foreach ($imgTmp as $io => $each) { if ($i >= $lowLimit and $i < $upperLimit) { $renderImages[$io] = $each; } $i++; } } else { $renderImages = $imgTmp; } $galleryRel = 'photostoragegallery'; $previewStyle = 'style="float:left; margin:1px;"'; $result .= wf_tag('link', false, '', 'rel="stylesheet" href="modules/jsc/image-gallery-lightjs/src/jquery.light.css"'); $result .= wf_tag('script', false, '', 'src="modules/jsc/image-gallery-lightjs/src/jquery.light.js"') . wf_tag('script', true); if (!empty($renderImages)) { foreach ($renderImages as $io => $eachimage) { $imgPreview = wf_img_sized($this->getImageUrl($eachimage['filename']), __('Preview'), $this->photoCfg['IMGLIST_PREV_W'], $this->photoCfg['IMGLIST_PREV_H']); $imgFull = wf_img_sized($this->getImageUrl($eachimage['filename']), '', '100%'); $imgCaption = __('Date') . ': ' . $eachimage['date'] . ' ' . __('Admin') . ': ' . $eachimage['admin']; $mngUrl = self::MODULE_URL . '&scope=' . $eachimage['scope'] . '&mode=list&itemid=' . $eachimage['item']; $mngLink = ' ' . wf_Link($mngUrl, __('Show'), false, '', 'target=_blank'); $mngLink = str_replace('"', '', $mngLink); $imgCaption .= $mngLink; $galleryOptions = 'data-caption="' . $imgCaption . '" data-gallery="1" rel="' . $galleryRel . '" ' . $previewStyle . '"'; $imgGallery = wf_Link($this->getImageUrl($eachimage['filename']), $imgPreview, false, '', $galleryOptions); $result .= $imgGallery; } } else { $result .= $messages->getStyledMessage(__('Nothing to show'), 'info'); } //init gallery $jsGallery = wf_tag('script'); $jsGallery .= " $('a[rel=" . $galleryRel . "]').light({ unbind:true, prevText:'" . __('Previous') . "', nextText:'" . __('Next') . "', loadText:'" . __('Loading') . "...', keyboard:true }); "; $jsGallery .= wf_tag('script', true); $result .= $jsGallery; $result .= wf_CleanDiv(); $result .= $paginator; } else { $result .= $messages->getStyledMessage(__('Nothing to show'), 'warning'); } return ($result); } /** * Returns current scope/item images list * * @return string */ public function renderImagesList() { if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } $result = wf_AjaxLoader(); if (!empty($this->allimages)) { foreach ($this->allimages as $io => $eachimage) { if (($eachimage['scope'] == $this->scope) and ($eachimage['item'] == $this->itemId)) { $imgPreview = wf_img_sized($this->getImageUrl($eachimage['filename']), __('Show'), $this->photoCfg['IMGLIST_PREV_W'], $this->photoCfg['IMGLIST_PREV_H']); $imgFull = wf_img_sized($this->getImageUrl($eachimage['filename']), '', '100%'); $imgFull .= wf_tag('br'); $imgFull .= __('Date') . ': ' . $eachimage['date'] . ' / '; $imgFull .= __('Admin') . ': ' . $eachimage['admin'] . ' '; $dimensions = 'width:' . ($this->photoCfg['IMGLIST_PREV_W'] + 10) . 'px;'; $dimensions .= 'height:' . ($this->photoCfg['IMGLIST_PREV_H'] + 10) . 'px;'; $result .= wf_tag('div', false, '', 'style="float:left; ' . $dimensions . ' padding:15px;" id="ajRefCont_' . $eachimage['id'] . '"'); $result .= wf_modalAuto($imgPreview, __('Image') . ' ' . $eachimage['id'], $imgFull, ''); $result .= $this->imageControls($eachimage['id']); $result .= wf_tag('div', true); } } } $result .= wf_tag('div', false, '', 'style="clear:both;"') . wf_tag('div', true); $result .= wf_delimiter(); $result .= $this->backUrlHelper(); return ($result); } /** * Returns list of available images for current scope/item * * @return string */ public function renderImagesRaw() { $result = ''; $galleryFlag = ($this->altCfg['PHOTOSTORAGE_GALLERY']) ? true : false; if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (!empty($this->allimages)) { $galleryRel = 'photostoragegallery'; $previewStyle = 'style="float:left; margin:1px;"'; $result .= wf_tag('link', false, '', 'rel="stylesheet" href="modules/jsc/image-gallery-lightjs/src/jquery.light.css"'); $result .= wf_tag('script', false, '', 'src="modules/jsc/image-gallery-lightjs/src/jquery.light.js"') . wf_tag('script', true); foreach ($this->allimages as $io => $eachimage) { if (($eachimage['scope'] == $this->scope) and ($eachimage['item'] == $this->itemId)) { $imgPreview = wf_img_sized($this->getImageUrl($eachimage['filename']), __('Show'), $this->photoCfg['IMGLIST_PREV_W'], $this->photoCfg['IMGLIST_PREV_H']); $imgFull = wf_img_sized($this->getImageUrl($eachimage['filename']), '', '100%'); $imgCaption = __('Date') . ': ' . $eachimage['date'] . ' ' . __('Admin') . ': ' . $eachimage['admin']; if ($galleryFlag) { $galleryOptions = 'data-caption="' . $imgCaption . '" data-gallery="1" rel="' . $galleryRel . '" ' . $previewStyle . '"'; $imgGallery = wf_Link($this->getImageUrl($eachimage['filename']), $imgPreview, false, '', $galleryOptions); $result .= $imgGallery; } else { $result .= wf_modalAuto($imgPreview, __('Image') . ' ' . $eachimage['id'], $imgFull . $imgCaption, ''); } } } //init gallery $jsGallery = wf_tag('script'); $jsGallery .= " $('a[rel=" . $galleryRel . "]').light({ unbind:true, prevText:'" . __('Previous') . "', nextText:'" . __('Next') . "', loadText:'" . __('Loading') . "...', keyboard:true }); "; $jsGallery .= wf_tag('script', true); $result .= $jsGallery; } $result .= wf_CleanDiv(); return ($result); } /** * Downloads image file by its id * * @param int $id database image ID */ public function catchDownloadImage($id) { $id = vf($id, 3); if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (!empty($id)) { @$filename = $this->allimages[$id]['filename']; if (file_exists($this->storagePath . $filename)) { zb_DownloadFile($this->storagePath . $filename, 'jpg'); } else { show_error(__('File not exist')); } } else { show_error(__('Image not exists')); } } /** * Returns some image content as is if proxy mode enabled \ * and image file exists in storage path * * @param string $filename */ public function proxyImage($filename) { if ($this->proxyMode) { if (file_exists($this->storagePath . $filename)) { $imageContent = file_get_contents($this->storagePath . $filename); die($imageContent); } else { $noImage = file_get_contents('skins/noimage.jpg'); die($noImage); } } else { $noImage = file_get_contents('skins/noimage.jpg'); die($noImage); } } /** * deletes image from database and FS by its ID * * @param int $id database image ID */ public function catchDeleteImage($id) { $id = vf($id, 3); if (!$this->imagesLoadedFlag) { $this->loadAllImages(); } if (!empty($id)) { @$filename = $this->allimages[$id]['filename']; if (file_exists($this->storagePath . $filename)) { if (cfr('PHOTOSTORAGEDELETE')) { unlink($this->storagePath . $filename); $this->unregisterImage($id); $deleteResult = wf_tag('span', false, 'alert_warning') . __('Deleted') . wf_tag('span', true); } else { $deleteResult = wf_tag('span', false, 'alert_error') . __('Access denied') . wf_tag('span', true); } } else { $deleteResult = wf_tag('span', false, 'alert_error') . __('File not exist') . wf_tag('span', true); } } else { $deleteResult = wf_tag('span', false, 'alert_error') . __('Image not exists') . wf_tag('span', true); } die($deleteResult); } /** * Catches webcam snapshot upload in background * * @return void */ public function catchWebcamUpload() { if (wf_CheckGet(array('uploadcamphoto'))) { if (!empty($this->scope)) { $newWebcamFilename = date("Y_m_d_His") . '_' . zb_rand_string(8) . '_webcam.jpg'; $newWebcamSavePath = $this->storagePath . $newWebcamFilename; //get image data $dataRaw = ubRouting::post('image'); //remove the prefix $uri = substr($dataRaw, strpos($dataRaw, ",")); //decode the image data and save it to file file_put_contents($newWebcamSavePath, base64_decode($uri)); if (file_exists($newWebcamSavePath)) { $uploadResult = wf_tag('span', false, 'alert_success') . __('Photo upload complete') . wf_tag('span', true); $this->registerImage($newWebcamFilename); } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Photo upload failed') . wf_tag('span', true); } } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Strange exeption') . ': ' . self::EX_NOSCOPE . wf_tag('span', true); } die($uploadResult); } } /** * Performs some image postprocessing on images uploads * * @param string $filePath * * @return void */ public function imagePostProcessing($filePath) { $result = ''; $pixelCraft = new PixelCraft(); $pixelCraft->loadImage($filePath); $imageWidth = $pixelCraft->getImageWidth(); $imageHeight = $pixelCraft->getImageHeight(); $originalType = $pixelCraft->getImageType(); $result .= wf_tag('span', false, 'alert_info') . __('Original image dimensions') . ' :' . $imageWidth . 'x' . $imageHeight . wf_tag('span', true); $fileSizeOrig = filesize($filePath); $result .= wf_tag('span', false, 'alert_info') . __('Uploaded file size') . ': ' . zb_convertSize($fileSizeOrig) . wf_tag('span', true); $imgInfo = ''; $imgInfo .= whoami() . ' Date: ' . date("Y-m-d H:i:s") . ' '; $imgInfo .= 'Orig: ' . $imageWidth . 'x' . $imageHeight . ' ' . $originalType . ', ' . zb_convertSize($fileSizeOrig) . ' '; //recompressing image if ($this->altCfg['PHOTOSTORAGE_RECOMPRESS']) { $quality = -1; if ($originalType == 'jpeg') { $quality = 70; $pixelCraft->setQuality($quality); } if ($originalType == 'png') { $quality = 9; $pixelCraft->setQuality($quality); } $result .= wf_tag('span', false, 'alert_info') . __('Image compression') . ': ' . $quality . wf_tag('span', true); $imgInfo .= 'Recompress: ' . $quality . ' '; } //appending watermark if ($this->altCfg['PHOTOSTORAGE_WATERMARK']) { $pixelCraft->loadWatermark(self::WATRERMARK_PATH); $pixelCraft->drawWatermark(false, $imageWidth - 120, 20); $result .= wf_tag('span', false, 'alert_info') . __('Watermark applied') . wf_tag('span', true); } //automatic downscale of huge images if ($this->altCfg['PHOTOSTORAGE_AUTORESIZE']) { $scale = 1; if ($imageWidth >= 4000 or $imageHeight >= 4000) { $scale = 0.5; $pixelCraft->scale($scale); $imageWidth = $pixelCraft->getImageWidth(); $imageHeight = $pixelCraft->getImageHeight(); } else { if ($imageWidth >= 2000 or $imageHeight >= 2000) { $scale = 0.8; $pixelCraft->scale($scale); $imageWidth = $pixelCraft->getImageWidth(); $imageHeight = $pixelCraft->getImageHeight(); } } if ($scale != 1) { $result .= wf_tag('span', false, 'alert_info') . __('New image dimensions') . ' :' . $imageWidth . 'x' . $imageHeight . wf_tag('span', true); $imgInfo .= 'Rescale x' . $scale . ': ' . $imageWidth . 'x' . $imageHeight . ' '; } $result .= wf_tag('span', false, 'alert_info') . __('Image scale') . ': ' . $scale . wf_tag('span', true); } if ($this->altCfg['PHOTOSTORAGE_DRAWIMGINFO']) { $infoX = 5; $infoY = $imageHeight - 10; $pixelCraft->drawString($infoX, $infoY, $imgInfo, 'yellow', 1, false); } //saving post-processed image $pixelCraft->saveImage($filePath, $originalType); //updating filesize clearstatcache(true, $filePath); $fileSizeProcessed = filesize($filePath); $result .= wf_tag('span', false, 'alert_info') . __('Saved file size') . ': ' . zb_convertSize($fileSizeProcessed) . wf_tag('span', true); return ($result); } /** * Catches file upload in background * * @param string $customBackLink * * @return void */ public function catchFileUpload($customBackLink = '') { if (wf_CheckGet(array('uploadfilephoto'))) { if (!empty($this->scope)) { $allowedExtensions = array("jpg", "gif", "png", "jpeg"); $fileAccepted = true; foreach ($_FILES as $file) { if ($file['tmp_name'] > '') { //TODO: in PHP 7.1 following string generates notice if (@!in_array(end(explode(".", strtolower($file['name']))), $allowedExtensions)) { $fileAccepted = false; } } } if ($fileAccepted) { //upload successful? if (file_exists(@$_FILES['photostorageFileUpload']['tmp_name'])) { //checking image validity $pixelCraft = new PixelCraft(); if ($pixelCraft->isImageValid($_FILES['photostorageFileUpload']['tmp_name'])) { $newFilename = date("Y_m_d_His") . '_' . zb_rand_string(8) . '_upload.jpg'; $newSavePath = $this->storagePath . $newFilename; @move_uploaded_file($_FILES['photostorageFileUpload']['tmp_name'], $newSavePath); if (file_exists($newSavePath)) { $uploadResult = wf_tag('span', false, 'alert_success') . __('Photo upload complete') . wf_tag('span', true); //image postprocessing if (@$this->altCfg['PHOTOSTORAGE_POSTPROCESSING']) { $uploadResult .= $this->imagePostProcessing($newSavePath); } $this->registerImage($newFilename); // forwarding $customBackLink back to renderUploadForm() routine if (empty($customBackLink)) { $customBackLink = ''; } else { $customBackLink = '&custombacklink=' . $customBackLink; } ubRouting::nav(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=loader&preview=' . $newFilename . $customBackLink); } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Photo upload failed') . wf_tag('span', true); } } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Photo upload failed') . ': ' . __('File') . ' ' . __('is corrupted') . wf_tag('span', true); } } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Photo upload failed') . ': ' . __('File not found') . wf_tag('span', true); } } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Photo upload failed') . ': ' . self::EX_WRONG_EXT . wf_tag('span', true); } } else { $uploadResult = wf_tag('span', false, 'alert_error') . __('Strange exeption') . ': ' . self::EX_NOSCOPE . wf_tag('span', true); } show_window('', $uploadResult); show_window('', wf_BackLink(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=loader')); } } /** * Returns file upload form * * @param bool $embedded * @param string $customBackLink * * @return string */ public function renderUploadForm($embedded = false, $customBackLink = '') { // forwarding $customBackLink to catchFileUpload() routine if (!empty($customBackLink)) { $customBackLink = '&custombacklink=' . $customBackLink; } $postUrl = self::UPLOAD_URL_FILE . '&scope=' . $this->scope . '&itemid=' . $this->itemId . $customBackLink; $inputs = wf_tag('form', false, 'glamour', 'action="' . $postUrl . '" enctype="multipart/form-data" method="POST"'); $inputs .= wf_tag('input', false, '', 'type="file" name="photostorageFileUpload"'); $inputs .= wf_Submit(__('Upload')); $inputs .= wf_tag('form', true); $result = $inputs; $result .= wf_delimiter(2); if (wf_CheckGet(array('preview'))) { $result .= wf_img_sized($this->getImageUrl(ubRouting::get('preview')), __('Preview'), $this->photoCfg['IMGLIST_PREV_W'], $this->photoCfg['IMGLIST_PREV_H']); $result .= wf_delimiter(); $result .= wf_tag('span', false, 'alert_success') . __('Photo upload complete') . wf_tag('span', true); $result .= wf_delimiter(); } if (!$embedded) { // checking for forwarded $customBackLink from catchFileUpload() routine if (ubRouting::checkGet('custombacklink')) { $result .= wf_BackLink(base64_decode(ubRouting::get('custombacklink'))); } else { $result .= wf_BackLink(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=list'); } } return ($result); } /** * Returns webcamera snapshot form * * @param bool $avatarMode use crop by WEBCAM_AVA_CROP property * * @return string */ public function renderWebcamForm($avatarMode = false) { $result = ''; $init = wf_tag('link', false, '', 'href="modules/jsc/webcamlib/style.css" rel="stylesheet"') . wf_tag('link', true); if ($avatarMode) { $prev_w = $this->photoCfg['WEBCAM_PREV_W']; $prev_h = $this->photoCfg['WEBCAM_PREV_H']; $dest_w = $this->photoCfg['WEBCAM_RESULT_W']; $dest_h = $this->photoCfg['WEBCAM_RESULT_H']; } else { $prev_w = $this->photoCfg['WEBCAM_PREV_W']; $prev_h = $this->photoCfg['WEBCAM_PREV_H']; $dest_w = $this->photoCfg['WEBCAM_RESULT_W']; $dest_h = $this->photoCfg['WEBCAM_RESULT_H']; } $uploadUrl = self::UPLOAD_URL_WEBC . '&scope=' . $this->scope . '&itemid=' . $this->itemId; $labelCapture = wf_img('skins/photostorage.png') . ' ' . __('Take snapshot'); $labelCaptureF = str_replace('"', '', $labelCapture); $labelReCapture = wf_img('skins/photostorage.png') . ' ' . __('Retake photo'); $labelReCaptureF = str_replace('"', '', $labelReCapture); $labelSave = wf_img('skins/save.png') . ' ' . __('Save'); $labelSaveF = str_replace('"', '', $labelSave); $container = wf_tag('div', false, 'content'); $container .= wf_tag('div', false, 'webcamholder'); $container .= wf_tag('video', false, '', 'autoplay id="webcamvideo"') . wf_tag('video', true); $container .= wf_tag('canvas', false, '', 'id="webcamcanvas"') . wf_tag('canvas', true); $container .= wf_tag('div', true); $container .= wf_tag('div', true); $container .= wf_tag('div', false, 'buttons'); $container .= wf_tag('button', false, 'ubButton', 'id="buttonCapture" disabled') . $labelCapture . wf_tag('button', true) . ' '; $container .= wf_tag('button', false, 'ubButton', 'id="buttonSave" disabled') . $labelSave . wf_tag('button', true); $container .= wf_tag('div', true); $container .= wf_tag('div', false, '', 'id="savedImages"'); $container .= wf_tag('div', true); $uploadJs = wf_tag('script', false, '', 'language="JavaScript"'); $jScript = file_get_contents('modules/jsc/webcamlib/script.js'); eval($jScript); $uploadJs .= wf_tag('script', true); $result .= $init; $result .= $container; $result .= $uploadJs; $result .= wf_delimiter(0); $result .= wf_BackLink(self::MODULE_URL . '&scope=' . $this->scope . '&itemid=' . $this->itemId . '&mode=list'); return ($result); } } |