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