source: spip-zone/_core_/plugins/medias/formulaires/joindre_document.php @ 45407

Last change on this file since 45407 was 45407, checked in by cedric@…, 10 years ago

quand on arrive pas a inserer un document en base de donnees, il est de bon ton de le dire plutot que de faire croire que tout s'est bien passe ...

File size: 10.6 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15function joindre_determiner_mode($mode,$id_document,$objet){
16        if ($mode=='auto'){
17                if (intval($id_document))
18                        $mode = sql_getfetsel('mode','spip_documents','id_document='.intval($id_document));
19                if (!in_array($mode,array('choix','document','image'))){
20                        $mode='choix';
21                        if ($objet AND $GLOBALS['meta']["documents_$objet"]=='non')
22                                $mode = 'image';
23                }
24        }
25        return $mode;
26}
27
28function formulaires_joindre_document_charger_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){
29        $valeurs = array();
30        $mode = joindre_determiner_mode($mode,$id_document,$objet);
31       
32        $valeurs['id'] = $id_document;
33        $valeurs['mode'] = $mode;
34       
35        $valeurs['url'] = 'http://';
36        $valeurs['fichier_upload'] = '';
37       
38        $valeurs['_options_upload_ftp'] = '';
39        $valeurs['_dir_upload_ftp'] = '';
40       
41        $valeurs['joindre_upload']=''; 
42        $valeurs['joindre_distant']=''; 
43        $valeurs['joindre_ftp']='';
44        $valeurs['joindre_mediatheque']='';
45
46        $valeurs['editable'] = ' ';
47        if (intval($id_document)){
48                $valeurs['editable'] = autoriser('modifier','document',$id_document)?' ':'';
49        }
50       
51        $valeurs['proposer_media'] = is_string($proposer_media) ? (preg_match('/^(false|non|no)$/i', $proposer_media) ? false : true) : $proposer_media;
52        $valeurs['proposer_ftp'] = is_string($proposer_ftp) ? (preg_match('/^(false|non|no)$/i', $proposer_ftp) ? false : true) : $proposer_ftp;
53       
54        # regarder si un choix d'upload FTP est vraiment possible
55        if (
56         $valeurs['proposer_ftp']
57         AND test_espace_prive() # ??
58         AND ($mode == 'document' OR $mode == 'choix') # si c'est pour un document
59         //AND !$vignette_de_doc                # pas pour une vignette (NB: la ligne precedente suffit, mais si on la supprime il faut conserver ce test-ci)
60         AND $GLOBALS['flag_upload']
61         ) {
62                include_spip('inc/documents');
63                if ($dir = determine_upload('documents')) {
64                        // quels sont les docs accessibles en ftp ?
65                        $valeurs['_options_upload_ftp'] = joindre_options_upload_ftp($dir, $mode);
66                        // s'il n'y en a pas, on affiche un message d'aide
67                        // en mode document, mais pas en mode image
68                        if ($valeurs['_options_upload_ftp'] OR ($mode == 'document' OR $mode=='choix'))
69                                $valeurs['_dir_upload_ftp'] = "<b>".joli_repertoire($dir)."</b>";
70                }
71        }
72        // On ne propose le FTP que si on a des choses a afficher
73        $valeurs['proposer_ftp'] = ($valeurs['_options_upload_ftp'] or $valeurs['_dir_upload_ftp']);
74       
75        if ($galerie){
76                # passer optionnellement une galerie jointe au form
77                # plus utilise nativement, on prefere la mise a jour
78                # apres upload par ajaxReload('documents')
79                $valeurs['_galerie'] = $galerie;
80        }
81        if ($objet AND $id_objet){
82                $valeurs['id_objet'] = $id_objet;
83                $valeurs['objet'] = $objet;
84                $valeurs['refdoc_joindre'] = '';
85                if ($valeurs['editable']){
86                        include_spip('inc/autoriser');
87                        $valeurs['editable'] = autoriser('modifier',$objet,$id_objet)?' ':'';
88                }
89        }
90       
91        return $valeurs;
92}
93
94
95function formulaires_joindre_document_verifier_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){
96        include_spip('inc/joindre_document');
97       
98        $erreurs = array();
99        // on joint un document deja dans le site
100        if (_request('joindre_mediatheque')){
101    $refdoc_joindre = intval(preg_replace(',^(doc|document|img),','',_request('refdoc_joindre')));
102                if (!sql_getfetsel('id_document','spip_documents','id_document='.intval($refdoc_joindre)))
103                        $erreurs['message_erreur'] = _T('medias:erreur_aucun_document');
104        }
105        // sinon c'est un upload
106        else {
107                $files = joindre_trouver_fichier_envoye();
108                if (is_string($files)){
109                        $erreurs['message_erreur'] = $files;
110                }
111                elseif(is_array($files)){
112                        // erreur si on a pas trouve de fichier
113                        if (!count($files))
114                                $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
115
116                        else{
117                                // regarder si on a eu une erreur sur l'upload d'un fichier
118                                foreach($files as $file){
119                                        if (isset($file['error'])
120                                                AND $test = joindre_upload_error($file['error'])){
121                                                        if (is_string($test))
122                                                                $erreurs['message_erreur'] = $test;
123                                                        else
124                                                                $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
125                                        }
126                                }
127
128                                // si ce n'est pas deja un post de zip confirme
129                                // regarder si il faut lister le contenu du zip et le presenter
130                                if (!count($erreurs)
131                                 AND !_request('joindre_zip')
132                                 AND $contenu_zip = joindre_verifier_zip($files)){
133                                        list($fichiers,$erreurs,$tmp_zip) = $contenu_zip;
134                                        $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$tmp_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));
135                                }
136                        }
137                }
138
139                if (count($erreurs) AND defined('_tmp_dir'))
140                        effacer_repertoire_temporaire(_tmp_dir);
141        }
142       
143        return $erreurs;
144}
145
146
147function formulaires_joindre_document_traiter_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){
148        $res = array('editable'=>true);
149        $ancre = '';
150        // on joint un document deja dans le site
151        if (_request('joindre_mediatheque')){
152                if ($refdoc_joindre = intval(preg_replace(',^(doc|document|img),','',_request('refdoc_joindre')))){
153                        // lier le parent en plus
154                        $champs = array('ajout_parents' => array("$objet|$id_objet"));
155                        include_spip('action/editer_document');
156                        document_set($refdoc_joindre,$champs);
157                        set_request('refdoc_joindre',''); // vider la saisie
158                        $ancre = $refdoc_joindre;
159                        $sel[] = $refdoc_joindre;
160                        $res['message_ok'] = _T('medias:document_attache_succes');
161                }
162        }
163        // sinon c'est un upload
164        else {
165                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
166
167                $mode = joindre_determiner_mode($mode,$id_document,$objet);
168                include_spip('inc/joindre_document');
169                $files = joindre_trouver_fichier_envoye();
170
171                $nouveaux_doc = $ajouter_documents($id_document,$files,$objet,$id_objet,$mode);
172
173                if (defined('_tmp_dir'))
174                        effacer_repertoire_temporaire(_tmp_dir);
175
176                // checker les erreurs eventuelles
177                $messages_erreur = array();
178                $nb_docs = 0;
179                $sel = array();
180                foreach ($nouveaux_doc as $doc) {
181                        if (!is_numeric($doc))
182                                $messages_erreur[] = $doc;
183                        // cas qui devrait etre traite en amont
184                        elseif(!$doc){
185                                $messages_erreur[] = _T('medias:erreur_insertion_document_base',array('fichier'=>'<em>???</em>'));
186                        }
187                        else{
188                                if (!$ancre)
189                                        $ancre = $doc;
190                                $sel[] = $doc;
191                                $nb_docs++;
192                        }
193                }
194                if (count($messages_erreur))
195                        $res['message_erreur'] = implode('<br />',$messages_erreur);
196                if ($nb_docs){
197                        $res['message_ok'] = singulier_ou_pluriel($nb_docs,'medias:document_installe_succes','medias:nb_documents_installe_succes').$js;
198                }
199                if ($ancre)
200                        $res['redirect'] = "#doc$ancre";
201        }
202        if (isset($res['message_ok'])){
203                $callback = "";
204                if ($ancre)
205                        $callback .= "jQuery('#doc$ancre a.editbox').eq(0).focus();";
206                if (count($sel)){
207                        $sel = "#doc".implode(",#doc",$sel);
208                  $callback .= "jQuery('$sel').animateAppend();";
209                }
210                $js = "if (window.jQuery) jQuery(function(){ajaxReload('documents',{callback:function(){ $callback }});});";
211                $js = "<script type='text/javascript'>$js</script>";
212          $res['message_ok'] .= $js;
213        }
214
215        return $res;
216}
217
218
219
220/**
221 * Retourner le contenu du select HTML d'utilisation de fichiers envoyes
222 *
223 * @param string $dir
224 * @param string $mode
225 * @return string
226 */
227function joindre_options_upload_ftp($dir, $mode = 'document') {
228        $fichiers = preg_files($dir);
229        $exts = array();
230        $dirs = array(); 
231        $texte_upload = array();
232
233        // en mode "charger une image", ne proposer que les inclus
234        $inclus = ($mode == 'document' OR $mode =='choix')
235                ? ''
236                : " AND inclus='image'";
237
238        foreach ($fichiers as $f) {
239                $f = preg_replace(",^$dir,",'',$f);
240                if (preg_match(",\.([^.]+)$,", $f, $match)) {
241                        $ext = strtolower($match[1]);
242                        if (!isset($exts[$ext])) {
243                                include_spip('action/ajouter_documents');
244                                $ext = corriger_extension($ext);
245                                if (sql_fetsel('extension', 'spip_types_documents', $a = "extension='$ext'" . $inclus))
246                                        $exts[$ext] = 'oui';
247                                else $exts[$ext] = 'non';
248                        }
249
250                        $k = 2*substr_count($f,'/');
251                        $n = strrpos($f, "/");
252                        if ($n === false)
253                          $lefichier = $f;
254                        else {
255                          $lefichier = substr($f, $n+1, strlen($f));
256                          $ledossier = substr($f, 0, $n);
257                          if (!in_array($ledossier, $dirs)) {
258                                $texte_upload[] = "\n<option value=\"$ledossier\">"
259                                . str_repeat("&nbsp;",$k)
260                                ._T('tout_dossier_upload', array('upload' => $ledossier))
261                                ."</option>";
262                                $dirs[]= $ledossier;
263                          }
264                        }
265
266                        if ($exts[$ext] == 'oui')
267                          $texte_upload[] = "\n<option value=\"$f\">" .
268                            str_repeat("&nbsp;",$k+2) .
269                            $lefichier .
270                            "</option>";
271                }
272        }
273
274        $texte = join('', $texte_upload);
275        if (count($texte_upload)>1) {
276                $texte = "\n<option value=\"/\" style='font-weight: bold;'>"
277                                ._T('info_installer_tous_documents')
278                                ."</option>" . $texte;
279        }
280
281        return $texte;
282}
283
284
285/**
286 * Lister les fichiers contenus dans un zip
287 *
288 * @param unknown_type $files
289 * @return unknown
290 */
291function joindre_liste_contenu_tailles_archive($files) {
292        include_spip('inc/charsets'); # pour le nom de fichier
293
294        $res = '';
295        if (is_array($files))
296                foreach ($files as $nom => $file) {
297                        $nom = translitteration($nom);
298                        $date = date_interface(date("Y-m-d H:i:s", $file['mtime']));
299       
300                        $taille = taille_en_octets($file['size']);
301                        $res .= "<li title=\"".attribut_html($title)."\"><b>$nom</b> &ndash; $taille<br />&nbsp; $date</li>\n";
302                }
303       
304        return $res;
305}
306
307
308function joindre_liste_erreurs_to_li($erreurs){
309        $res = implode("</li><li>",$erreurs);
310        if (strlen($res)) $res = "<li>$res</li>";
311        if (count($erreurs)>4){
312                $res = "<li><span style='cursor:pointer;' onclick='jQuery(this).siblings(\"ul\").toggle();return false;'>"._T("medias:erreurs_voir",array('nb'=>count($erreurs)))."</span><ul style='display:none;'>".$res."</ul></li>";
313        }
314        return $res;
315}
316
317?>
Note: See TracBrowser for help on using the repository browser.