DataObjects/Images.php
[Pman.Core] / DataObjects / Images.php
1 <?php
2 /**
3  * Table Definition for Images
4  */
5 require_once 'DB/DataObject.php';
6
7 class Pman_Core_DataObjects_Images extends DB_DataObject 
8 {
9     ###START_AUTOCODE
10     /* the code below is auto generated do not remove the above tag */
11
12     public $__table = 'Images';                          // table name
13     public $id;                              // int(11)  not_null primary_key auto_increment
14     public $filename;                        // string(255)  not_null
15     public $ontable;                         // string(32)  not_null multiple_key
16     public $onid;                            // int(11)  not_null
17     public $mimetype;                        // string(64)  not_null
18     public $width;                           // int(11)  not_null
19     public $height;                          // int(11)  not_null
20     public $filesize;                        // int(11)  not_null
21     public $displayorder;                    // int(11)  not_null
22     public $language;                        // string(6)  not_null
23     public $parent_image_id;                 // int(11)  not_null
24     public $created;                         // datetime(19)  not_null binary
25     public $imgtype;                         // string(32)  not_null
26     public $linkurl;                         // string(254)  not_null
27     public $descript;                        // blob(65535)  not_null blob
28     public $title;                           // string(128)  not_null
29     
30     /* the code above is auto generated do not remove the tag below */
31     ###END_AUTOCODE
32     
33     function checkPerm($perm, $au)
34     {
35         // default permissons are to
36         // allow create / edit / if the user has
37         
38         if (!$au) {
39             
40           
41             
42             return false;
43         }
44         
45         $o = $this->object();
46         //print_r($o);
47         if (method_exists($o, 'hasPerm')) {
48             // edit permissions on related object needed...
49             return $o->hasPerm( $perm == 'S' ? 'S' : 'E' , $au);
50             
51         }
52         
53         return true; //// ??? not really that safe...
54         
55     }
56     
57     function beforeInsert($q, $roo) 
58     {
59         if (isset($q['_remote_upload'])) {
60             require_once 'System.php';
61             
62             $tmpdir  = System::mktemp("-d remote_upload");
63             
64             $path = $tmpdir . '/' . basename($q['_remote_upload']);
65             
66             if(!file_exists($path)){
67                file_put_contents($path, file_get_contents($q['_remote_upload'])); 
68             }
69             
70             $imageInfo = getimagesize($path);
71             
72             require_once 'File/MimeType.php';
73             $y = new File_MimeType();
74             $ext = $y->toExt(trim((string) $imageInfo['mime'] ));
75             
76             if (!preg_match("/\." . $ext."$/", $path, $matches)) {
77                 rename($path,$path.".".$ext);
78                 $path.= ".".$ext;
79             }
80             
81             if (!$this->createFrom($path)) {
82                 $roo->jerr("erro making image" . $q['_remote_upload']);
83             }
84             
85             if(!empty($q['_return_after_create'])){
86                 return;
87             }
88             
89             $roo->addEvent("ADD", $this, $this->toEventString());
90         
91             $r = DB_DataObject::factory($this->tableName());
92             $r->id = $this->id;
93             $roo->loadMap($r);
94             $r->limit(1);
95             $r->find(true);
96             $roo->jok($r->URL(-1,'/Images') . '#attachment-'.  $r->id);
97         }
98         
99         if(isset($q['_auto_save'])){
100             require_once 'System.php';
101             
102             $tmpdir  = System::mktemp("-d auto_save");
103             
104             $path = $tmpdir . '/' . time() . '.json';
105             
106             if(!file_exists($path)){
107                file_put_contents($path, $q['_auto_save'])); 
108             }
109             
110             $imageInfo = getimagesize($path);
111             
112             require_once 'File/MimeType.php';
113             $y = new File_MimeType();
114             $ext = $y->toExt(trim((string) $imageInfo['mime'] ));
115             
116             if (!preg_match("/\." . $ext."$/", $path, $matches)) {
117                 rename($path,$path.".".$ext);
118                 $path.= ".".$ext;
119             }
120             
121             if (!$this->createFrom($path)) {
122                 $roo->jerr("error occour on auto save making image");
123             }
124             
125             if(!empty($q['_return_after_create'])){
126                 return;
127             }
128             
129             $roo->addEvent("ADD", $this, $this->toEventString());
130         
131             $r = DB_DataObject::factory($this->tableName());
132             $r->id = $this->id;
133             $roo->loadMap($r);
134             $r->limit(1);
135             $r->find(true);
136             $roo->jok($r->URL(-1,'/Images') . '#attachment-'.  $r->id);
137         }
138         
139     }
140     
141      
142     /**
143      * create an email from file.
144      * these must have been set first.
145      * ontable / onid.
146      * 
147      */
148     function createFrom($file, $filename=false)
149     {
150         // copy the file into the storage area..
151         if (!file_exists($file) || !filesize($file)) {
152             return false;
153         }
154         
155         $filename = empty($filename) ? $file : $filename;
156         
157         if (empty($this->mimetype)) {
158             require_once 'File/MimeType.php';
159             $y = new File_MimeType();
160             $this->mimetype = $y->fromFilename($filename);
161         }
162         
163         $this->mimetype= strtolower($this->mimetype);
164         
165         if (array_shift(explode('/', $this->mimetype)) == 'image') { 
166         
167             $imgs = @getimagesize($file);
168             
169             if (empty($imgs) || empty($imgs[0]) || empty($imgs[1])) {
170                 // it's a file!!!!
171             } else {
172                 list($this->width , $this->height)  = $imgs;
173             }
174         }
175         
176         $this->filesize = filesize($file);
177         $this->created = date('Y-m-d H:i:s');
178          
179         
180         if (empty($this->filename)) {
181             $this->filename = basename($filename);
182         }
183         
184         //DB_DataObject::debugLevel(1);
185         if (!$this->id) {
186             $this->insert();
187         } else {
188             $this->update();
189         }
190         
191         
192         
193         $f = $this->getStoreName();
194         $dest = dirname($f);
195         if (!file_exists($dest)) {
196             // currently this is 0775 due to problems using shared hosing (FTP)
197             // it makes all the files unaccessable..
198             // you can normally solve this by giving the storedirectory better perms
199             // if needed on a dedicated server..
200             $oldumask = umask(0);
201             mkdir($dest, 0775, true);
202             umask($oldumask);  
203         }
204         
205         copy($file,$f);
206         
207         // fill in details..
208         
209         /* thumbnails */
210         
211      
212        // $this->createThumbnail(0,50);
213         return true;
214         
215     }
216
217     /**
218      * Calculate target file name
219      *
220      * @return - target file name
221      */
222     function getStoreName() 
223     {
224         $opts = HTML_FlexyFramework::get()->Pman;
225         $fn = preg_replace('/[^a-z0-9\.]+/i', '_', $this->filename);
226         return implode( '/', array(
227             $opts['storedir'], '_images_', date('Y/m', strtotime($this->created)), $this->id . '-'. $fn
228         ));
229           
230     }
231      
232     /**
233      * deletes all the image instances of it...
234      * 
235      * 
236      */
237     function beforeDelete()
238     {
239         $fn = $this->getStoreName();
240         if (file_exists($fn)) {
241             unlink($fn);
242         }
243         // delete thumbs..
244         $b = basename($fn);
245         $d = dirname($fn);
246         if (file_exists($d)) {
247                 
248             $dh = opendir($d);
249             while (false !== ($fn = readdir($dh))) {
250                 if (substr($fn, 0, strlen($b)) == $b) {
251                     unlink($d. '/'. $fn);
252                 }
253             }
254         }
255         
256     }
257     /**
258      * check mimetype against type
259      * - eg. img.is(#image#)
260      *
261      */
262     function is($type)
263     {
264         if (empty($this->mimetype)) {
265             return false;
266         }
267         return 0 === strcasecmp($type, array_shift(explode('/',$this->mimetype)));
268     }
269   
270     /**
271      * onUpload (singlely attached image to a table)
272      */
273     
274     function onUploadWithTbl($tbl,  $fld)
275     {
276         if ( $tbl->__table == 'Images') {
277             return; // not upload to self...
278         }
279         if (empty($_FILES['imageUpload']['tmp_name']) || 
280             empty($_FILES['imageUpload']['name']) || 
281             empty($_FILES['imageUpload']['type'])
282         ) {
283             return false;
284         }
285         if ($tbl->$fld) {
286             $image = DB_DataObject::factory('Images');
287             $image->get($tbl->$fld);
288             $image->beforeDelete();
289             $image->delete();
290         }
291         
292         $image = DB_DataObject::factory('Images');
293         $image->onid = $tbl->id;
294         $image->ontable = $tbl->__table;
295         $image->filename = $_FILES['imageUpload']['name']; 
296         $image->mimetype = $_FILES['imageUpload']['type'];
297        
298         if (!$image->createFrom($_FILES['imageUpload']['tmp_name'])) {
299             return false;
300         }
301         $old = clone($tbl);
302         $tbl->$fld = $image->id;
303         $tbl->update($old);
304          
305     }
306     
307     // direct via roo...
308     /// ctrl not used??
309     function onUpload($roo)
310     {
311 //        echo $_FILES['imageUpload']['type'];exit;
312         if (empty($_FILES['imageUpload']['tmp_name']) || 
313             empty($_FILES['imageUpload']['name']) || 
314             empty($_FILES['imageUpload']['type'])
315         ) {
316             $this->err = "Missing file details";
317             return false;
318         }
319         
320         if ($this->id) {
321             $this->beforeDelete();
322         }
323         if ( empty($this->ontable)) {
324             $this->err = "Missing  ontable";
325             return false;
326         }
327         
328         if (!empty($this->imgtype) && $this->imgtype[0] == '-' && !empty($this->onid)) {
329             // then its an upload 
330             $img  = DB_DataObject::factory('Images');
331             $img->onid = $this->onid;
332             $img->ontable = $this->ontable;
333             $img->imgtype = $this->imgtype;
334             
335             $img->find();
336             while ($img->fetch()) {
337                 $img->beforeDelete();
338                 $img->delete();
339             }
340             
341         }
342         
343         
344         
345         require_once 'File/MimeType.php';
346         $y = new File_MimeType();
347         $this->mimetype = $_FILES['imageUpload']['type'];
348         if (in_array($this->mimetype, array(
349                         'text/application',
350                         'application/octet-stream',
351                         'image/x-png',  // WTF does this?
352                         'image/pjpeg',  // WTF does this?
353                         'application/x-apple-msg-attachment', /// apple doing it's magic...
354                         'application/vnd.ms-excel',   /// sometimes windows reports csv as excel???
355                         'application/csv-tab-delimited-table', // windows again!!?
356                 ))) { // weird tyeps..
357             $inf = pathinfo($_FILES['imageUpload']['name']);
358             $this->mimetype  = $y->fromExt($inf['extension']);
359         }
360         
361         
362         $ext = $y->toExt(trim((string) $this->mimetype ));
363         
364         $this->filename = empty($this->filename) ? 
365             $_FILES['imageUpload']['name'] : ($this->filename .'.'. $ext); 
366         
367         
368         
369         if (!$this->createFrom($_FILES['imageUpload']['tmp_name'])) {
370             return false;
371         }
372         return true;
373          
374     }
375      
376     
377     
378     /**
379      * return a list of images for an object, optionally with a mime regex.
380      * eg. '%/pdf' or 'image/%'
381      *
382      * usage:
383      *
384      * $i = DB_DataObject::factory('Images');
385      * $i->imgtype = 'LOGO';
386      * $ar = $i->gather($somedataobject, 'image/%');
387      * 
388      * @param {DB_DataObject} dataobject  = the object to gather data on.
389      * @param {String} mimelike  LIKE query to use for search
390      
391      */
392     function gather($obj, $mime_like='', $opts=array())
393     {
394         //DB_DataObject::debugLevel(1);
395         if (empty($obj->id)) {
396             return array();
397         }
398         
399         $c = clone($this);
400         $c->whereAddIn($this->tableName() . '.ontable', array( $obj->tableName(), $obj->__table) , 'string');
401         $c->onid = $obj->id;
402         $c->autoJoin();
403         if (!empty($mime_like)) {
404             $c->whereAdd("Images.mimetype LIKE '". $c->escape($mime_like) ."'");
405         }
406
407         return $c->fetchAll();
408     }
409      
410     
411     /**
412     * set or get the dataobject this image is associated with
413     * @param DB_DataObject $obj An object to associate this image with
414     *        (does not store it - you need to call update() to do that)
415     * @return DB_DataObject the dataobject this image is attached to.
416     */
417     function object($obj=false)
418     {
419         if ($obj === false) {
420             if (empty($this->ontable) || empty($this->onid)) {
421                 return false;
422             }
423             $ret = DB_DataObject::factory($this->ontable);
424             $ret->get($this->onid);
425             return $ret;
426         }
427         
428         
429         $this->ontable = $obj->tableName();
430         $this->onid = $obj->id; /// assumes our nice standard of using ids..
431         return $obj;
432     }
433     
434      
435     function toRooArray($req = array()) {
436       //  echo '<PRE>';print_r($req);exit;
437         $ret= $this->toArray();
438       
439         static $ff = false;
440         if (!$ff) {
441             $ff = HTML_FlexyFramework::get();
442         }
443         
444         $ret['public_baseURL'] = isset($ff->Pman_Images['public_baseURL']) ?
445                     $ff->Pman_Images['public_baseURL'] : $ff->baseURL;
446         
447         if (!empty($req['query']['imagesize'])) {
448              $baseURL = isset($req['query']['imageBaseURL']) ? $req['query']['imageBaseURL'] : false;
449             
450             $ret['url'] = $this->URL(-1, '/Images/Download',$baseURL);
451             
452             $ret['url_view'] = $this->URL(-1, '/Images',$baseURL);    
453             
454             if (!empty($req['query']['imagesize'])) {
455                 $ret['url_thumb'] = $this->URL($req['query']['imagesize'], '/Images/Thumb',$baseURL);
456             }
457         }
458         
459          
460          
461         return $ret;
462     }
463     
464     /**
465      * URL - create  a url for the image.
466      * size - use -1 to show full size.
467      * provier = baseURL + /Images/Thumb ... use '/Images/' for full
468      * 
469      * 
470      */
471     function URL($size , $provider = '/Images/Thumb', $baseURL=false)
472     {
473         if (!$this->id) {
474             return 'about:blank';
475             
476         }
477
478         $ff = HTML_FlexyFramework::get();
479         $baseURL = $baseURL ? $baseURL : $ff->baseURL ;
480         if (preg_match('#^http[s]*://#', $provider)) {
481             $baseURL = '';
482         }
483        
484         if ($size < 0) {
485             $provider = preg_replace('#/Thumb$#', '', $provider);
486             
487             return $baseURL . $provider . "/{$this->id}/{$this->filename}";
488         }
489         //-- max?
490         //$size = max(100, (int) $size);
491         //$size = min(1024, (int) $size);
492         // the size should 200x150 to convert
493         $sizear = preg_split('/(x|c)/', $size);
494         if(empty($sizear[1])){
495             $sizear[1] = 0;
496         }
497         $size = implode(strpos($size,'c') > -1 ? 'c' : 'x', $sizear);
498 //        print_r($size);
499         $fc = $this->toFileConvert();
500 //        print_r($size);
501 //        exit;
502         $fc->convert($this->mimetype, $size);
503         
504         
505         return $baseURL . $provider . "/$size/{$this->id}/{$this->filename}";
506     }
507     /**
508      * size could be 123x345
509      * 
510      * 
511      */
512     function toHTML($size, $provider = '/Images/Thumb') 
513     {
514         
515         
516         
517         $sz = explode('x', $size);
518         $sx = $sz[0];
519         //var_dump($sz);
520         if (!$this->id || empty($this->width)) {
521             $this->height = $sx;
522             $this->width = empty($sz[1]) ? $sx : $sz[1];
523             $sy = $this->width ;
524         }
525         if (empty($sz[1])) {
526             $ratio =  empty($this->width) ? 1 : $this->height/ ($this->width *1.0);
527             $sy = $ratio * $sx;
528         } else {
529             $sy = $sz[1];
530         }
531         // create it?
532         $extra = '';
533         if (strlen($this->title)) {
534             $extra = ' title="'. htmlspecialchars($this->title) . '"';
535         }
536         
537         return '<img src="' . $this->URL($size, $provider) . '"' .
538                 $extra .
539                 ' width="'. $sx . '"' .
540                 ' height="'. $sy . '">';
541         
542         
543     }
544     
545     /**
546      * 
547      * #2142 [new] CMS - image link urls
548      * 
549      * 
550      * 
551      */
552     function toLinkHTML($size, $provider = '/Images/Thumb')
553     {
554         if(empty($this->linkurl)){
555             return $this->toHTML($size, $provider = '/Images/Thumb');
556         }
557         
558         return '<a href="'.$this->linkurl.'" target="_blank">'.$this->toHTML($size, $provider = '/Images/Thumb').'</a>';
559         
560     }
561     
562     
563     /**
564      * to Fileconvert object..
565      *
566      *
567      *
568      */
569     function toFileConvert()
570     {
571         require_once 'File/Convert.php';
572         $fc = new File_Convert($this->getStoreName(), $this->mimetype);
573         return $fc;
574         
575     }
576     
577     function fileExt()
578     {
579         require_once 'File/MimeType.php';
580         
581         $y = new File_MimeType();
582         return  $y->toExt($this->mimetype);
583         
584         
585     }
586     
587     /**
588      *
589      *
590      *
591      */
592     
593     
594     function setFromRoo($ar, $roo)
595     {
596         // not sure why we do this.. 
597         
598         // if imgtype starts with '-' ? then we set the 'old' (probably to delete later)
599         if (!empty($ar['imgtype']) && !empty($ar['ontable']) && !empty($ar['onid']) && ($ar['imgtype'][0] == '-')) {
600             $this->setFrom($ar);
601             $this->limit(1);
602             if ($this->find(true)) {
603                 $roo->old = clone($this);
604             }
605         }   
606             
607         
608         if (!empty($ar['_copy_from'])) {
609             
610             if (!$this->checkPerm( 'A' , $roo->authUser))  {
611                 $roo->jerr("IMAGE UPLOAD PERMISSION DENIED");
612             }
613             
614             $copy = DB_DataObject::factory('Images');
615             $copy->get($ar['_copy_from']);
616             $this->setFrom($copy->toArray());
617             $this->setFrom($ar);
618             $this->createFrom($copy->getStoreName());
619             
620             $roo->addEvent("ADD", $this, $this->toEventString());
621             
622             $r = DB_DataObject::factory($this->tableName());
623             $r->id = $this->id;
624             $roo->loadMap($r);
625             $r->limit(1);
626             $r->find(true);
627             $roo->jok($r->toArray());
628             
629             
630         }
631         
632          
633         
634         // FIXME - we should be checking perms here...
635        
636         // this should be doign update
637         $this->setFrom($ar);
638          
639         if (!$this->checkPerm($this->id ? 'A' : 'E', $roo->authUser))  {
640             $roo->jerr("IMAGE UPLOAD PERMISSION DENIED");
641         }
642         
643         
644         
645         if (!isset($_FILES['imageUpload'])) {
646             return; // standard update...
647         }
648         
649         
650 //        print_r(!$this->onUpload($this));
651         
652         if ( !$this->onUpload($this)) { 
653             $roo->jerr("File upload failed : ". (!empty($this->err) ? $this->err : ''));
654         }
655         
656         $roo->addEvent("ADD", $this, $this->toEventString());
657         
658         $r = DB_DataObject::factory($this->tableName());
659         $r->id = $this->id;
660         $roo->loadMap($r);
661         $r->limit(1);
662         $r->find(true);
663         $roo->jok($r->toArray());
664          
665     }
666     
667     function toEventString()
668     {
669         
670         //$p = DB_DataObject::factory($this->ontable);
671         //if (!is_$p) {
672         //    return "ERROR unknown table? {$this->ontable}";
673        // }
674         //$p->get($p->onid);
675         
676         return $this->filename .' - on ' . $this->ontable . ':' . $this->onid;
677         //$p->toEventString();
678     }
679     
680  }