--- /dev/null
+<?php\r
+\r
+/***************************************************************************\\r
+ * SPIP, Systeme de publication pour l'internet *\r
+ * *\r
+ * Copyright (c) 2001-2014 *\r
+ * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *\r
+ * *\r
+ * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *\r
+ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *\r
+\***************************************************************************/\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+function joindre_determiner_mode($mode,$id_document,$objet){\r
+ if ($mode=='auto'){\r
+ if (intval($id_document))\r
+ $mode = sql_getfetsel('mode','spip_documents','id_document='.intval($id_document));\r
+ if (!in_array($mode,array('choix','document','image'))){\r
+ $mode='choix';\r
+ if ($objet AND !in_array(table_objet_sql($objet),explode(',',$GLOBALS['meta']["documents_objets"])))\r
+ $mode = 'image';\r
+ }\r
+ }\r
+ return $mode;\r
+}\r
+\r
+function formulaires_joindre_document_charger_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){\r
+ $valeurs = array();\r
+ $mode = joindre_determiner_mode($mode,$id_document,$objet);\r
+ \r
+ $valeurs['id'] = $id_document;\r
+ $valeurs['_mode'] = $mode;\r
+ \r
+ $valeurs['url'] = 'http://';\r
+ $valeurs['fichier_upload'] = $valeurs['_options_upload_ftp'] = $valeurs['_dir_upload_ftp'] = ''; \r
+ $valeurs['joindre_upload'] = $valeurs['joindre_distant'] = $valeurs['joindre_ftp'] = $valeurs['joindre_mediatheque'] = '';\r
+\r
+ $valeurs['editable'] = ' ';\r
+ if (intval($id_document))\r
+ $valeurs['editable'] = autoriser('modifier','document',$id_document)?' ':'';\r
+ \r
+ $valeurs['proposer_media'] = is_string($proposer_media) ? (preg_match('/^(false|non|no)$/i', $proposer_media) ? false : true) : $proposer_media;\r
+ $valeurs['proposer_ftp'] = is_string($proposer_ftp) ? (preg_match('/^(false|non|no)$/i', $proposer_ftp) ? false : true) : $proposer_ftp;\r
+\r
+ # regarder si un choix d'upload FTP est vraiment possible\r
+ if (\r
+ $valeurs['proposer_ftp']\r
+ AND test_espace_prive() # ??\r
+ AND ($mode != 'image') AND ($mode != 'vignette') # si c'est pour un document\r
+ //AND !$vignette_de_doc # pas pour une vignette (NB: la ligne precedente suffit, mais si on la supprime il faut conserver ce test-ci)\r
+ AND $GLOBALS['flag_upload']\r
+ ) {\r
+ include_spip('inc/documents');\r
+ if ($dir = determine_upload('documents')) {\r
+ // quels sont les docs accessibles en ftp ?\r
+ $valeurs['_options_upload_ftp'] = joindre_options_upload_ftp($dir, $mode);\r
+ // s'il n'y en a pas, on affiche un message d'aide\r
+ // en mode document, mais pas en mode image\r
+ if ($valeurs['_options_upload_ftp'] OR ($mode == 'document' OR $mode=='choix'))\r
+ $valeurs['_dir_upload_ftp'] = "<b>".joli_repertoire($dir)."</b>";\r
+ }\r
+ }\r
+ // On ne propose le FTP que si on a des choses a afficher\r
+ $valeurs['proposer_ftp'] = ($valeurs['_options_upload_ftp'] or $valeurs['_dir_upload_ftp']);\r
+ \r
+ if ($galerie){\r
+ # passer optionnellement une galerie jointe au form\r
+ # plus utilise nativement, on prefere la mise a jour\r
+ # apres upload par ajaxReload('documents')\r
+ $valeurs['_galerie'] = $galerie;\r
+ }\r
+ if ($objet AND $id_objet){\r
+ $valeurs['id_objet'] = $id_objet;\r
+ $valeurs['objet'] = $objet;\r
+ $valeurs['refdoc_joindre'] = '';\r
+ if ($valeurs['editable']){\r
+ include_spip('inc/autoriser');\r
+ $valeurs['editable'] = autoriser('joindredocument',$objet,$id_objet)?' ':'';\r
+ }\r
+ }\r
+ \r
+ return $valeurs;\r
+}\r
+\r
+\r
+function formulaires_joindre_document_verifier_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){\r
+ include_spip('inc/joindre_document');\r
+ \r
+ $erreurs = array();\r
+ // on joint un document deja dans le site\r
+ if (_request('joindre_mediatheque')){\r
+ $refdoc_joindre = intval(preg_replace(',^(doc|document|img),','',_request('refdoc_joindre')));\r
+ if (!sql_getfetsel('id_document','spip_documents','id_document='.intval($refdoc_joindre)))\r
+ $erreurs['message_erreur'] = _T('medias:erreur_aucun_document');\r
+ }\r
+ // sinon c'est un upload\r
+ else {\r
+ $files = joindre_trouver_fichier_envoye();\r
+ if (is_string($files))\r
+ $erreurs['message_erreur'] = $files;\r
+ elseif(is_array($files)){\r
+ // erreur si on a pas trouve de fichier\r
+ if (!count($files))\r
+ $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');\r
+\r
+ else{\r
+ // regarder si on a eu une erreur sur l'upload d'un fichier\r
+ foreach($files as $file){\r
+ if (isset($file['error'])\r
+ AND $test = joindre_upload_error($file['error'])){\r
+ if (is_string($test))\r
+ $erreurs['message_erreur'] = $test;\r
+ else\r
+ $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');\r
+ }\r
+ }\r
+\r
+ // si ce n'est pas deja un post de zip confirme\r
+ // regarder si il faut lister le contenu du zip et le presenter\r
+ if (!count($erreurs)\r
+ AND !_request('joindre_zip')\r
+ AND $contenu_zip = joindre_verifier_zip($files)){\r
+ list($fichiers,$erreurs,$tmp_zip) = $contenu_zip;\r
+ if ($fichiers)\r
+ $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$tmp_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));\r
+ else\r
+ $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); \r
+ }\r
+ }\r
+ }\r
+\r
+ if (count($erreurs) AND defined('_tmp_dir'))\r
+ effacer_repertoire_temporaire(_tmp_dir);\r
+ }\r
+ \r
+ return $erreurs;\r
+}\r
+\r
+function formulaires_joindre_document_traiter_dist($id_document='new',$id_objet=0,$objet='',$mode = 'auto',$galerie = false, $proposer_media=true, $proposer_ftp=true){\r
+ $res = array('editable'=>true);\r
+ $ancre = '';\r
+ // on joint un document deja dans le site\r
+ if (_request('joindre_mediatheque')){\r
+ $refdoc_joindre = _request('refdoc_joindre');\r
+ $refdoc_joindre = strtr($refdoc_joindre,";,"," ");\r
+ $refdoc_joindre = preg_replace(',\b(doc|document|img),','',$refdoc_joindre);\r
+ // expliciter les intervales xxx-yyy\r
+ while(preg_match(",\b(\d+)-(\d+)\b,",$refdoc_joindre,$m))\r
+ $refdoc_joindre = str_replace($m[0],implode(" ",range($m[1],$m[2])),$refdoc_joindre);\r
+ $refdoc_joindre = explode(" ",$refdoc_joindre);\r
+ include_spip('action/editer_document');\r
+ foreach($refdoc_joindre as $j){\r
+ if ($j = intval(preg_replace(',^(doc|document|img),','',$j))){\r
+ // lier le parent en plus\r
+ $champs = array('ajout_parents' => array("$objet|$id_objet"));\r
+ document_modifier($j,$champs);\r
+ if (!$ancre)\r
+ $ancre = $j;\r
+ $sel[] = $j;\r
+ $res['message_ok'] = _T('medias:document_attache_succes');\r
+ }\r
+ }\r
+ if ($sel)\r
+ $res['message_ok'] = singulier_ou_pluriel(count($sel),'medias:document_attache_succes','medias:nb_documents_attache_succes');\r
+ set_request('refdoc_joindre',''); // vider la saisie\r
+ }\r
+ // sinon c'est un upload\r
+ else {\r
+ $ajouter_documents = charger_fonction('ajouter_documents', 'action');\r
+\r
+ $mode = joindre_determiner_mode($mode,$id_document,$objet);\r
+ include_spip('inc/joindre_document');\r
+ $files = joindre_trouver_fichier_envoye();\r
+\r
+ $nouveaux_doc = $ajouter_documents($id_document,$files,$objet,$id_objet,$mode);\r
+\r
+ if (defined('_tmp_zip'))\r
+ unlink(_tmp_zip);\r
+ if (defined('_tmp_dir'))\r
+ effacer_repertoire_temporaire(_tmp_dir);\r
+\r
+ // checker les erreurs eventuelles\r
+ $messages_erreur = array();\r
+ $nb_docs = 0;\r
+ $sel = array();\r
+ foreach ($nouveaux_doc as $doc) {\r
+ if (!is_numeric($doc))\r
+ $messages_erreur[] = $doc;\r
+ // cas qui devrait etre traite en amont\r
+ elseif(!$doc)\r
+ $messages_erreur[] = _T('medias:erreur_insertion_document_base',array('fichier'=>'<em>???</em>'));\r
+ else{\r
+ if (!$ancre)\r
+ $ancre = $doc;\r
+ $sel[] = $doc;\r
+ }\r
+ }\r
+ if (count($messages_erreur))\r
+ $res['message_erreur'] = implode('<br />',$messages_erreur);\r
+ if ($sel)\r
+ $res['message_ok'] = singulier_ou_pluriel(count($sel),'medias:document_installe_succes','medias:nb_documents_installe_succes');\r
+ if ($ancre)\r
+ $res['redirect'] = "#doc$ancre";\r
+ }\r
+ if (count($sel) OR isset($res['message_ok'])){\r
+ $callback = "";\r
+ if ($ancre)\r
+ $callback .= "jQuery('#doc$ancre a.editbox').eq(0).focus();";\r
+ if (count($sel)){\r
+ // passer les ids document selectionnes aux pipelines\r
+ $res['ids'] = $sel;\r
+\r
+ $sel = "#doc".implode(",#doc",$sel);\r
+ $callback .= "jQuery('$sel').animateAppend();";\r
+ }\r
+ $js = "if (window.jQuery) jQuery(function(){ajaxReload('documents',{callback:function(){ $callback }});});";\r
+ $js = "<script type='text/javascript'>$js</script>";\r
+ if (isset($res['message_erreur']))\r
+ $res['message_erreur'].= $js;\r
+ else\r
+ $res['message_ok'] .= $js;\r
+ }\r
+\r
+ return $res;\r
+}\r
+\r
+/**\r
+ * Retourner le contenu du select HTML d'utilisation de fichiers envoyes\r
+ *\r
+ * @param string $dir\r
+ * @param string $mode\r
+ * @return string\r
+ */\r
+function joindre_options_upload_ftp($dir, $mode = 'document') {\r
+ $fichiers = preg_files($dir);\r
+ $exts = $dirs = $texte_upload = array();\r
+\r
+ // en mode "charger une image", ne proposer que les inclus\r
+ $inclus = ($mode == 'image' OR $mode =='vignette')\r
+ ? " AND inclus='image'"\r
+ : '';\r
+\r
+ foreach ($fichiers as $f) {\r
+ $f = preg_replace(",^$dir,",'',$f);\r
+ if (preg_match(",\.([^.]+)$,", $f, $match)) {\r
+ $ext = strtolower($match[1]);\r
+ if (!isset($exts[$ext])) {\r
+ include_spip('action/ajouter_documents');\r
+ $ext = corriger_extension($ext);\r
+ if (sql_fetsel('extension', 'spip_types_documents', $a = "extension='$ext'" . $inclus))\r
+ $exts[$ext] = 'oui';\r
+ else $exts[$ext] = 'non';\r
+ }\r
+\r
+ $k = 2*substr_count($f,'/');\r
+ $n = strrpos($f, "/");\r
+ if ($n === false)\r
+ $lefichier = $f;\r
+ else {\r
+ $lefichier = substr($f, $n+1, strlen($f));\r
+ $ledossier = substr($f, 0, $n);\r
+ if (!in_array($ledossier, $dirs)) {\r
+ $texte_upload[] = "\n<option value=\"$ledossier\">"\r
+ . str_repeat(" ",$k) \r
+ ._T('medias:tout_dossier_upload', array('upload' => $ledossier))\r
+ ."</option>";\r
+ $dirs[]= $ledossier;\r
+ }\r
+ }\r
+\r
+ if ($exts[$ext] == 'oui')\r
+ $texte_upload[] = "\n<option value=\"$f\">" .\r
+ str_repeat(" ",$k+2) .\r
+ $lefichier .\r
+ "</option>";\r
+ }\r
+ }\r
+\r
+ $texte = join('', $texte_upload);\r
+ if (count($texte_upload)>1) {\r
+ $texte = "\n<option value=\"/\" style='font-weight: bold;'>"\r
+ ._T('medias:info_installer_tous_documents')\r
+ ."</option>" . $texte;\r
+ }\r
+\r
+ return $texte;\r
+}\r
+\r
+/**\r
+ * Lister les fichiers contenus dans un zip\r
+ *\r
+ * @param unknown_type $files\r
+ * @return unknown\r
+ */\r
+function joindre_liste_contenu_tailles_archive($files) {\r
+ include_spip('inc/charsets'); # pour le nom de fichier\r
+\r
+ $res = '';\r
+ if (is_array($files))\r
+ foreach ($files as $nom => $file) {\r
+ $nom = translitteration($nom);\r
+ $date = date_interface(date("Y-m-d H:i:s", $file['mtime']));\r
+ \r
+ $taille = taille_en_octets($file['size']);\r
+ $res .= "<li title=\"".attribut_html($title)."\"><b>$nom</b> – $taille<br /> $date</li>\n";\r
+ }\r
+ \r
+ return $res;\r
+}\r
+\r
+function joindre_liste_erreurs_to_li($erreurs){\r
+ if (count($erreurs)==1)\r
+ return "<p>".reset($erreurs)."</p>";\r
+\r
+ $res = implode("</li><li>",$erreurs);\r
+ if (strlen($res)) $res = "<li>$res</li></ul>";\r
+ if (count($erreurs)>4)\r
+ $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>";\r
+ else\r
+ $res = "<ul class=\"spip\">$res</ul>";\r
+ return $res;\r
+}\r
+\r
+?>\r