joindre_document.php 12 KB

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