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