PageRenderTime 55ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/assets/plugins/directresize/directResize.php

https://github.com/good-web-master/modx.evo.custom
PHP | 936 lines | 809 code | 70 blank | 57 comment | 80 complexity | dbc7dec8bbea4a394869b12632fab09a MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, GPL-2.0, MIT, BSD-3-Clause
  1. <?php
  2. class directResize {
  3. var $drconfig;
  4. //-------------------------------------------------------------------------------------------------
  5. function directResize($drconfig, $input)
  6. {
  7. $this->Labels = array("drlightbox", "drthumbonly", "drskip");
  8. // Массив для складирования уже обработанных имен файлов. Служит для переименования файлов с одинаковыми именами но из разных источников в одном документе
  9. $this->namesStack = array();
  10. $this->drconfig = $drconfig;
  11. $this->ProcessContent($input);
  12. }
  13. //-------------------------------------------------------------------------------------------------
  14. /*
  15. Функция создания локальных копий файлов с удаленных серверов.
  16. Проверяет, существует ли локальная копия данного файла, проверяет время последнего обновления файла и сравнивает с $drconfig['remote_refresh_time']
  17. В случае необходимости - копирует файл с удаленного сервера и создает локальную копию, которая используется в последствии для генерации тумб
  18. */
  19. function CheckRemoteImg($imgFile)
  20. {
  21. global $modx;
  22. $this->SetTargetFilename(true);
  23. if (file_exists($modx->config['base_path'].$this->targetFilename))
  24. {
  25. if (filemtime($modx->config['base_path'].$this->targetFilename)+$this->drconfig['remote_refresh_time']*60 <=time()) $update = TRUE;
  26. }
  27. else
  28. {
  29. $copy = TRUE;
  30. }
  31. /*
  32. Сравниваем размеры удаленного файла с локальной копией, если высота или ширина не совпадают - закачиваем файл заново
  33. Если совпадают, меняем время изменения файла на текущее
  34. */
  35. if ($update)
  36. {
  37. $localSize=getimagesize($modx->config['base_path'].$this->targetFilename);
  38. $remoteSize=getimagesize($imgFile);
  39. if ($localSize[0]!=$remoteSize[0] || $localSize[1]!=$remoteSize[1])
  40. {
  41. $copy = TRUE;
  42. }
  43. else
  44. {
  45. touch($modx->config['base_path'].$this->targetFilename);
  46. }
  47. }
  48. if ($copy)
  49. {
  50. //echo $imgFile;
  51. copy($imgFile, $this->getAbsPath($this->targetFilename));
  52. chmod($this->getAbsPath($this->targetFilename), 0777);
  53. $name = basename($this->targetFilename);
  54. $path = $modx->config['base_path'].$this->createDir();
  55. if (file_exists($path."big_".$name)) unlink($path."big_".$name);
  56. if (file_exists($path."thumb_".$name)) unlink($path."thumb_".$name);
  57. $name = str_replace("://", "---", $this->remotePath);
  58. $name = str_replace("/", "--", $name);
  59. if (file_exists($path."wysiwyg_".$name)) @unlink($path."wysiwyg_".$name);
  60. }
  61. $this->originalremotePath=$imgFile;
  62. $this->img_src = $this->targetFilename;
  63. }
  64. //-------------------------------------------------------------------------------------------------
  65. function PrepareImg($imgFile)
  66. {
  67. global $modx;
  68. $this->img_src = $imgFile;
  69. if (strstr($this->img_src, "://"))
  70. {
  71. $this->CheckRemoteImg($this->img_src);
  72. }
  73. $abs_imgFile = $modx->config['base_path'].$this->img_src;
  74. if (!file_exists($abs_imgFile)){
  75. return false;
  76. } else {
  77. $size = getimagesize($abs_imgFile);
  78. $this->img_src_w = $size[0];
  79. $this->img_src_h = $size[1];
  80. }
  81. $img_ext = strtolower(substr(strrchr($imgFile,'.'),1));
  82. include_once($modx->config['base_path'].DIRECTRESIZE_PATH.'includes/Thumbnail.class.php');
  83. $this->thumbclass = new DRThumbnail($abs_imgFile);
  84. if($img_ext == "jpg" || $img_ext == "jpeg"){
  85. $this->thumbclass->output_format='JPG';
  86. }else if($img_ext == "png"){
  87. $this->thumbclass->output_format='PNG';
  88. }
  89. return $this->img_src;
  90. }
  91. //-------------------------------------------------------------------------------------------------
  92. /*
  93. Функция для определения размеров генерируемого изображения, базирующаяся на параметрах ширины imgWidth и/или высоты imgHeight и метода изменения размера изображения resize_method
  94. resize_method принимает значение от 0 до 3, во всех случаях пропорции изображения сохраняются
  95. 0 - изображение сначала уменьшается, затем обрезается так, чтобы вписаться в прямоугольник imgWidth х imgHeight
  96. 1 - по заданной ширине автоматически вычисляется высота изображения
  97. 2 - по заданной высоте автоматически вычисляется ширина изображения
  98. 3 - изображение уменьшается таким образом чтобы не превышать заданные imgWidth и imgHeight
  99. */
  100. function CalcSizes()
  101. {
  102. global $modx;
  103. $this->imgWidth = (int) $this->imgWidth;
  104. $this->imgHeight = (int) $this->imgHeight;
  105. $resize_method = $this->drconfig['resize_method'];
  106. if ($this->imgWidth == 0) $resize_method = 2;
  107. if ($this->imgHeight == 0) $resize_method = 1;
  108. if ($this->mode == "big") $resize_method = 3;
  109. switch ($resize_method){
  110. case 0:
  111. $this->thumbclass->crop = true;
  112. $this->thumbclass->size($this->imgWidth, $this->imgHeight);
  113. break;
  114. case 1:
  115. $this->thumbclass->size_width($this->imgWidth);
  116. break;
  117. case 2:
  118. $this->thumbclass->size_height($this->imgHeight);
  119. break;
  120. case 3:
  121. $this->thumbclass->size($this->imgWidth, $this->imgHeight);
  122. break;
  123. }
  124. $this->imgWidth = (int)($this->thumbclass->img["x_thumb"]);
  125. $this->imgHeight = (int)($this->thumbclass->img["y_thumb"]);
  126. }
  127. //-------------------------------------------------------------------------------------------------
  128. function SetTargetFilename($isremote = false)
  129. {
  130. global $modx;
  131. if (isset($this->remotePath))
  132. {
  133. $this->img_src=$this->remotePath;
  134. unset($this->remotePath);
  135. }
  136. $img_src_ext = substr(strrchr($this->img_src,'.'),1);
  137. $img_src_name = basename($this->img_src, ".".$img_src_ext);
  138. $prefix = $modx->isBackend() ? "wysiwyg" : $this->mode;
  139. if (strlen($prefix)>0) $prefix.="_";
  140. if ($isremote)
  141. {
  142. $prefix="";
  143. $this->remotePath = $this->img_src;
  144. }
  145. $c = "";
  146. while (in_array($this->createDir().$prefix.$img_src_name.$c.".".$img_src_ext, $this->namesStack))
  147. {
  148. $c.="c";
  149. }
  150. $this->targetFilename = $this->createDir().$prefix.$img_src_name.$c.".".$img_src_ext;
  151. $this->namesStack[] = $this->targetFilename;
  152. if ($isremote) return;
  153. if ($modx->isBackend())
  154. {
  155. $dir = str_replace("://", "---", dirname($this->img_src));
  156. $dir = str_replace("/", "--", $dir);
  157. $this->targetFilename = $this->createDir().$prefix.$dir."--".$img_src_name.".".$img_src_ext;
  158. }
  159. //$this->targetFilename = $this->targetFilename;
  160. }
  161. //-------------------------------------------------------------------------------------------------
  162. /*
  163. Проверяем:
  164. //- существует ли целевая папка img_target_dir
  165. - заданы ли высота или ширина генерируемого изображения
  166. - не равны ли заданные высота и щирина генерируемого изображения реальным высоте и ширине исходного изображения (нужно ли вообще генерировать изображение)
  167. */
  168. function Verify()
  169. {
  170. global $modx;
  171. //$abs_targetDir = $modx->config['base_path'].$this->createDir();
  172. //if (!is_dir($abs_targetDir)) return false;
  173. if ($this->imgWidth == 0 && $this->imgHeight == 0) return false;
  174. if ($this->imgWidth == $this->img_src_w && $this->imgHeight == $this->img_src_h) return false;
  175. return true;
  176. }
  177. //-------------------------------------------------------------------------------------------------
  178. /*
  179. Проверяем:
  180. - существует ли уже сгенерированное ранее изображение по заданному пути с данными высотой и шириной
  181. */
  182. function RecreateVerify()
  183. {
  184. global $modx;
  185. $abs_targetFile = $modx->config['base_path'].$this->targetFilename;
  186. if (file_exists($abs_targetFile))
  187. {
  188. $size = getimagesize($abs_targetFile);
  189. $img_target_w = $size[0];
  190. $img_target_h = $size[1];
  191. if (($this->imgWidth == $img_target_w) && ($this->imgHeight == $img_target_h)) return true;
  192. }
  193. return false;
  194. }
  195. //-------------------------------------------------------------------------------------------------
  196. /*
  197. Наносим водяные знаки если необходимо
  198. */
  199. function ApplyWatermark($watermark)
  200. {
  201. global $modx;
  202. if ($watermark[use_watermark]){
  203. if ($watermark[watermark_type] == "image"){
  204. $this->thumbclass->img_watermark=$watermark[watermark_img];
  205. $this->thumbclass->img_watermark_Valing=strtoupper($watermark[watermark_valign]);
  206. $this->thumbclass->img_watermark_Haling=strtoupper($watermark[watermark_halign]);
  207. }else{
  208. $this->thumbclass->txt_watermark=$watermark[watermark_txt];
  209. $this->thumbclass->txt_watermark_color=$watermark[watermark_txt_color];
  210. $this->thumbclass->txt_watermark_font=$watermark[watermark_font];
  211. $this->thumbclass->txt_watermark_Valing=strtoupper($watermark[watermark_valign]);
  212. $this->thumbclass->txt_watermark_Haling=strtoupper($watermark[watermark_halign]);
  213. $this->thumbclass->txt_watermark_Hmargin=strtoupper($watermark[watermark_txt_hmargin]);
  214. $this->thumbclass->txt_watermark_Vmargin=strtoupper($watermark[watermark_txt_vmargin]);
  215. }
  216. }
  217. // Специальный водяной знак для WYSIWYG-редактора
  218. if ($modx->isBackend())
  219. {
  220. $this->thumbclass->img_watermark=$modx->config['base_path']."assets/plugins/directresize/images/wysiwyg.png";
  221. $this->thumbclass->img_watermark_Valing="BOTTOM";
  222. $this->thumbclass->img_watermark_Haling="RIGHT";
  223. }
  224. }
  225. //-------------------------------------------------------------------------------------------------
  226. function Process()
  227. {
  228. global $modx;
  229. if ($this->Verify())
  230. {
  231. $this->SetTargetFilename();
  232. $this->CalcSizes();
  233. if ($this->RecreateVerify()) return $this->targetFilename;
  234. $this->thumbclass->quality = $this->mode == "thumb" ? $this->drconfig['thumb_quality'] : $this->drconfig['big_quality'];
  235. if ($modx->isBackend()) $this->thumbclass->quality = $this->drconfig['wysiwyg_quality'];
  236. $watermark = $this->mode == "thumb" ? $this->drconfig['thumb_watermark'] : $this->drconfig['big_watermark'];
  237. $this->ApplyWatermark($watermark);
  238. $this->thumbclass->process();
  239. $this->thumbclass->save($modx->config['base_path'].$this->targetFilename);
  240. if ($this->thumbclass->img["src"]) {
  241. @ImageDestroy($this->thumbclass->img["src"]);
  242. }
  243. if ($this->thumbclass->img["watermark"]) {
  244. @ImageDestroy($this->thumbclass->img["watermark"]);
  245. }
  246. return $this->targetFilename;
  247. }
  248. return $this->img_src;
  249. }
  250. //-------------------------------------------------------------------------------------------------
  251. /*
  252. Проверяем разрешенные расширения для изображений
  253. */
  254. function CheckAllowedExt($imgFile)
  255. {
  256. $img_ext = strtolower(substr(strrchr($imgFile,'.'),1));
  257. if ($img_ext != "jpg" && $img_ext != "jpeg" && $img_ext != "png"){
  258. return false;
  259. }
  260. return true;
  261. }
  262. //-------------------------------------------------------------------------------------------------
  263. function getAbsPath($path)
  264. {
  265. global $modx;
  266. return strstr($path, "://") ? $path : $modx->config['base_path'].$path;
  267. }
  268. //-------------------------------------------------------------------------------------------------
  269. /*
  270. Проверяем разрешенные и запрещенные пути для применения плагина
  271. */
  272. function checkPath($path)
  273. {
  274. global $modx;
  275. // Путь - абсолютный, указан через /
  276. if (substr($path, 0, 1)=="/") $path = substr($path, 1, strlen($path));
  277. if (!strstr($path, "http://")) $path =$modx->config['base_path'].$path;
  278. if (!file_exists($path) && !strstr($path, "http://")) return false;
  279. if ($this->drconfig['allow_from_allremote'] && strstr($path, "http://")) return true;
  280. $path = dirname($path);
  281. if (strstr($path, "assets/drgalleries")) return true;
  282. if (!empty($this->drconfig['allow_from']))
  283. {
  284. $pathArray =$this->drconfig['allow_from'];
  285. $mode = "allow";
  286. }
  287. else{
  288. $pathArray = $this->drconfig['deny_from'];
  289. $mode = "deny";
  290. }
  291. foreach($pathArray as $p)
  292. {
  293. if (substr($p,strlen($p)-1,1) == "/") $p = substr($p,0 ,strlen($p)-1);
  294. if (substr($path,0,strlen($p)) == $p || substr($path,0,strlen($modx->config['base_path'].$p)) == $modx->config['base_path'].$p) return $mode == "allow" ? true : false;
  295. }
  296. return $mode == "allow" ? false : true;
  297. }
  298. //-------------------------------------------------------------------------------------------------
  299. function CheckThumbSizes($img)
  300. {
  301. if ($this->drconfig['thumb_default_sizemode']==4 && $this->drconfig['thumb_default_height']>0 && $this->drconfig['thumb_default_width']>0)
  302. {
  303. $this->imgHTMLHeight = $this->drconfig['thumb_default_height'];
  304. $this->imgHTMLWidth = $this->drconfig['thumb_default_width'];
  305. return true;
  306. }
  307. preg_match("/height *(:|=) *[\"']* *\d+ *[\"']*/",$img,$array);
  308. $imgHTMLHeight = preg_replace("/[^0123456789]/","",$array[0]);
  309. if ($imgHTMLHeight>0) $this->imgHTMLHeight = $imgHTMLHeight;
  310. preg_match("/width *(:|=) *[\"']* *\d+ *[\"']*/",$img,$array);
  311. $imgHTMLWidth = preg_replace("/[^0123456789]/","",$array[0]);
  312. if ($imgHTMLWidth>0) $this->imgHTMLWidth = $imgHTMLWidth;
  313. if ($imgHTMLHeight>0 && $imgHTMLWidth>0)
  314. {
  315. return true;
  316. }
  317. if ($imgHTMLHeight == 0 && $imgHTMLWidth == 0 && $this->drconfig['thumb_default_sizemode']==1 && $this->drconfig['thumb_default_height']>0 && $this->drconfig['thumb_default_width']>0)
  318. {
  319. $this->imgHTMLHeight = $this->drconfig['thumb_default_height'];
  320. $this->imgHTMLWidth = $this->drconfig['thumb_default_width'];
  321. return true;
  322. }
  323. if ($imgHTMLWidth == 0 && $this->drconfig['thumb_default_sizemode']==2 && $this->drconfig['thumb_default_width']>0)
  324. {
  325. $this->imgHTMLWidth = $this->drconfig['thumb_default_width'];
  326. return true;
  327. }
  328. if ($imgHTMLHeight == 0 && $this->drconfig['thumb_default_sizemode']==3 && $this->drconfig['thumb_default_height']>0)
  329. {
  330. $this->imgHTMLHeight = $this->drconfig['thumb_default_height'];
  331. return true;
  332. }
  333. if ($imgHTMLHeight>0 || $imgHTMLWidth>0)
  334. {
  335. return true;
  336. }
  337. return false;
  338. }
  339. //-------------------------------------------------------------------------------------------------
  340. /*
  341. Удаляем метки из выходного кода
  342. */
  343. function ReplaceLabels($input)
  344. {
  345. foreach ($this->Labels as $v)
  346. {
  347. $input = str_replace(" ".$v, "", $input);
  348. $input = str_replace($v." ", "", $input);
  349. $input = str_replace($v, "", $input);
  350. }
  351. return $input;
  352. }
  353. //-------------------------------------------------------------------------------------------------
  354. /*
  355. Поиск меток в изображении
  356. */
  357. function CheckForLabels($img)
  358. {
  359. foreach ($this->Labels as $v)
  360. {
  361. preg_match("/".$v."/",$img,$match);
  362. //preg_match("/title) *= *[\"|']([^\"']*)[\"']/",$img,$array);
  363. $this->label[$v] = $match[0] == $v ? TRUE : FALSE;
  364. //$this->label[$v] = (strstr($array[1], $v)) ? TRUE : FALSE;
  365. }
  366. }
  367. //-------------------------------------------------------------------------------------------------
  368. function ProcessContent($o)
  369. {
  370. global $modx;
  371. preg_match_all("/<img[^>]*>/", $o, $imgs, PREG_PATTERN_ORDER);
  372. for($n=0;$n<count($imgs[0]);$n++){
  373. $currentImgPath = preg_replace("/^.+src=('|\")/i","",$imgs[0][$n]);
  374. $currentImgPath = preg_replace("/('|\").*$/i","",$currentImgPath);
  375. $currentImgPath = str_replace($modx->config[site_url], "", $currentImgPath);
  376. $currentImgPath = urldecode($currentImgPath);
  377. preg_match('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $currentImgPath, $matches);
  378. if (!empty($matches)) continue;
  379. // Ищем метки
  380. $this->CheckForLabels($imgs[0][$n]);
  381. //проверяем, можно ли для изображения в его папке использовать плагин, проверяем метку drskip, проверяем расширение файла
  382. if ($this->checkPath($currentImgPath) && !$this->label["drskip"] && $this->CheckAllowedExt($currentImgPath) && (($this->drconfig['lightbox_mode'] == 1 && $this->label["drlightbox"]) || $this->drconfig['lightbox_mode'] == 2)){
  383. $img = strtolower($imgs[0][$n]);
  384. // проверяем, заданы ли у изображения height или width
  385. if ($this->CheckThumbSizes($img)){
  386. $imgf =$imgs[0][$n];
  387. preg_match("/^.+(src|Src|SRC)=('|\")/",$imgf,$lien_g);
  388. $imgf = preg_replace("/^.+src=('|\")/i","",$imgf);
  389. preg_match("/('|\").*$/",$imgf,$lien_d);
  390. // Генеруем тумбу
  391. $currentImgPath = $this->PrepareImg($currentImgPath);
  392. $this->imgWidth = $this->imgHTMLWidth;
  393. $this->imgHeight = $this->imgHTMLHeight;
  394. $this->mode = "thumb";
  395. $this->thumbPath = $this->Process();
  396. /*
  397. thumbImgTag - HTML-код тега img для тумбы
  398. thumbWidth, thumbHeight - финальные размеры сгенерированной тумбы
  399. */
  400. $HTML = $lien_g[0].$this->thumbPath.$lien_d[0];
  401. $this->thumbWidth = $this->imgWidth;
  402. $this->thumbHeight = $this->imgHeight;
  403. //if ($this->label["drthumbonly"])
  404. {
  405. $s = "/(width *= *[\"|'])([^\"']*)([\"'])/i";
  406. $r = "\${1}{$this->thumbWidth}\${3}";
  407. $HTML = preg_replace($s,$r, $HTML);
  408. $s = "/(height *= *[\"|'])([^\"']*)([\"'])/i";
  409. $r = "\${1}{$this->thumbHeight}\${3}";
  410. $HTML = preg_replace($s,$r, $HTML);
  411. }
  412. // Генерируем большое изображение и lightbox HTML-код
  413. if (!$modx->isBackend() && !$this->label["drthumbonly"]){
  414. $size = getimagesize($modx->config['base_path'].$currentImgPath);
  415. $currentImgWidth = $size[0];
  416. $currentImgHeight = $size[1];
  417. if ($currentImgWidth > $this->imgHTMLWidth || $currentImgHeight > $this->imgHTMLHeight){
  418. $this->originalPath = $currentImgPath;
  419. $this->originalWidth =$currentImgWidth;
  420. $this->originalHeight =$currentImgHeight;
  421. $this->bigPath = $currentImgPath;
  422. $this->bigWidth = $currentImgWidth;
  423. $this->bigHeight = $currentImgHeight;
  424. if ($currentImgWidth > $this->drconfig['big_width'] || $currentImgHeight > $this->drconfig['big_height']){
  425. // Генерируем большое изображение
  426. $this->PrepareImg($currentImgPath);
  427. $this->imgWidth = $this->drconfig['big_width'];
  428. $this->imgHeight = $this->drconfig['big_height'];
  429. $this->mode = "big";
  430. $this->bigPath = $this->Process();
  431. $this->bigWidth = $this->imgWidth;
  432. $this->bigHeight = $this->imgHeight;
  433. } else {
  434. $this->bigPath = $currentImgPath;
  435. }
  436. // Генерируем HTML-код lightbox-ссылки
  437. $HTML = $this->ParseTemplate($imgs[0][$n], $n);
  438. }
  439. }
  440. $o = str_replace($imgs[0][$n],$HTML,$o);
  441. $this->imgCounter++;
  442. }
  443. }
  444. }
  445. if (!$modx->isBackend()) $o = $this->ReplaceLabels($o);
  446. $this->output = $o;
  447. }
  448. //-------------------------------------------------------------------------------------------------
  449. /*
  450. Парсим шаблон, собираем выходной код
  451. */
  452. function ParseTemplate($tpl, $currId)
  453. {
  454. global $modx, $_lang;
  455. if (!class_exists('DRChunkie')) {
  456. $chunkieclass = $modx->config['base_path'].DIRECTRESIZE_PATH.'includes/chunkie.class.inc.php';
  457. if (file_exists($chunkieclass)) {
  458. include_once $chunkieclass;
  459. }
  460. }
  461. $drtemplate = new DRChunkie($this->drconfig['tpl']);
  462. /*
  463. Обрабатываем аттрибуты исходного изображения, помещаем их в плейсхолдеры
  464. */
  465. $HTMLattr = array(
  466. "alt" => "alt|Alt|ALT",
  467. "title" => "title|Title|TITLE",
  468. "class" => "class|Class|CLASS",
  469. "valign" => "valign|Valign|VALIGN",
  470. "align" => "align|align|ALIGN",
  471. "style" => "style|Style|STYLE",
  472. );
  473. foreach ($HTMLattr as $attr_k => $attr_v)
  474. {
  475. preg_match("/(".$attr_v.") *= *[\"|'][^\"']*[\"']/",$tpl,$array);
  476. if (!empty($array[0]))
  477. {
  478. $tmp = preg_replace("/".$attr_k." *= *[\"|']/i","",$array[0]);
  479. $tmp = preg_replace("/[\"']*/i","",$tmp);
  480. $tpldata[$attr_k] = trim($tmp);
  481. }
  482. }
  483. $tpldata['id'] = $currId;
  484. $tpldata['thumbWidth'] =$this->thumbWidth;
  485. $tpldata['thumbHeight'] =$this->thumbHeight;
  486. $tpldata['thumbPath'] = $this->thumbPath;
  487. $tpldata['bigWidth'] =$this->bigWidth;
  488. $tpldata['bigHeight'] =$this->bigHeight;
  489. $tpldata['bigPath'] = $this->bigPath;
  490. $tpldata['originalPath'] = isset($this->originalremotePath) ? $this->originalremotePath : $this->originalPath;
  491. $tpldata['originalWidth'] =$this->originalWidth;
  492. $tpldata['originalHeight'] =$this->originalHeight;
  493. $tpldata['originalFilename'] =str_replace("big_", "", basename($this->bigPath));
  494. //$tpldata['originalremotePath'] = $this->originalremotePath;
  495. if (strstr($drtemplate->template, "[+dr.originalFilesize+]")) $tpldata['originalFilesize'] = $this->ParseFilesize(filesize($modx->config['base_path'].$this->originalPath));
  496. if (strstr($drtemplate->template, "[+dr.thumbFilesize+]")) $tpldata['thumbFilesize'] = $this->ParseFilesize(filesize($modx->config['base_path'].$this->thumbPath));
  497. if (strstr($drtemplate->template, "[+dr.bigFilesize+]")) $tpldata['bigFilesize'] = $this->ParseFilesize(filesize($modx->config['base_path'].$this->bigPath));
  498. $drtemplate->addVar('dr', $tpldata);
  499. unset($this->thumbWidth, $this->thumbHeight, $this->thumbPath, $this->bigWidth, $this->bigHeight, $this->bigPath, $this->originalPath, $this->originalWidth, $this->originalHeight, $this->originalFilename, $this->originalremotePath);
  500. return $drtemplate->Render();
  501. }
  502. //-------------------------------------------------------------------------------------------------
  503. function ParseFilesize($size)
  504. {
  505. global $_lang;
  506. if ($size == 0) return;
  507. if($size < 1024)
  508. $size = $size.' '.$_lang['filesize_b'];
  509. else if($size >= 1024 && $size < 1024*1024)
  510. {
  511. $size = sprintf('%01.2f',$size/1024).' '.$_lang['filesize_Kb'];
  512. }
  513. else if($size >= (1024*1024) && $size < 1024*1024*1024)
  514. {
  515. $size = sprintf('%01.2f',$size/(1024*1024)).' '.$_lang['filesize_Mb'];
  516. }
  517. else
  518. $size = sprintf('%01.2f',$size/(1024*1024*1024)).' '.$_lang['filesize_Tb'];
  519. return $size;
  520. }
  521. //-------------------------------------------------------------------------------------------------
  522. /*
  523. Проверяем, существует ли папка, если нет - создаем ее в зависимости от заданных параметров (стандартными средствами PHP или чере FTP-команды)
  524. */
  525. function CreateDir()
  526. {
  527. global $modx;
  528. $path_to_gal = "assets/drgalleries/".$this->drconfig['docID']."/";
  529. if (is_dir($modx->config['base_path'].$path_to_gal)) return $path_to_gal;
  530. if(!$this->drconfig['use_ftp_commands']) {
  531. $old_umask = umask(0);
  532. if(!mkdir($modx->config['base_path'].$path_to_gal, 0777)) {
  533. $output = 'Directory creation failed!';
  534. return;
  535. }
  536. umask($old_umask);
  537. } else {
  538. $connect = ftp_connect($this->drconfig['ftp_server'], $this->drconfig['ftp_port']);
  539. if (!$connect) {
  540. $output = 'Connection to FTP failed.';
  541. return;
  542. }
  543. $login = ftp_login($connect, $this->drconfig['ftp_user'], $this->drconfig['ftp_pass']);
  544. if (!$login) {
  545. $output = 'Could not login to FTP.';
  546. return;
  547. }
  548. $changeDir = ftp_chdir($connect, $this->drconfig['ftp_base_dir'].$path_to_gal);
  549. if (!$changeDir) {
  550. $output = 'Could not change directory to: '.$this->drconfig['ftp_base_dir'].$path_to_gal;
  551. return;
  552. }
  553. $makeDir = ftp_mkdir($connect, $this->drconfig['docID']);
  554. if (!$makeDir) {
  555. $output = 'Could not created directory.';
  556. return;
  557. }
  558. $old_umask = umask(0);
  559. $setPerm = ftp_site($connect, 'CHMOD 0777 /'.$path_to_gal);
  560. if (!$setPerm) {
  561. $output = 'Could not set permissions: '.'CHMOD 0777 /'.$path_to_gal;
  562. }
  563. umask($old_umask);
  564. ftp_close($connect);
  565. }
  566. return $path_to_gal;
  567. }
  568. //-------------------------------------------------------------------------------------------------
  569. /*
  570. Подключаем JS и CSS от Maxigallery.
  571. */
  572. function RegisterMGpacks($maxigallery_js_packs)
  573. {
  574. global $modx, $_lang;
  575. $scripts = array("slimbox", "slidebox", "lightboxv2");
  576. if (in_array($maxigallery_js_packs, $scripts)){
  577. $scripts_codes =
  578. array(
  579. "slimbox" => array(
  580. "js" => array(
  581. MODX_BASE_URL."assets/snippets/maxigallery/slimbox/js/mootools.js",
  582. MODX_BASE_URL."assets/snippets/maxigallery/slimbox/js/slimbox_lang_{$_lang['lang']}.js",
  583. MODX_BASE_URL."assets/snippets/maxigallery/slimbox/js/slimbox.js"
  584. ),
  585. "css" => array(
  586. '<link rel="stylesheet" href="'.MODX_BASE_URL.'assets/snippets/maxigallery/slimbox/css/slimbox.css" type="text/css" media="screen" />'
  587. )
  588. ),
  589. "slidebox" => array(
  590. "js" => array(
  591. MODX_BASE_URL."assets/snippets/maxigallery/slidebox/slidebox_setup.js",
  592. MODX_BASE_URL."assets/snippets/maxigallery/slidebox/slidebox_lang_{$_lang['lang']}.js",
  593. MODX_BASE_URL."assets/snippets/maxigallery/slidebox/prototype.js",
  594. MODX_BASE_URL."assets/snippets/maxigallery/slidebox/slidebox.js"
  595. ),
  596. "css" => array(
  597. '<link rel="stylesheet" href="'.MODX_BASE_URL.'assets/snippets/maxigallery/slidebox/style.css" type="text/css" media="screen" />',
  598. '
  599. <!--[if gte IE 5.5]>
  600. <![if lt IE 7]>
  601. <style type="text/css">
  602. * html #overlay{
  603. background-color: #333;
  604. back\ground-color: transparent;
  605. background-image: url('.MODX_BASE_URL.'assets/snippets/maxigallery/slidebox/blank.gif);
  606. filter: progid:DXImageTransform.Microsoft.AlphaImageLoader (src="'.MODX_BASE_URL.'assets/snippets/maxigallery/slidebox/overlay.png", sizingMethod="scale");
  607. </style>
  608. <![endif]>
  609. <![endif]-->'
  610. )
  611. ),
  612. "lightboxv2" => array(
  613. "js" => array(
  614. MODX_BASE_URL."assets/snippets/maxigallery/lightboxv2/js/lightbox_setup.js",
  615. MODX_BASE_URL."assets/snippets/maxigallery/lightboxv2/js/lightbox_lang_{$_lang['lang']}.js",
  616. MODX_BASE_URL."assets/snippets/maxigallery/lightboxv2/js/prototype.js",
  617. MODX_BASE_URL."assets/snippets/maxigallery/lightboxv2/js/scriptaculous.js?load=effects",
  618. MODX_BASE_URL."assets/snippets/maxigallery/lightboxv2/js/lightbox.js"
  619. ),
  620. "css" => array(
  621. '<link rel="stylesheet" href="'.MODX_BASE_URL.'assets/snippets/maxigallery/lightboxv2/css/lightbox.css" type="text/css" media="screen" />'
  622. )
  623. )
  624. );
  625. foreach ($scripts_codes[$maxigallery_js_packs][js] as $v)
  626. if (!$modx->loadedjscripts[$v]) $header .="\n".'<script type="text/javascript" src="'.$v.'"></script>';
  627. foreach ($scripts_codes[$maxigallery_js_packs][css] as $v)
  628. if (!$modx->loadedjscripts[$v]) $header .= "\n".$v;
  629. return $header;
  630. }
  631. }
  632. }
  633. //-------------------------------------------------------------------------------------------------
  634. //function to convert gif to png
  635. function gif2png($name){
  636. $src=imagecreatefromgif($name);
  637. //calculate size for the image
  638. $src_size = getimagesize($name);
  639. //create blank destination image
  640. $dest=imagecreate($src_size[0],$src_size[1]);
  641. //delete gif image
  642. unlink($name);
  643. $name = str_replace(".gif", ".png", $name);
  644. //resize the image
  645. if(function_exists('imagecopyresampled')){
  646. imagecopyresampled($dest,$src,0,0,0,0,$src_size[0],$src_size[1],$src_size[0],$src_size[1]);
  647. }else{
  648. imagecopyresized($dest,$src,0,0,0,0,$src_size[0],$src_size[1],$src_size[0],$src_size[1]);
  649. }
  650. //create new image
  651. imagepng($dest,$name);
  652. @imagedestroy($src);
  653. @imagedestroy($dest);
  654. return $name;
  655. }
  656. //-------------------------------------------------------------------------------------------------
  657. function ConvertFromBackend($o, $escape= true)
  658. {
  659. $reg = "/<img[^>]*>/";
  660. preg_match_all($reg, $o, $imgs, PREG_PATTERN_ORDER);
  661. for($n=0;$n<count($imgs[0]);$n++)
  662. {
  663. $lien_img = preg_replace("/^.+src=('|\")/i","",$imgs[0][$n]);
  664. $lien_img = preg_replace("/('|\").*$/i","",$lien_img);
  665. $lien_img = str_replace($modx->config[site_url], "", $lien_img);
  666. $lien_img = urldecode($lien_img);
  667. $lien_img = str_replace("---", "://", $lien_img);
  668. $lien_img = str_replace("--", "/", $lien_img);
  669. $imgf = $imgs[0][$n];
  670. preg_match("/^.+(src|Src|SRC)=('|\")/",$imgf,$lien_g);
  671. $imgf = preg_replace("/^.+src=('|\")/i","",$imgf);
  672. preg_match("/('|\").*$/",$imgf,$lien_d);
  673. $thumbImgTag = $lien_g[0].$lien_img.$lien_d[0];
  674. $o = str_replace($imgs[0][$n],$thumbImgTag,$o);
  675. }
  676. $o = str_replace(DIRECTRESIZE_GALLERYDIR.$_REQUEST[id]."/wysiwyg_","", $o);
  677. if ($escape) $o = mysql_escape_string($o);
  678. return $o;
  679. }
  680. //-------------------------------------------------------------------------------------------------
  681. // ggarciaa at gmail dot com (04-July-2007 01:57)
  682. function SureRemoveDir($dir, $DeleteMe = false) {
  683. if(!$dh = @opendir($dir)) return;
  684. while (false !== ($obj = readdir($dh))) {
  685. if($obj=='.' || $obj=='..') continue;
  686. if (!@unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, false);
  687. }
  688. if ($DeleteMe){
  689. closedir($dh);
  690. @rmdir($dir);
  691. }
  692. }
  693. //-------------------------------------------------------------------------------------------------
  694. function ClearDRCache($clearCache = 0)
  695. {
  696. global $modx;
  697. if ($clearCache == 0 ) return;
  698. if ($clearCache == 1 && isset($_REQUEST[id]))
  699. {
  700. SureRemoveDir($modx->config['base_path']."assets/drgalleries/".$_REQUEST[id]);
  701. }
  702. if ($clearCache == 2)
  703. {
  704. SureRemoveDir($modx->config['base_path']."assets/drgalleries");
  705. }
  706. }
  707. //-------------------------------------------------------------------------------------------------
  708. function RenderOnFrontend($o, $config)
  709. {
  710. global $modx, $_lang;
  711. if (isset($config)) include_once $modx->config['base_path'].DIRECTRESIZE_PATH."configs/$config.config.php";
  712. $drconfig['allow_from'] = isset($allow_from) ? $allow_from : (isset($deny_from) ? NULL : "assets/images");
  713. $drconfig['deny_from'] = isset($deny_from) && !isset($allow_from) ? $deny_from : NULL;
  714. $drconfig['resize_method'] = isset($resize_method) ? $resize_method : 3;
  715. $drconfig['big_quality'] = isset($big_quality) ? $big_quality : 80;
  716. $drconfig['thumb_quality'] = isset($thumb_quality) ? $thumb_quality : 80;
  717. $drconfig['wysiwyg_quality'] = isset($wysiwyg_quality) ? $wysiwyg_quality : 40;
  718. $drconfig['lightbox_mode'] = isset($lightbox_mode) ? $lightbox_mode : 1;
  719. $drconfig['thumb_default_width'] = isset($thumb_default_width) ? $thumb_default_width : 0;
  720. $drconfig['thumb_default_height'] = isset($thumb_default_height) ? $thumb_default_height : 0;
  721. $drconfig['thumb_default_sizemode'] = isset($thumb_default_sizemode) ? $thumb_default_sizemode : 1;
  722. $drconfig['big_width'] = isset($big_width) ? $big_width : 800;
  723. $drconfig['big_height'] = isset($big_height) ? $big_height : 600;
  724. $drconfig['remote_refresh_time'] = isset($remote_refresh_time) ? $remote_refresh_time : 60;
  725. $drconfig['thumb_watermark']['use_watermark'] = (isset($thumb_use_watermark)) ? $thumb_use_watermark : false; // [ true | false ]
  726. $drconfig['thumb_watermark']['watermark_txt'] = (isset($thumb_watermark_txt)) ? $thumb_watermark_txt : "Copyright ".date("Y"); // [ text ]
  727. $drconfig['thumb_watermark']['watermark_txt_color'] = (isset($thumb_watermark_txt_color)) ? $thumb_watermark_txt_color : "FFFFFF"; // [ RGB Hexadecimal ]
  728. $drconfig['thumb_watermark']['watermark_font'] = (isset($thumb_watermark_font)) ? $thumb_watermark_font : 1; // [ 1 | 2 | 3 | 4 | 5 ]
  729. $drconfig['thumb_watermark']['watermark_txt_vmargin'] = (isset($thumb_watermark_txt_vmargin)) ? $thumb_watermark_txt_vmargin : 2; // [ number ]
  730. $drconfig['thumb_watermark']['watermark_txt_hmargin'] = (isset($thumb_watermark_txt_hmargin)) ? $thumb_watermark_txt_hmargin : 2; // [ number ]
  731. $drconfig['thumb_watermark']['watermark_img'] = (isset($thumb_watermark_img)) ? $thumb_watermark_img : DIRECTRESIZE_PATH.'images/watermark.png'; //path
  732. $drconfig['thumb_watermark']['watermark_type'] = (isset($thumb_watermark_type)) ? $thumb_watermark_type : "text"; // [ text | image ]
  733. $drconfig['thumb_watermark']['watermark_valign'] = (isset($thumb_watermark_valign)) ? $thumb_watermark_valign : "bottom"; // [ top | center | bottom ]
  734. $drconfig['thumb_watermark']['watermark_halign'] = (isset($thumb_watermark_halign)) ? $thumb_watermark_halign : "right"; // [ left | center | right ]
  735. $drconfig['big_watermark']['use_watermark'] = (isset($big_use_watermark)) ? $big_use_watermark : false; // [ true | false ]
  736. $drconfig['big_watermark']['watermark_txt'] = (isset($big_watermark_txt)) ? $big_watermark_txt : "Copyright ".date("Y")." ".$modx->config['site_name']; // [ text ]
  737. $drconfig['big_watermark']['watermark_txt_color'] = (isset($big_watermark_txt_color)) ? $big_watermark_txt_color : "FFFFFF"; // [ RGB Hexadecimal ]
  738. $drconfig['big_watermark']['watermark_font'] = (isset($big_watermark_font)) ? $big_watermark_font : 3; // [ 1 | 2 | 3 | 4 | 5 ]
  739. $drconfig['big_watermark']['watermark_txt_vmargin'] = (isset($big_watermark_txt_vmargin)) ? $big_watermark_txt_vmargin : 10; // [ number ]
  740. $drconfig['big_watermark']['watermark_txt_hmargin'] = (isset($big_watermark_txt_hmargin)) ? $big_watermark_txt_hmargin : 10; // [ number ]
  741. $drconfig['big_watermark']['watermark_img'] = (isset($big_watermark_img)) ? $big_watermark_img : DIRECTRESIZE_PATH.'images/watermark.png'; //path
  742. $drconfig['big_watermark']['watermark_type'] = (isset($big_watermark_type)) ? $big_watermark_type : "text"; // [ text | image ]
  743. $drconfig['big_watermark']['watermark_valign'] = (isset($big_watermark_valign)) ? $big_watermark_valign : "bottom"; // [ top | center | bottom ]
  744. $drconfig['big_watermark']['watermark_halign'] = (isset($big_watermark_halign)) ? $big_watermark_halign : "right"; // [ left | center | right ]
  745. $drconfig['use_ftp_commands'] = (isset($use_ftp_commands)) ? $use_ftp_commands : false; // [ true | false ]
  746. $drconfig['ftp_server'] = (isset($ftp_server)) ? $ftp_server : "ftp.yourserver.fi"; // [ text ]
  747. $drconfig['ftp_port'] = (isset($ftp_port)) ? $ftp_port : 21; // [ number ]
  748. $drconfig['ftp_user'] = (isset($ftp_user)) ? $ftp_user : "username"; // [ text ]
  749. $drconfig['ftp_pass'] = (isset($ftp_pass)) ? $ftp_pass : "password"; // [ text ]
  750. $drconfig['ftp_base_dir'] = (isset($ftp_base_dir)) ? $ftp_base_dir : "/"; // [ text ]
  751. $drconfig['docID'] = $modx->isBackend() ? $_REQUEST[id] : $modx->documentIdentifier;
  752. $drconfig['tpl'] = (isset($tpl)) ? $tpl : '';
  753. $drconfig['allow_from_allremote'] = isset($allow_from_allremote) ? $allow_from_allremote : FALSE;
  754. if (!empty($drconfig['allow_from']))
  755. {
  756. $drconfig['allow_from'] = str_replace(" ", "", $drconfig['allow_from']);
  757. $drconfig['allow_from'] = urldecode($drconfig['allow_from']);
  758. $drconfig['allow_from'] = explode(",", $drconfig['allow_from']);
  759. }else
  760. if (!empty($drconfig['deny_from']))
  761. {
  762. $drconfig['deny_from'] = str_replace(" ", "", $drconfig['deny_from']);
  763. $drconfig['deny_from'] = urldecode($drconfig['deny_from']);
  764. $drconfig['deny_from'] = explode(",", $drconfig['deny_from']);
  765. }
  766. if (!$modx->isBackend())
  767. {
  768. $language = isset($language)? $language:$modx->config['manager_language'];
  769. include_once(DIRECTRESIZE_PATH."lang/english.inc.php");
  770. if($language!="english" && $language!='')
  771. {
  772. if(file_exists(DIRECTRESIZE_PATH ."lang/".$language.".inc.php")) include_once DIRECTRESIZE_PATH ."lang/".$language.".inc.php";
  773. }
  774. }
  775. $direct = new directResize($drconfig, $o);
  776. if (isset($maxigallery_jscss_packs)) $header=$direct->RegisterMGpacks($maxigallery_jscss_packs);
  777. if (isset($header) && !$modx->isBackend() && $direct->imgCounter>0)
  778. {
  779. $head = strstr($direct->output, "</head>") ? "</head>" : "</HEAD>";
  780. $direct->output = str_replace($head, $header."\n".$head, $direct->output);
  781. }
  782. return $direct->output;
  783. }
  784. ?>