source: pmb4.1/trunk/fuentes/pmb/classes/cms/cms_document.class.php

Last change on this file was 478, checked in by mabarracus, 4 years ago

copy trusty code 4.1

  • Property svn:executable set to *
File size: 19.3 KB
Line 
1<?php
2// +-------------------------------------------------+
3// | 2002-2011 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: cms_document.class.php,v 1.3.2.2 2014-11-18 14:25:55 arenou Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once($include_path."/explnum.inc.php");
10require_once($class_path."/storages/storages.class.php");
11create_tableau_mimetype();
12
13class cms_document {
14        public $id=0;
15        public $title="";
16        public $description="";
17        public $filename="";
18        public $mimetype="";
19        public $filesize="";
20        public $vignette="";
21        public $url="";
22        public $path ="";
23        public $create_date="";
24        public $num_storage=0;
25        public $type_object="";
26        public $num_object=0;
27        protected $human_size = 0;
28        protected $storage;
29        public $used=array();
30       
31        public function __construct($id=0){
32                $this->id = $id*1;
33                $this->fetch_datas_cache();
34        }
35       
36        protected function fetch_datas_cache(){
37                if($tmp=cms_cache::get_at_cms_cache($this)){
38                        $this->restore($tmp);
39                }else{
40                        $this->fetch_datas();
41                        cms_cache::set_at_cms_cache($this);
42                }
43        }
44       
45        protected function restore($cms_object){
46                foreach(get_object_vars($cms_object) as $propertieName=>$propertieValue){
47                        $this->{$propertieName}=$propertieValue;
48                }
49        }
50       
51        protected function fetch_datas(){
52                if($this->id){
53                        $query = "select document_title,document_description,document_filename,document_mimetype,document_filesize,document_vignette,document_url,document_path,document_create_date,document_num_storage,document_type_object,document_num_object from cms_documents where id_document = ".$this->id;
54                        $result = mysql_query($query);
55                        if(mysql_num_rows($result)){
56                                $row = mysql_fetch_object($result);
57                                $this->title = $row->document_title;
58                                $this->description = $row->document_description;
59                                $this->filename = $row->document_filename;
60                                $this->mimetype = $row->document_mimetype;
61                                $this->filesize = $row->document_filesize;
62                                $this->vignette = $row->document_vignette;
63                                $this->url = $row->document_url;
64                                $this->path = $row->document_path;
65                                $this->create_date = $row->document_create_date;
66                                $this->num_storage = $row->document_num_storage;
67                                $this->type_object = $row->document_type_object;
68                                $this->num_object = $row->document_num_object;
69                        }
70                        if($this->num_storage){
71                                $this->storage = storages::get_storage_class($this->num_storage);
72                        }
73                       
74                        //récupération des utilisations
75                        $query = "select * from cms_documents_links where document_link_num_document = ".$this->id;
76                        $result = mysql_query($query);
77                        if(mysql_num_rows($result)){
78                                while($row=mysql_fetch_object($result)){
79                                        if(!$this->used[$row->document_link_type_object]) $this->used[$row->document_link_type_object] = array();
80                                        $this->used[$row->document_link_type_object][] = $row->document_link_num_object;
81                                }
82                        }
83                }
84        }
85       
86        public function get_item_render($edit_js_function="openEditDialog"){
87                global $msg,$charset;
88                $item = "
89                <div class='document_item' id='document_".$this->id."'>
90                        <div class='document_item_content'>
91                        <img src='".$this->get_vignette_url()."'/>
92                        <br/>
93                        <p> <a href='#' onclick='".$edit_js_function."(".$this->id.");return false;' title='".htmlentities($msg['cms_document_edit_link'])."'>".htmlentities(($this->title ? $this->title : $this->filename),ENT_QUOTES,$charset)."</a><br />
94                        <span style='font-size:.8em;'>".htmlentities($this->mimetype,ENT_QUOTES,$charset).($this->filesize ? " - (".$this->get_human_size().")" : "")."</span></p>
95                        </div>
96                </div>";
97                return $item;
98        }
99       
100        public function get_item_form($selected = false,$edit_js_function="openEditDialog"){
101                global $msg,$charset;
102                $item = "
103                <div class='document_item".($selected? " document_item_selected" : "")."' id='document_".$this->id."'>
104                        <div class='document_item_content'>
105                                <img src='".$this->get_vignette_url()."'/>
106                                <br/>
107                                <p> <a href='#' onclick='".$edit_js_function."(".$this->id.");return false;' title='".htmlentities($msg['cms_document_edit_link'])."'>".htmlentities(($this->title ? $this->title : $this->filename),ENT_QUOTES,$charset)."</a><br />
108                                <span style='font-size:.8em;'>".htmlentities($this->mimetype,ENT_QUOTES,$charset).($this->filesize ? " - (".$this->get_human_size().")" : "")."</span></p>
109                        </div>
110                        <div class='document_checkbox'>
111                                <input name='cms_documents_linked[]' onchange='document_change_background(".$this->id.");' type='checkbox'".($selected ? "checked='checked'" : "")." value='".htmlentities($this->id,ENT_QUOTES,$charset)."'/>
112                        </div>
113                </div>";
114                return $item;
115        }
116       
117        public function get_vignette_url(){
118                global $opac_url_base;
119                return "./ajax.php?module=cms&categ=document&action=thumbnail&id=".$this->id;
120        }
121               
122        public function get_document_url(){
123                global $opac_url_base;
124                return "./ajax.php?module=cms&categ=document&action=render&id=".$this->id;
125        }
126                       
127        public function get_human_size(){
128                $units = array("o","Ko","Mo","Go");
129                $i=0;
130                do{
131                        if(!$this->human_size)$this->human_size = $this->filesize;
132                        $this->human_size = $this->human_size/1024;     
133                        $i++;
134                }while($this->human_size >= 1024);
135                return round($this->human_size,1)." ".$units[$i];
136        }
137       
138        public function get_form($action="./ajax.php?module=cms&categ=documents&action=save_form&id="){
139                global $msg,$charset;
140                $form = "
141                <form name='cms_document_form' id='cms_document_form' method='POST' action='".$action.$this->id."' style='width:500px;'>
142                        <div class='form-contenu'>
143                                <div class='row'>
144                                        <div class='colonne3'>
145                                                <label for='cms_document_title'>".htmlentities($msg['cms_document_title'],ENT_QUOTES,$charset)."</label>
146                                        </div>
147                                        <div class='colonne_suite'>
148                                                <input type='text' name='cms_document_title' value='".htmlentities($this->title,ENT_QUOTES,$charset)."'/>
149                                        </div>
150                                </div>
151                                <div class='row'>
152                                        <div class='colonne3'>
153                                                <label for='cms_document_description'>".htmlentities($msg['cms_document_description'],ENT_QUOTES,$charset)."</label>
154                                        </div>
155                                        <div class='colonne_suite'>
156                                                <textarea name='cms_document_description' >".htmlentities($this->description,ENT_QUOTES,$charset)."</textarea>
157                                        </div>
158                                </div>";
159                if($this->url){
160                        $form.= "
161                                <div class='row'>
162                                        <div class='colonne3'>
163                                                <label for='cms_document_url'>".htmlentities($msg['cms_document_url'],ENT_QUOTES,$charset)."</label>
164                                        </div>
165                                        <div class='colonne_suite'>
166                                                <input type='text' name='cms_document_url' value='".htmlentities($this->url,ENT_QUOTES,$charset)."'/>
167                                        </div>
168                                </div>";
169                }
170                if($this->id){ 
171                        $form.= "
172                                <div class='row'>
173                                        <div class='colonne3'>
174                                                <label for='cms_document_vign'>".htmlentities($msg['cms_document_vign'],ENT_QUOTES,$charset)."</label>
175                                        </div>
176                                        <div class='colonne_suite'>
177                                                <input type='checkbox' name='cms_document_vign' value='1'/>
178                                        </div>
179                                </div>";
180                }
181                $form.="
182                                <div class='row'>&nbsp;</div>
183                                <div class='row'>
184                                        <div class='colonne3'>
185                                                <label>".htmlentities($msg['cms_document_filename'],ENT_QUOTES,$charset)."</label>
186                                                <br />
187                                                <label>".htmlentities($msg['cms_document_mimetype'],ENT_QUOTES,$charset)."</label>
188                                                <br />
189                                                <label>".htmlentities($msg['cms_document_filesize'],ENT_QUOTES,$charset)."</label>
190                                                <br />
191                                                <label>".htmlentities($msg['cms_document_date'],ENT_QUOTES,$charset)."</label>
192                                        </div>
193                                        <div class='colonne_suite'>
194                                                <span>".htmlentities($this->filename,ENT_QUOTES,$charset)."</span>
195                                                <br />
196                                                <span>".htmlentities($this->mimetype,ENT_QUOTES,$charset)."</span>
197                                                <br />
198                                                <span>".htmlentities($this->get_human_size(),ENT_QUOTES,$charset)."</span>
199                                                <br />
200                                                <span>".htmlentities(format_date($this->create_date),ENT_QUOTES,$charset)."</span>
201                                        </div>
202                                </div>
203                                <div class='row'>
204                                        <div class='colonne3'>
205                                                <label>".htmlentities($msg['cms_document_storage'],ENT_QUOTES,$charset)."</label>
206                                        </div>
207                                        <div class='colonne_suite'>
208                                                ".$this->storage->get_storage_infos()."
209                                        </div>
210                                </div>
211                                <div class='row'>&nbsp;</div>
212                                <div class='row'>";
213                //utilisation
214                if(count($this->used)){
215                        $form.="
216                                        <label>".htmlentities($msg['cms_document_use'],ENT_QUOTES,$charset)."</label>
217                                        <table>
218                                                <tr>
219                                                        <th></th>
220                                                        <th>".htmlentities($msg['cms_document_used_type'],ENT_QUOTES,$charset)."</th>
221                                                        <th>".htmlentities($msg['cms_document_used_title'],ENT_QUOTES,$charset)."</th>
222                                                </tr>";
223                        foreach($this->used as $type => $used){
224                                $query ="";
225                                switch($type){
226                                        case "article" :
227                                                $query = "select id_article as id ,article_title as title from cms_articles where id_article in (".implode(",",$used).") order by 2";
228                                                $use_link = "./cms.php?categ=article&sub=edit&id=";
229                                                break;
230                                        case "section" :
231                                                $query = "select id_section as id,section_title as title from cms_sections where id_section in (".implode(",",$used).") order by 2";
232                                                $use_link = "./cms.php?categ=section&sub=edit&id=";
233                                                break;
234                                }
235                                if($query){
236                                        $result = mysql_query($query);
237                                        if(mysql_num_rows($result)){
238                                                while($row = mysql_fetch_object($result)){
239                                                        $form.="
240                                                <tr>
241                                                        <td><input type='checkbox' value='article_".$row->id."' name='used[]'/></td>
242                                                        <td>".htmlentities($msg['cms_document_used_type_'.$type],ENT_QUOTES,$charset)."</td>
243                                                        <td><a target='_blank' href='".$use_link.$row->id."' >".htmlentities($row->title,ENT_QUOTES,$charset)."</a></td>
244                                                </tr>";
245                                                }
246                                        }
247                                }
248                        }
249                        $form.="
250                                        </table>";
251                }else{
252                        $form.="
253                                        <label>".htmlentities($msg['cms_document_not_use'],ENT_QUOTES,$charset)."</label>";
254                }
255                $form.="
256                                </div>
257                                <hr />
258                                <div class='row'>
259                                        <div class='left'>
260                                                <input type='submit' class='bouton'  value='".htmlentities($msg['cms_document_save'],ENT_QUOTES,$charset)."'/>
261                                        </div>
262                                        <div class='right'>
263                                                <input type='button' class='bouton' id='use_del_button' value='".htmlentities($msg['cms_document_delete_use'],ENT_QUOTES,$charset)."'/>
264                                                <input type='button' class='bouton' id='doc_del_button' value='".htmlentities($msg['cms_document_delete'],ENT_QUOTES,$charset)."'/>
265                                        </div>
266                                </div>
267                                <div class='row'></div>
268                        </div>
269                </form>
270                <script>
271                        require(['dojo/dom-construct'],function(domConstruct){
272                                var form = dojo.byId('cms_document_form');
273                                dojo.connect(form, 'onsubmit', function(event){
274                                        dojo.stopEvent(event);
275                                        var xhrArgs = {
276                                                form: dojo.byId('cms_document_form'),
277                                                handleAs: 'text',
278                                                load: function(data){
279                                                        domConstruct.place(data,'document_".$this->id."','replace');
280                                                        dijit.byId('dialog_document').hide();
281                                                }
282                                        };
283                                        var deferred = dojo.xhrPost(xhrArgs);
284                                });     
285                                dojo.connect(dojo.byId('doc_del_button'),'onclick',function(event){
286                                        if(confirm('".addslashes($msg['cms_document_confirm_delete'])."')){
287                                                var xhrArgs = {
288                                                        url : '".str_replace("action=save_form","action=delete",$action).$this->id."',
289                                                        handleAs: 'text',
290                                                        load: function(data){
291                                                                if(data == 1){
292                                                                        dojo.byId('document_".$this->id."').parentNode.removeChild(dojo.byId('document_".$this->id."'));
293                                                                }else{
294                                                                        alert(data);
295                                                                }
296                                                                dijit.byId('dialog_document').hide();
297                                                        }
298                                                };
299                                                dojo.xhrGet(xhrArgs);
300                                        }
301                                });
302                                dojo.connect(dojo.byId('use_del_button'),'onclick',function(event){
303                                        if(confirm('".addslashes($msg['cms_document_confirm_use_delete'])."')){
304                                                var xhrArgs = {
305                                                        url : '".str_replace("action=save_form","action=delete_use",$action).$this->id."',
306                                                        handleAs: 'text',
307                                                        form : dojo.byId('cms_document_form'),
308                                                        load: function(data){
309                                                                if(data == 1){
310                                                                        dijit.byId('dialog_document').hide();
311                                                                        window.setTimeout(function(){openEditDialog('".$this->id."')},1000);
312                                                                       
313                                                                }else{
314                                                                        alert(data);
315                                                                }
316                                                                dijit.byId('dialog_document').hide();
317                                                        }
318                                                };
319                                                dojo.xhrPost(xhrArgs);
320                                        }
321                                });
322                        });
323                </script>";
324                return $form;
325        }
326       
327        function save_form($caller="collection"){
328                global $msg,$charset;
329                global $cms_document_title,$cms_document_description,$cms_document_url,$cms_document_vign;
330               
331                $this->title = $cms_document_title;
332                $this->description = $cms_document_description;
333                $this->url = $cms_document_url;
334               
335                if($cms_document_vign){
336                        $this->calculate_vignette();
337                }
338
339                if($this->id){
340                        $query = "update cms_documents set ";
341                        $clause = " where id_document = ".$this->id;
342                }else{
343                        $query = "insert into cms_documents set ";
344                        $clause="";
345                }
346               
347                $query.= "
348                        document_title = '".addslashes($this->title)."',
349                        document_description = '".addslashes($this->description)."',
350                        document_url = '".addslashes($this->url)."'";
351                if($cms_document_vign){
352                        $query.= ",
353                        document_vignette = '".addslashes($this->vignette)."'"; 
354                }
355                if(mysql_query($query.$clause)){
356                        if($caller = "editorial_form"){
357                                return $this->get_item_form(true,"openEditDialog");
358                        }else{
359                                return $this->get_item_render("openEditDialog");
360                        }
361                }
362        }
363       
364        function delete(){
365                global $msg;
366       
367                //vérification d'utilisation
368                $query = "select * from cms_documents_links where document_link_num_document = ".$this->id;
369                $result = mysql_query($query);
370                if(!mysql_num_rows($result)){
371                        //suppression physique
372                        if($this->storage->delete($this->path.$this->filename)){
373                                //il ne reste plus que la base
374                                if(mysql_query("delete from cms_documents where id_document = ".$this->id)){
375                                        return true;
376                                }
377                        }else{
378                                return $msg['cms_document_delete_physical_error'];
379                        }
380                }else{
381                        return $msg['cms_document_delete_document_used'];
382                }
383                return false;
384        }
385       
386        function calculate_vignette(){
387                error_reporting(null);
388                global $base_path,$include_path,$class_path;
389                $path = $this->get_document_in_tmp();
390                if($path){
391                        switch($this->mimetype){
392                                case "application/bnf+zip" :
393                                        require_once($class_path."/docbnf_zip.class.php");
394                                        $doc = new docbnf_zip($path);
395                                        $this->vignette = construire_vignette($doc->getCover());
396                                        break;
397                                case "application/epub+zip" :
398                                        require_once($class_path."/epubData.class.php");
399                                        $doc = new epubData($path);
400                                        file_put_contents($path, $doc->getCoverContent());
401                                        $this->vignette = construire_vignette($path);
402                                        break;
403                                default :
404                                        $this->vignette = construire_vignette($path);
405                                        break;
406                        }
407                        unlink($path);
408                }
409        }
410       
411        function regen_vign(){
412                $this->calculate_vignette();
413                mysql_query("update cms_documents set document_vignette = '".addslashes($this->vignette)."' where id_document = ".$this->id);
414        }
415       
416        function get_document_in_tmp(){
417                $this->clean_tmp();
418                global $base_path;
419                $path = tempnam($base_path."/temp/", "cms_document_");
420                if($this->storage->duplicate($this->path.$this->filename,$path)){
421                        return $path;
422                }
423                return false;
424        }
425       
426        protected function clean_tmp(){
427                global $base_path;
428                $dh = opendir($base_path."/temp/");
429                if (!$dh) return;
430                $files = array();
431                while (($file = readdir($dh)) !== false){
432                        if ($file != "." && $file != ".." && substr($file,0,strlen("cms_document_")) == "cms_document_") {
433                                $stat = stat($base_path."/temp/".$file);
434                                $files[$file] = array("mtime"=>$stat['mtime']);
435                        }
436                }
437                closedir($dh);
438                $deleteList = array();
439                foreach ($files as $file => $stat) {
440                        //si le dernier accès au fichier est de plus de 3h, on vide...
441                        if(time() - $stat["mtime"] > (3600*3)){
442                                if(is_dir($base_path."/temp/".$file)){
443                                        $this->rrmdir($base_path."/temp/".$file);
444                                }else{
445                                        unlink($base_path."/temp/".$file);
446                                }
447                        }
448                }
449        }
450       
451        function rrmdir($dir){
452                if (is_dir($dir)) {
453                        $objects = scandir($dir);
454                        foreach ($objects as $object) {
455                                if ($object != "." && $object != "..") {
456                                        if (filetype($dir."/".$object) == "dir"){
457                                                $this->rrmdir($dir."/".$object);
458                                        }else{
459                                                unlink($dir."/".$object);
460                                        }
461                                }
462                        }
463                        reset($objects);
464                        rmdir($dir);
465                }
466        }
467       
468        public function format_datas(){
469                $collection = new cms_collection($this->num_object);
470               
471                $datas = array(
472                        'id' => $this->id,
473                        'name' => $this->title,
474                        'description' => $this->description,
475                        'filename' => $this->filename,
476                        'mimetype' => $this->mimetype,
477                        'filesize' => array(
478                                'human' => $this->get_human_size(),
479                                'value' => $this->filesize
480                        ),
481                        'url' => $this->get_document_url(),
482                        'create_date' => $this->create_date,
483                        'thumbnails_url' => $this->get_vignette_url()
484                );
485                $datas['collection'] = $collection->get_infos();
486                return $datas;
487        }
488       
489        public function get_format_data_structure(){
490                global $msg;
491                $format_datas = array();
492                $format_datas[] = array(
493                        'var' => "id",
494                        'desc'=> $msg['cms_document_format_data_id']
495                );
496                $format_datas[] = array(
497                        'var' => "name",
498                        'desc'=> $msg['cms_document_format_data_name']
499                );     
500                $format_datas[] = array(
501                        'var' => "description",
502                        'desc'=> $msg['cms_document_format_data_description']
503                );
504                $format_datas[] = array(
505                        'var' => "filename",
506                        'desc'=> $msg['cms_document_format_data_filename']
507                );             
508                $format_datas[] = array(
509                        'var' => "mimetype",
510                        'desc'=> $msg['cms_document_format_data_mimetype']
511                );
512                $format_datas[] = array(
513                        'var' => "filesize",
514                        'desc'=> $msg['cms_document_format_data_filesize'],
515                        'children' => array(
516                                array(
517                                        'var' => "filesize.human",
518                                        'desc'=> $msg['cms_document_format_data_filesize_human']
519                                ),
520                                array(
521                                        'var' => "filesize.value",
522                                        'desc'=> $msg['cms_document_format_data_filesize_value']
523                                )
524                        )
525                );     
526                $format_datas[] = array(
527                                'var' => "url",
528                                'desc'=> $msg['cms_document_format_data_url']
529                );
530                $format_datas[] = array(
531                                'var' => "create_date",
532                                'desc'=> $msg['cms_document_format_data_create_date']
533                );
534                $format_datas[] = array(
535                                'var' => "thumbnails_url",
536                                'desc'=> $msg['cms_document_format_data_thumbnails_url']
537                );     
538                $format_datas[] = array(
539                        'var' => "collection",
540                        'desc'=> $msg['cms_document_format_data_collection'],
541                        'children' => array(
542                                array(
543                                        'var' => "collection.id",
544                                        'desc'=> $msg['cms_document_format_data_collection_id']
545                                ),
546                                array(
547                                        'var' => "collection.name",
548                                        'desc'=> $msg['cms_document_format_data_collection_name']
549                                ),
550                                array(
551                                        'var' => "collection.description",
552                                        'desc'=> $msg['cms_document_format_data_collection_description']
553                                )
554                        )
555                );
556                return $format_datas;
557        }
558       
559        public function render_thumbnail(){
560                header('Content-Type: image/png');
561                if($this->vignette){
562                        print $this->vignette; 
563                }else{
564                        global $prefix_url_image ;
565                        if ($prefix_url_image) $tmpprefix_url_image = $prefix_url_image;
566                        else $tmpprefix_url_image = "./" ;
567                        print file_get_contents($tmpprefix_url_image."images/mimetype/".icone_mimetype($this->mimetype,substr($this->filename,strrpos($this->filename,".")+1)));
568                }
569        }
570       
571        public function render_doc(){
572                $content = $this->storage->get_content($this->path.$this->filename);
573                if($content){
574                        header('Content-Type: '.$this->mimetype);
575                        header("Content-Disposition: inline; filename=".$this->filename."");
576                        if($this->filesize) header("Content-Length: ".$this->filesize);
577                        print $content;
578                }
579        }
580       
581        public function delete_use(){
582                global $used;
583               
584                $elem =array();
585                for($i=0 ; $i<count($used) ; $i++){
586                        $tmp = explode("_",$used[$i]);
587                        $elem[$tmp[0]][]=$tmp[1];
588                }
589                foreach($elem as $type=> $elem){
590                        //TODO, vérifier utilisation du document dans l'association
591                        $query = "delete from cms_documents_links where document_link_type_object = '".$type."' and document_link_num_object in (".implode(",",$elem).") and document_link_num_document = ".$this->id;
592                        $result = mysql_query($query);
593                        if(!$result) return false;
594                }
595                return true;
596               
597        }
598}
Note: See TracBrowser for help on using the repository browser.