' . joli_repertoire($dir) . '';
}
}
}
// 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' => '???'));
} else {
if (!$ancre) {
$ancre = $doc;
}
$sel[] = $doc;
}
}
if (count($messages_erreur)) {
$res['message_erreur'] = implode('
', $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 = "";
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';
$dirs[] = $ledossier;
}
}
if ($exts[$ext] == 'oui') {
$texte_upload[] = "\n';
}
}
}
$texte = join('', $texte_upload);
if (count($texte_upload) > 1) {
$texte = "\n' . $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
' . reset($erreurs) . '
'; } $res = implode('" . _T( 'medias:erreurs_voir', array('nb' => count($erreurs)) ) . '