Fix #5830 - long named image urls - html editor - should shorten name part of url...
[Pman.Core] / DataObjects / Images.php
index d86ef22..5478f16 100644 (file)
@@ -29,6 +29,18 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
     
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
+    function applyFilters($q, $au, $roo)
+    {
+        $tn = $this->tableName();
+        
+        if(!empty($q['search']['filename'])){
+            $this->whereAdd("
+                $tn.filename LIKE '%{$this->escape($q['search']['filename'])}%' OR $tn.title LIKE '%{$this->escape($q['search']['filename'])}%'
+            ");
+        }
+        
+
+    }
     
     function checkPerm($lvl, $au)
     {
@@ -118,9 +130,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             $this->mimetype = $y->fromFilename($filename);
         }
         
-        $this->mimetype= strtolower($this->mimetype);
+        $this->mimetype = strtolower($this->mimetype);
         
-        if (array_shift(explode('/', $this->mimetype)) == 'image') { 
+        $mta = explode('/', $this->mimetype);
+        if (array_shift($mta) == 'image') { 
         
             $imgs = @getimagesize($file);
             
@@ -131,6 +144,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             }
         }
         
+        if($this->mimetype == 'application/pdf'){
+            $this->no_of_pages = $this->getPdfPages($file);
+        }
+        
         $this->filesize = filesize($file);
         $this->created = date('Y-m-d H:i:s');
          
@@ -192,21 +209,42 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
      * 
      * 
      */
-    function beforeDelete()
+    function beforeDelete($dependants_array, $roo)
     {
+        
+        $opts = HTML_FlexyFramework::get()->Pman;
+        $deldir = $opts['storedir']. '/_deleted_images_';
+        if (!file_exists( $deldir )) {
+            mkdir($deldir, 0755);
+        }
+            
         $fn = $this->getStoreName();
+        $b = basename($fn);
         if (file_exists($fn)) {
-            unlink($fn);
+            
+            if (file_exists($deldir . '/'. $b)) {
+                unlink($fn);
+            } else {
+                rename($fn, $deldir .'/'. $b);
+            }
+            
+            
         }
         // delete thumbs..
-        $b = basename($fn);
+        
         $d = dirname($fn);
         if (file_exists($d)) {
                 
             $dh = opendir($d);
             while (false !== ($fn = readdir($dh))) {
                 if (substr($fn, 0, strlen($b)) == $b) {
-                    unlink($d. '/'. $fn);
+                    
+                    if (file_exists($deldir . '/'. $fn)) {
+                        unlink($d. '/'. $fn);
+                        continue;
+                    }
+                    rename($d. '/'. $fn, $deldir .'/'. $fn);
+                    
                 }
             }
         }
@@ -432,10 +470,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             if (!empty($req['query']['imagesize'])) {
                 $ret['url_thumb'] = $this->URL($req['query']['imagesize'], '/Images/Thumb',$baseURL);
             }
+            
+            $ret['shorten_name'] = $this->shorten_name();
         }
         
-         
-         
         return $ret;
     }
     
@@ -450,9 +488,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
     {
         if (!$this->id) {
             return 'about:blank';
-            
         }
-
+        
+        $shorten_name = $this->shorten_name();
+        
         $ff = HTML_FlexyFramework::get();
         $baseURL = $baseURL ? $baseURL : $ff->baseURL ;
         if (preg_match('#^http[s]*://#', $provider)) {
@@ -462,7 +501,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         if ($size < 0) {
             $provider = preg_replace('#/Thumb$#', '', $provider);
             
-            return $baseURL . $provider . "/{$this->id}/{$this->filename}";
+            return $baseURL . $provider . "/{$this->id}/{$shorten_name}";
         }
         //-- max?
         //$size = max(100, (int) $size);
@@ -484,7 +523,26 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $fc->convert($mt, $size);
         
-        return $baseURL . $provider . "/$size/{$this->id}/{$this->filename}";
+        return $baseURL . $provider . "/$size/{$this->id}/{$shorten_name}";
+    }
+    
+    function shorten_name()
+    {
+        if(empty($this->filename)) {
+            return;
+        }
+        
+        $filename = explode('.', $this->filename);
+        $ext = array_pop($filename);
+        $name = preg_replace("/[^A-Za-z0-9.]+/", '-', implode('-', $filename)) ;
+        
+        if(strlen($name) > 32) {
+            $name = substr($name, 0, 32);
+        }
+        
+        $shorten_name = "{$name}.{$ext}";
+        
+        return $shorten_name;
     }
     /**
      * size could be 123x345
@@ -717,7 +775,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $ext = $y->toExt(trim((string) $this->mimetype ));
         
-        if(array_pop(explode('.', $this->filename)) != $ext){
+        $explode_filename = explode('.', $this->filename);
+        if(array_pop($explode_filename) != $ext){
             $this->filename = $this->filename .'.'. $ext; 
         }
         
@@ -734,7 +793,9 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $this->mimetype= strtolower($this->mimetype);
         
-        if (array_shift(explode('/', $this->mimetype)) == 'image') { 
+        $explode_mimetype = explode('/', $this->mimetype);
+        
+        if (array_shift($explode_mimetype) == 'image') { 
         
             $imgs = @getimagesize($data);
             
@@ -765,13 +826,17 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $this->filesize = filesize($f);
         
+        if($this->mimetype == 'application/pdf'){
+            $this->no_of_pages = $this->getPdfPages($f);
+        }
+        
         $this->update($o);
         
         return true;
         
     }
     
-    function toBase64()
+    function toBase64($rotate = false, $scaleWidth = 0, $scaleHeight = 0)
     {
         if(!preg_match('/^image\//', $this->mimetype)){
             return false;
@@ -785,45 +850,90 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $data = file_get_contents($file);
         
+        if(!empty($scaleWidth) || !empty($scaleHeight)){
+            $data = $this->scale(false, $scaleWidth, $scaleHeight);
+        }
+        
+        if($rotate){
+            $data = $this->rotate($data);
+        }
+        
         $base64 = 'data:' . $this->mimetype . ';base64,' . base64_encode($data);
         
         return $base64;
     }
     
-    function getNumberOfPages()
+    function getPdfPages($file)
     {
-        $ret = false;
-        
         require_once 'System.php';
         
-        switch ($this->mimetype) {
+        $page = 0;
+
+        $pdfinfo = System::which('pdfinfo');
+
+        if (!file_exists($file) || empty($pdfinfo)) {
+            return $page;
+        }
+        
+        $cmd = "{$pdfinfo} {$file}";
+
+        $ret = `$cmd`;
+
+        $info = explode("\n", $ret);
+
+        foreach ($info as $i){
+
+            if(!preg_match('/^Pages:[\s]*([0-9]+)/', $i, $matches)){
+                continue;
+            }
             
-            case 'application/pdf' :
-                
-                $file = $this->getStoreName();
-                
-                if(!file_exists($file)){
-                    return false;
-                }
-                
-                $pdftk = System::which('pdftk');
-                
-                if (empty($pdftk)) {
-                    return false;
-                }
-                
-                $cmd = "{$pdftk} dump_data";
-                
-                $test = `$cmd`;
-                
-                print_R($cmd);exit;
-                
-                break;
-            default :
-                break;
+            $page = (empty($matches[1])) ? 0 : $matches[1];
         }
         
-        return $ret;
+        return $page;
+    }
+    
+    function rotate($imageBlob = false)
+    {
+        if(empty($imageBlob)){
+            $imagick = new Imagick($this->getStoreName());
+        } else {
+            $imagick = new Imagick();
+            $imagick->readImageBlob($imageBlob);
+        }
+        
+        $orientation = $imagick->getImageOrientation(); 
+        
+        switch($orientation) { 
+            case Imagick::ORIENTATION_BOTTOMRIGHT: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), 180); // rotate 180 degrees 
+            break; 
+
+            case Imagick::ORIENTATION_RIGHTTOP: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), 90); // rotate 90 degrees CW 
+            break; 
+
+            case Imagick::ORIENTATION_LEFTBOTTOM: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), -90); // rotate 90 degrees CCW 
+            break; 
+        }
+        
+        return $imagick->getImageBlob();
+    }
+    
+    function scale($imageBlob = false, $width = 0, $height = 0)
+    {
+        if(empty($imageBlob)){
+            $imagick = new Imagick($this->getStoreName());
+        } else {
+            $imagick = new Imagick();
+            $imagick->readImageBlob($imageBlob);
+        }
+        
+        $imagick->resizeimage($width, $height, Imagick::FILTER_LANCZOS, true, true);
+        
+        return $imagick->getImageBlob();
+        
     }
     
  }