Browse Source

[en cours] merge avec le plugin mediatheque (les documents ne sont plus fonctionnels en l'etat, ne pas mettre a jour dans cette version hors contexte developpement)

svn/root/tags/plugins/medias/1.6.0 v1.6.0
cedric@yterium.com 10 years ago
parent
commit
af1db9d342
  1. 98
      .gitattributes
  2. 743
      action/ajouter_documents.php
  3. 21
      action/changer_mode_document.php
  4. 60
      action/copier_local.php
  5. 102
      action/dissocier_document.php
  6. 77
      action/documenter.php
  7. 229
      action/editer_document.php
  8. 265
      action/joindre.php
  9. 76
      action/legender.php
  10. 41
      action/supprimer_document.php
  11. 171
      action/tourner.php
  12. 23
      action/verifier_documents_brises.php
  13. 115
      base/medias.php
  14. 43
      exec/documenter.php
  15. 42
      exec/documents_colonne.php
  16. 113
      exec/documents_edit.php
  17. 76
      exec/documents_liste.php
  18. 37
      exec/legender.php
  19. 40
      exec/portfolio.php
  20. 36
      exec/tourner.php
  21. 24
      formulaires/changer_fichier_document.html
  22. 60
      formulaires/changer_fichier_document.php
  23. 101
      formulaires/editer_document.html
  24. 170
      formulaires/editer_document.php
  25. 26
      formulaires/illustrer_document.html
  26. 82
      formulaires/illustrer_document.php
  27. 29
      formulaires/inc-colonne_documents.html
  28. 45
      formulaires/inc-lister_archive_jointe.html
  29. 62
      formulaires/inc-portfolio_documents.html
  30. 149
      formulaires/inc-upload_document.html
  31. 24
      formulaires/joindre_document.html
  32. 297
      formulaires/joindre_document.php
  33. BIN
      images/article-12.png
  34. BIN
      images/audio-16.png
  35. BIN
      images/audio-22.png
  36. BIN
      images/audio-32.png
  37. BIN
      images/croissant-16.png
  38. BIN
      images/decroissant-16.png
  39. BIN
      images/distant-16.png
  40. BIN
      images/distant-22.png
  41. BIN
      images/document-16.png
  42. BIN
      images/document-24.png
  43. BIN
      images/document-32.png
  44. BIN
      images/document-distant-24.png
  45. BIN
      images/document-manquant-24.png
  46. BIN
      images/document-vu-24.png
  47. BIN
      images/image-24.png
  48. BIN
      images/media-audio-32.png
  49. BIN
      images/media-image-32.png
  50. BIN
      images/media-video-32.png
  51. BIN
      images/photo-16.png
  52. BIN
      images/photo-22.png
  53. BIN
      images/photo-32.png
  54. BIN
      images/portfolio-128.png
  55. BIN
      images/portfolio-24.png
  56. BIN
      images/portfolio-64.png
  57. BIN
      images/tourner-180.gif
  58. BIN
      images/tourner-droite.gif
  59. BIN
      images/tourner-gauche.gif
  60. BIN
      images/unreadable-22.png
  61. BIN
      images/video-16.png
  62. BIN
      images/video-22.png
  63. BIN
      images/video-32.png
  64. BIN
      images/vu-16-10.png
  65. BIN
      images/vu-16.png
  66. 54
      inc/choisir_mode_document.php
  67. 175
      inc/documenter.php
  68. 34
      inc/documenter_objet.php
  69. 306
      inc/documents.php
  70. 7
      inc/getdocument.php
  71. 217
      inc/joindre.php
  72. 300
      inc/joindre_document.php
  73. 307
      inc/legender.php
  74. 62
      inc/marquer_doublons_doc.php
  75. 174
      inc/renseigner_document.php
  76. 159
      inc/tourner.php
  77. 466
      javascript/jquery.MultiFile.js
  78. 161
      lang/medias_ar.php
  79. 163
      lang/medias_de.php
  80. 157
      lang/medias_en.php
  81. 159
      lang/medias_es.php
  82. 165
      lang/medias_fr.php
  83. 124
      medias_autoriser.php
  84. 92
      medias_fonctions.php
  85. 64
      medias_pipelines.php
  86. 612
      modalbox/jquery.simplemodal-1.3.3.js
  87. BIN
      modalbox/modal_closebox.png
  88. 34
      modalbox/modalbox.js
  89. 13
      modalbox/modalbox_pipelines.php
  90. 51
      modalbox/style_prive_plugin_modalbox.html
  91. 35
      modeles/doc.html
  92. 38
      modeles/doc_legende.html
  93. 49
      modeles/document_case.html
  94. 43
      modeles/document_case_fonctions.php
  95. 45
      modeles/document_desc.html
  96. 37
      plugin.xml
  97. 9
      prive/bouton/inc-supprimer-orphelins.html
  98. 19
      prive/contenu/portfolio_document.html
  99. 9
      prive/editer/colonne_document.html
  100. 9
      prive/editer/document.html

98
.gitattributes

@ -3,28 +3,102 @@ action/acceder_document.php -text
action/ajouter_documents.php -text
action/changer_mode_document.php -text
action/copier_local.php -text
action/documenter.php -text
action/joindre.php -text
action/legender.php -text
action/dissocier_document.php -text
action/editer_document.php -text
action/supprimer_document.php -text
action/tourner.php -text
action/verifier_documents_brises.php -text
base/medias.php -text
base/typedoc.php -text
exec/documenter.php -text
exec/documents_colonne.php -text
exec/documents_liste.php -text
exec/legender.php -text
exec/tourner.php -text
exec/documents_edit.php -text
exec/portfolio.php -text
formulaires/changer_fichier_document.html -text
formulaires/changer_fichier_document.php -text
formulaires/configurer_documents.html -text
formulaires/configurer_documents.php -text
inc/documenter.php -text
formulaires/editer_document.html -text
formulaires/editer_document.php -text
formulaires/illustrer_document.html -text
formulaires/illustrer_document.php -text
formulaires/inc-colonne_documents.html -text
formulaires/inc-lister_archive_jointe.html -text
formulaires/inc-portfolio_documents.html -text
formulaires/inc-upload_document.html -text
formulaires/joindre_document.html -text
formulaires/joindre_document.php -text
images/article-12.png -text
images/audio-16.png -text
images/audio-22.png -text
images/audio-32.png -text
images/croissant-16.png -text
images/decroissant-16.png -text
images/distant-16.png -text
images/distant-22.png -text
images/document-16.png -text
images/document-24.png -text
images/document-32.png -text
images/document-distant-24.png -text
images/document-manquant-24.png -text
images/document-vu-24.png -text
images/image-24.png -text
images/media-audio-32.png -text
images/media-image-32.png -text
images/media-video-32.png -text
images/photo-16.png -text
images/photo-22.png -text
images/photo-32.png -text
images/portfolio-128.png -text
images/portfolio-24.png -text
images/portfolio-64.png -text
images/tourner-180.gif -text
images/tourner-droite.gif -text
images/tourner-gauche.gif -text
images/unreadable-22.png -text
images/video-16.png -text
images/video-22.png -text
images/video-32.png -text
images/vu-16-10.png -text
images/vu-16.png -text
inc/choisir_mode_document.php -text
inc/documenter_objet.php -text
inc/documents.php -text
inc/getdocument.php -text
inc/joindre.php -text
inc/legender.php -text
inc/tourner.php -text
inc/joindre_document.php -text
inc/marquer_doublons_doc.php -text
inc/renseigner_document.php -text
inc/vignette.php -text
javascript/jquery.MultiFile.js -text
lang/medias_ar.php -text
lang/medias_de.php -text
lang/medias_en.php -text
lang/medias_es.php -text
lang/medias_fr.php -text
/medias_autoriser.php -text
/medias_fonctions.php -text
/medias_pipelines.php -text
modalbox/jquery.simplemodal-1.3.3.js -text
modalbox/modal_closebox.png -text
modalbox/modalbox.js -text
modalbox/modalbox_pipelines.php -text
modalbox/style_prive_plugin_modalbox.html -text
modeles/doc.html -text
modeles/doc_legende.html -text
modeles/document_case.html -text
modeles/document_case_fonctions.php -text
modeles/document_desc.html -text
/plugin.xml -text
prive/bouton/inc-supprimer-orphelins.html -text
prive/contenu/portfolio_document.html -text
prive/editer/colonne_document.html -text
prive/editer/document.html -text
prive/editer/document_popup.html -text
prive/galerie.html -text
prive/inc-ajouter-documents.html -text
prive/inc-galerie.html -text
prive/infos/document.html -text
prive/navigation/documents_edit.html -text
prive/style_prive_plugin_medias.html -text
prive/themes/spip/images/portfolio-16.png -text
squelettes/contenu/document.html -text
squelettes/document.html -text
squelettes/head/document.html -text

743
action/ajouter_documents.php

@ -3,551 +3,358 @@
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2011 *
* Copyright (c) 2001-2009 *
* 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. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/getdocument');
include_spip('inc/documents');
include_spip('inc/ajouter_documents'); // compat core
include_spip('inc/choisir_mode_document'); // compat core
include_spip('inc/renseigner_document');
// Joindre un document ou un Zip a deballer (fonction pour action/joindre)
// Distinguer les deux cas pour commencer
function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet, $mode){
$ajouter_un_document = charger_fonction('ajouter_un_document','action');
$ajoutes = array();
// http://doc.spip.org/@inc_ajouter_documents_dist
function inc_ajouter_documents_dist ($sources, $file, $type, $id, $mode, $id_document, &$actifs, $hout='', $redirect='', $iframe_redirect='')
{
if (is_array($sources))
return liste_archive_jointe($sources, $file, $type, $id, $mode, $id_document, $hout, $redirect, $iframe_redirect);
// on ne peut mettre qu'un seul document a la place d'un autre ou en vignette d'un autre
if (intval($id_document)){
$ajoutes[] = $ajouter_un_document($id_document, reset($files), $objet, $id_objet, $mode);
}
else
return ajouter_un_document($sources, $file, $type, $id, $mode, $id_document, $actifs, $hout);
foreach($files as $file){
$ajoutes[] = $ajouter_un_document('new', $file, $objet, $id_objet, $mode);
}
return $ajoutes;
}
/**
* Choisir le mode du document : image/document
* fonction surchargeable
* Ajouter un document (au format $_FILES)
* $id_document, # document a remplacer, ou pour une vignette, l'id_document de maman
* $source, # le fichier sur le serveur (/var/tmp/xyz34)
* $nom_envoye, # son nom chez le client (portequoi.pdf)
* $objet, # lie a un article, une breve ou une rubrique ?
* $id_objet, # identifiant de l'article (ou rubrique) lie
* $mode, # 'image' => image en mode image
* 'vignette' => personnalisee liee a un document
* 'document' => doc ou image en mode document
* 'distant' => lien internet
* $actifs # les documents dont il faudra ouvrir la boite de dialogue
*
* @param unknown_type $fichier
* @param string $type_lien Le type de l'objet sur lequel lier le document (article, rubrique, ...)
* @param unknown_type $type_image
* @param unknown_type $largeur
* @param unknown_type $hauteur
* @param unknown_type $id_document
* @param array $source
* @param unknown_type $nom_envoye
* @param unknown_type $objet
* @param unknown_type $id_objet
* @param unknown_type $mode
* @param unknown_type $documents_actifs
* @param unknown_type $titrer
* @return unknown
*/
function inc_choisir_mode_document_dist($fichier, $type_lien, $type_image, $largeur, $hauteur){
// si ce n'est pas une image, c'est forcement un document
if (!in_array($type_image, array('gif', 'png', 'jpg')))
return 'document';
// si on a pas le droit d'ajouter de document a l'objet, c'est donc un mode image
if ($type_lien AND isset($GLOBALS['meta']["documents_$type_lien"]) AND ($GLOBALS['meta']["documents_$type_lien"]=='non'))
return 'image';
// _INTERFACE_DOCUMENTS
// en fonction de la taille de l'image
// par defaut l'affectation en fonction de la largeur de l'image
// est desactivee car pas comprehensible par le novice
// il suffit de faire dans mes_options
// define('_LARGEUR_MODE_IMAGE', 450);
// pour beneficier de cette detection auto
if (!defined('_LARGEUR_MODE_IMAGE')) define('_LARGEUR_MODE_IMAGE', 0);
// http://doc.spip.org/@ajouter_un_document
function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) {
if (!_LARGEUR_MODE_IMAGE)
return 'image';
$source = $file['tmp_name'];
$nom_envoye = $file['name'];
// passer en minuscules le nom du fichier, pour eviter les collisions
// si le file system fait la difference entre les deux il ne detectera
// pas que Toto.pdf et toto.pdf
// et on aura une collision en cas de changement de file system
$file['name'] = strtolower(translitteration($file['name']));
if ($largeur > 0
AND $largeur < _LARGEUR_MODE_IMAGE)
return 'image';
else
return 'document';
}
/**
* Ajouter un document (au format $_FILES)
*
* @param string $source
* le fichier sur le serveur (/var/tmp/xyz34)
* @param string $nom_envoye
* son nom chez le client (portequoi.pdf)
* @param string $type_lien
* lie a un article, une rubrique ou un autre objet ?
* @param int $id_lien
* identifiant de l'article (ou rubrique ou objet) lie
* @param string $mode
* - 'image' => image en mode image
* - 'vignette' => personnalisee liee a un document
* - 'document' => doc ou image en mode document
* - 'distant' => lien internet
* @param int $id_document
* pour une vignette, l'id_document de maman
*
* @param unknown $documents_actifs
* les documents dont il faudra ouvrir la boite de dialogue
* @param unknown $titrer
*
*
* @return mixed
* int : Identifiant du nouveau document insere
* NULL : echec
**/
// Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut
if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); }
// http://doc.spip.org/@ajouter_un_document
function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, $id_document, &$documents_actifs, $titrer=false) {
$titrer = isset($file['titrer'])?$file['titrer']:_TITRER_DOCUMENTS;
$mode = ((isset($file['mode']) AND $file['mode'])?$file['mode']:$mode);
include_spip('inc/modifier');
if (isset($file['distant']) AND $file['distant'] AND $mode=='vignette') {
include_spip('inc/distant');
$file['tmp_name'] = _DIR_RACINE . copie_locale($source);
$source = $file['tmp_name'];
unset($file['distant']);
}
// Documents distants : pas trop de verifications bloquantes, mais un test
// via une requete HEAD pour savoir si la ressource existe (non 404), si le
// content-type est connu, et si possible recuperer la taille, voire plus.
if ($mode == 'distant') {
// Documents distants : pas trop de verifications bloquantes, mais un test
// via une requete HEAD pour savoir si la ressource existe (non 404), si le
// content-type est connu, et si possible recuperer la taille, voire plus.
if (isset($file['distant']) AND $file['distant']) {
include_spip('inc/distant');
if ($a = recuperer_infos_distantes($source)) {
if (is_array($a = renseigner_source_distante($source))) {
$champs = $a;
# NB: dans les bonnes conditions (fichier autorise et pas trop gros)
# $a['fichier'] est une copie locale du fichier
$type_image = $a['type_image'];
unset($a['type_image']);
unset($a['body']);
$a['date'] = date('Y-m-d H:i:s');
$a['distant'] = 'oui';
$a['mode'] = 'document';
$a['fichier'] = set_spip_doc($source);
unset($champs['type_image']);
}
// on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie !
else {
spip_log("Echec du lien vers le document $source, abandon");
return;
return $a; // message d'erreur
}
} else { // pas distant
}
else { // pas distant
$champs = array(
'distant' => 'non'
);
$type_image = ''; // au pire
// tester le type de document :
// - interdit a l'upload ?
// - quelle extension dans spip_types_documents ?
// - est-ce "inclus" comme une image ?
preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match);
@list(,$titre,$ext) = $match;
// securite : pas de . en dehors de celui separant l'extension
// sinon il est possible d'injecter du php dans un toto.php.txt
$nom_envoye = str_replace('.','-',$titre).'.'.$ext;
if ($titrer) {
$champs['titre'] = '';
if ($titrer){
$titre = substr($nom_envoye,0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier
$titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
} else $titre = '';
$ext = corriger_extension(strtolower($ext));
$row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'");
if ($row) {
$type_inclus_image = ($row['inclus'] == 'image');
$fichier = copier_document($ext, $nom_envoye, $source);
} else {
/* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */
$type_inclus_image = false;
if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) {
spip_log("Extension $ext interdite a l'upload");
return;
}
$ext = 'zip';
if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return;
spip_unlink($tmp_dir); @mkdir($tmp_dir);
$tmp = $tmp_dir.'/'.translitteration($nom_envoye);
$nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
deplacer_fichier_upload($source, $tmp);
include_spip('inc/pclzip');
$source = _DIR_TMP . 'archive.zip';
$archive = new PclZip($source);
$v_list = $archive->create($tmp,
PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
PCLZIP_OPT_ADD_PATH, '');
effacer_repertoire_temporaire($tmp_dir);
if (!$v_list) {
spip_log("Echec creation du zip ");
return;
}
$fichier = copier_document($ext, $nom_envoye, $source);
spip_unlink($source);
$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
}
// Prevoir traitement specifique pour videos
// (http://www.getid3.org/ peut-etre
if ($ext == "mov") {
$largeur = 0;
$hauteur = 0;
} else if ($ext == "svg") {
// recuperer les dimensions et supprimer les scripts
list($largeur,$hauteur)= traite_svg($fichier);
} else { // image ?
// Si c'est une image, recuperer sa taille et son type (detecte aussi swf)
$size_image = @getimagesize($fichier);
$largeur = intval($size_image[0]);
$hauteur = intval($size_image[1]);
$type_image = decoder_type_image($size_image[2]);
}
// Quelques infos sur le fichier
if (!$fichier OR !@file_exists($fichier)
OR !$taille = @intval(filesize($fichier))) {
spip_log ("Echec copie du fichier $fichier");
return;
}
if (!$fichier = fixer_fichier_upload($file))
return ("Impossible de telecharger le fichier");
$champs['inclus'] = $fichier['inclus'];
$champs['extension'] = $fichier['extension'];
$champs['fichier'] = $fichier['fichier'];
$infos = renseigner_taille_dimension_image($champs['fichier'],$champs['extension']);
if (is_string($infos))
return $infos; // c'est un message d'erreur !
// _INTERFACE_DOCUMENTS
$champs = array_merge($champs,$infos);
// Si mode == 'choix', fixer le mode image/document
if ($mode == 'choix') {
if ($mode == 'choix' OR !in_array($mode, array('vignette', 'image', 'document'))) {
$choisir_mode_document = charger_fonction('choisir_mode_document','inc');
$mode = $choisir_mode_document($fichier, $type_lien, $type_image, $largeur, $hauteur);
$mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet);
}
$champs['mode'] = $mode;
if (!$type_image) {
if (_DOC_MAX_SIZE > 0
AND $taille > _DOC_MAX_SIZE*1024) {
spip_unlink ($fichier);
check_upload_error(6,
_T('info_logo_max_poids',
array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024),
'actuel' => taille_en_octets($taille))));
}
if ($mode == 'image') {
spip_log ("le format de $fichier ne convient pas pour une image");
spip_unlink($fichier);
return;
}
}
else { // image
if (_IMG_MAX_SIZE > 0
AND $taille > _IMG_MAX_SIZE*1024) {
spip_unlink ($fichier);
check_upload_error(6,
_T('info_logo_max_poids',
array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024),
'actuel' => taille_en_octets($taille))));
}
if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
AND ($size_image[0] > _IMG_MAX_WIDTH
OR $size_image[1] > _IMG_MAX_HEIGHT)) {
spip_unlink ($fichier);
check_upload_error(6,
_T('info_logo_max_taille',
array(
'maxi' =>
_T('info_largeur_vignette',
array('largeur_vignette' => _IMG_MAX_WIDTH,
'hauteur_vignette' => _IMG_MAX_HEIGHT)),
'actuel' =>
_T('info_largeur_vignette',
array('largeur_vignette' => $size_image[0],
'hauteur_vignette' => $size_image[1]))
)));
}
if (($test = verifier_taille_document_acceptable($champs))!==true){
spip_unlink($champs['fichier']);
return $test; // erreur sur les dimensions du fichier
}
// Si on veut uploader une vignette, il faut qu'elle ait ete bien lue
if ($mode == 'vignette') {
if (!$type_inclus_image) {
spip_log ("le format de $fichier ne convient pas pour une image"); # SVG
spip_unlink($fichier);
return;
}
if (!($largeur OR $hauteur)) {
spip_log('erreur upload vignette '.$fichier);
spip_unlink($fichier);
return;
}
} elseif (!in_array($mode, array('distant', 'image', 'document'))) {
if ($type_image AND $type_inclus_image)
$mode = 'image';
else
$mode = 'document';
}
$a = array(
'date' => date('Y-m-d H:i:s'),
'distant' => 'non',
'mode' => $mode,
'titre'=> $titre,
'largeur' => $largeur,
'hauteur' => $hauteur,
'taille' => $taille,
'extension'=> $ext,
'fichier' => set_spip_doc($fichier));
unset($champs['type_image']);
unset($champs['inclus']);
$champs['fichier'] = set_spip_doc($champs['fichier']);
}
// lier le parent si necessaire
if ($id_objet=intval($id_objet) AND $objet)
$champs['parents'][] = "$objet|$id_objet";
// "mettre a jour un document" si on lui
// passe un id_document
if ($id_document=intval($id_document)){
unset($champs['titre']); // garder le titre d'origine
unset($champs['date']); // garder la date d'origine
unset($champs['descriptif']); // garder la desc d'origine
// unset($a['distant']); # on peut remplacer un doc statique par un doc distant
// unset($a['mode']); # on peut remplacer une image par un document ?
}
if (($id_document=intval($id_document)) AND $mode!='vignette') {
// Mise a jour des descripteurs d'un vieux doc
unset($a['titre']);
unset($a['date']);
unset($a['distant']);
unset($a['mode']);
sql_updateq('spip_documents', $a, "id_document=$id_document");
$id = $id_document;
} else {
include_spip('action/editer_document');
// Installer le document dans la base
// attention piege semantique : les images s'installent en mode 'vignette'
// note : la fonction peut "mettre a jour un document" si on lui
// passe "mode=document" et "id_document=.." (pas utilise)
$id = sql_insertq("spip_documents", $a);
spip_log ("ajout du document $source $nom_envoye (M '$mode' T '$type_lien' L '$id_lien' D '$id')");
if ($id_lien AND $id
AND preg_match('/^[a-z0-9_]+$/i', $type_lien) # securite
) {
sql_insertq('spip_documents_liens',
array('id_document' => $id,
'id_objet' => $id_lien,
'objet' => $type_lien));
} else spip_log("Pb d'insertion $id_lien $type_lien");
if ($id_document) {
sql_updateq("spip_documents", array("id_vignette" => $id, "mode" => 'document'), "id_document=$id_document");
} else $id_document = $id;
// Appliquer l'exif orientation
// http://trac.rezo.net/trac/spip/ticket/1494
define('_TOURNER_SELON_EXIF', false); # par defaut non, risque memoire
if (defined('_TOURNER_SELON_EXIF')
AND _TOURNER_SELON_EXIF
AND $mode == 'document'
AND $a['distant'] == 'non'
AND $a['extension'] == 'jpg') {
include_spip('action/tourner');
tourner_selon_exif_orientation($id_document, $fichier);
}
if (!$id_document){
$id_document = insert_document();
spip_log ("ajout du document ".$file['tmp_name']." ".$file['name']." (M '$mode' T '$objet' L '$id_objet' D '$id_document')");
}
// pour que le retour vers ecrire/ active le bon doc.
$documents_actifs[$fichier] = $id_document;
// Notifications, gestion des revisions, reindexation...
document_set($id_document,$champs);
// permettre aux plugins de faire des modifs a l'ajout initial
// ex EXIF qui tourne les images si necessaire
pipeline('post_edition',
array(
'args' => array(
'operation' => 'ajouter_document',
'table' => 'spip_documents',
'id_objet' => $id,
'type_image' => $type_image
'table' => 'spip_documents', // compatibilite
'table_objet' => 'documents',
'spip_table_objet' => 'spip_documents',
'type' =>'document',
'id_objet' => $id_document,
'champs' => array_keys($champs),
'serveur' => '', // serveur par defaut, on ne sait pas faire mieux pour le moment
'action' => 'ajouter_document',
'operation' => 'ajouter_document', // compat <= v2.0
),
'data' => null
'data' => $champs
)
);
return $id ;
return $id_document ;
}
// http://doc.spip.org/@verifier_compactes
function verifier_compactes($zip) {
if (!$list = $zip->listContent()) return array();
// si pas possible de decompacter: installer comme fichier zip joint
// Verifier si le contenu peut etre uploade (verif extension)
$aff_fichiers = array();
foreach ($list as $file) {
if (accepte_fichier_upload($f = $file['stored_filename']))
$aff_fichiers[$f] = $file;
else spip_log("chargement de $f interdit");
}
ksort($aff_fichiers);
return $aff_fichiers;
if (!function_exists('corriger_extension')){
/**
* Corrige l'extension du fichier dans quelques cas particuliers
* (a passer dans ecrire/base/typedoc)
* A noter : une extension 'pdf ' passe dans la requete de controle
* mysql> SELECT * FROM spip_types_documents WHERE extension="pdf ";
*
* @param string $ext
* @return string
*/
function corriger_extension($ext) {
$ext = preg_replace(',[^a-z0-9],i', '', $ext);
switch ($ext) {
case 'htm':
$ext='html';
break;
case 'jpeg':
$ext='jpg';
break;
case 'tiff':
$ext='tif';
break;
}
return $ext;
}
}
//
// Convertit le type numerique retourne par getimagesize() en extension fichier
//
// http://doc.spip.org/@decoder_type_image
function decoder_type_image($type, $strict = false) {
switch ($type) {
case 1:
return "gif";
case 2:
return "jpg";
case 3:
return "png";
case 4:
return $strict ? "" : "swf";
case 5:
return "psd";
case 6:
return "bmp";
case 7:
case 8:
return "tif";
default:
return "";
/**
* Verifie la possibilite d'uploader une extension
* renvoie un tableau descriptif si l'extension est acceptee
* une chaine 'zip' si il faut zipper
* false si l'extension est refusee
*
*/
function verifier_upload_autorise($source){
if (preg_match(",\.([^.]+)$,", $source, $match)
AND $ext = $match[1]){
$ext = corriger_extension(strtolower($ext));
if ($row = sql_fetsel("extension,inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
return $row;
}
if (sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'"))
return 'zip';
spip_log("Extension $ext interdite a l'upload");
return false;
}
// http://doc.spip.org/@traite_svg
function traite_svg($file)
{
$texte = spip_file_get_contents($file);
// Securite si pas admin : virer les scripts et les references externes
// sauf si on est en mode javascript 'ok' (1), cf. inc_version
if ($GLOBALS['filtrer_javascript'] < 1
AND $GLOBALS['visiteur_session']['statut'] != '0minirezo') {
include_spip('inc/texte');
$new = trim(safehtml($texte));
// petit bug safehtml
if (substr($new,0,2) == ']>') $new = ltrim(substr($new,2));
if ($new != $texte) ecrire_fichier($file, $texte = $new);
/**
* tester le type de document :
* - interdit a l'upload ?
* - quelle extension dans spip_types_documents ?
* - est-ce "inclus" comme une image ?
*
* le zipper si necessaire
*
* @param array $file //format $_FILES
* @return array
*/
function fixer_fichier_upload($file){
if (is_array($row=verifier_upload_autorise($file['name']))) {
$row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
return $row;
}
// creer un zip comme demande
// pour encapsuler un fichier dont l'extension n'est pas supportee
elseif($row==='zip'){
$row = array('extension'=>'zip','inclus'=>false);
$width = $height = 150;
if (preg_match(',<svg[^>]+>,', $texte, $s)) {
$s = $s[0];
if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)){
$width = $r[3];
$height = $r[4];
} else {
// si la taille est en centimetre, estimer le pixel a 1/64 de cm
if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)){
if ($r[2] != '%') {
$width = $r[1];
if ($r[2] == 'cm') $width <<=6;
}
}
if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)){
if ($r[2] != '%') {
$height = $r[1];
if ($r[2] == 'cm') $height <<=6;
}
$ext = 'zip';
if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))
return false;
spip_unlink($tmp_dir);
@mkdir($tmp_dir);
include_spip('inc/charset');
$tmp = $tmp_dir.'/'.translitteration($file['name']);
$file['name'] .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
// deplacer le fichier tmp_name dans le dossier tmp
deplacer_fichier_upload($file['tmp_name'], $tmp, true);
include_spip('inc/pclzip');
$source = _DIR_TMP . basename($tmp_dir) . '.zip';
$archive = new PclZip($source);
$v_list = $archive->create($tmp,
PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
PCLZIP_OPT_ADD_PATH, '');
effacer_repertoire_temporaire($tmp_dir);
if (!$v_list) {
spip_log("Echec creation du zip ");
return false;
}
}
$row['fichier'] = copier_document($row['extension'], $file['name'], $source);
spip_unlink($source);
return $row;
}
return array($width, $height);
return false;
}
//
// Corrige l'extension du fichier dans quelques cas particuliers
// (a passer dans ecrire/base/typedoc)
// A noter : une extension 'pdf ' passe dans la requete de controle
// mysql> SELECT * FROM spip_types_documents WHERE extension="pdf ";
// http://doc.spip.org/@corriger_extension
function corriger_extension($ext) {
$ext = preg_replace(',[^a-z0-9],i', '', $ext);
switch ($ext) {
case 'htm':
return 'html';
case 'jpeg':
return 'jpg';
case 'tiff':
return 'tif';
case 'aif':
return 'aiff';
default:
return $ext;
}
}
// Cherche dans la base le type-mime du tableau representant le document
// et corrige le nom du fichier ; retourne array(extension, nom corrige)
// s'il ne trouve pas, retourne '' et le nom inchange
// http://doc.spip.org/@fixer_extension_document
function fixer_extension_document($doc) {
$extension = '';
$name = $doc['name'];
if (preg_match(',[.]([^.]+)$,', $name, $r)
AND $t = sql_fetsel("extension", "spip_types_documents",
"extension=" . sql_quote(corriger_extension($r[1])))) {
$extension = $t['extension'];
$name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension;
function verifier_taille_document_acceptable($infos){
// si ce n'est pas une image
if (!$infos['type_image']) {
if (_DOC_MAX_SIZE > 0
AND $infos['taille'] > _DOC_MAX_SIZE*1024)
return _T('medias:info_doc_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
if ($infos['mode'] == 'image')
return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier']));
}
else if ($t = sql_fetsel("extension", "spip_types_documents",
"mime_type=" . sql_quote($doc['type']))) {
$extension = $t['extension'];
$name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension;
// si c'est une image
else {
if (_IMG_MAX_SIZE > 0
AND $infos['taille'] > _IMG_MAX_SIZE*1024)
return _T('medias:info_image_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
AND ($infos['largeur'] > _IMG_MAX_WIDTH
OR $infos['hauteur'] > _IMG_MAX_HEIGHT))
return _T('info_logo_max_taille',
array(
'maxi' =>
_T('info_largeur_vignette',
array('largeur_vignette' => _IMG_MAX_WIDTH,
'hauteur_vignette' => _IMG_MAX_HEIGHT)),
'actuel' =>
_T('info_largeur_vignette',
array('largeur_vignette' => $infos['largeur'],
'hauteur_vignette' => $infos['hauteur']))
));
}
// Si on veut uploader une vignette, il faut qu'elle ait ete bien lue
if ($infos['mode'] == 'vignette') {
if ($infos['inclus'] != 'image')
return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG
return array($extension,$name);
}
if (!($infos['largeur'] OR $infos['hauteur']))
return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier']));
}
// Afficher un formulaire de choix: decompacter et/ou garder tel quel
// et reconstruire un generer_action_auteur.
// Passer ca en squelette un de ces jours.
// http://doc.spip.org/@liste_archive_jointe
function liste_archive_jointe($valables, $zip, $type, $id, $mode, $id_document, $hash, $redirect, $iframe_redirect)
{
include_spip('inc/layer');
$arg = (intval($id) .'/' .intval($id_document) . "/$mode/$type");
$texte = "<div style='text-align: left'>
<input type='hidden' name='redirect' value='$redirect' />
<input type='hidden' name='iframe_redirect' value='$iframe_redirect' />
<input type='hidden' name='hash' value='$hash' />
<input type='hidden' name='chemin' value='$zip' />
<input type='hidden' name='arg' value='$arg' />
<input type='radio' checked='checked' name='sousaction5' id='sousaction5_5' value='5' onchange='jQuery(\"#options_deballe_zip\").slideUp();' />" .
"<label for='sousaction5_5'>" . _T('upload_zip_telquel'). "</label>" .
"<br />".
"<input type='radio' name='sousaction5' id='sousaction5_6' value='6' onchange='jQuery(\"#options_deballe_zip\").slideDown();' />".
"<label for='sousaction5_6'>" . _T('upload_zip_decompacter') . "</label>" .
"<ol>" .
liste_archive_taille($valables) .
"</ol>"
. debut_block_depliable(false,'options_deballe_zip')
. "<input type='checkbox' name='sousaction4' id='sousaction4_4' value='4' />".
"<label for='sousaction4_4'>" . _T('upload_zip_conserver') . "</label>" .
"<br /><input type='checkbox' name='titrer' id='titrer' />"
. "<label for='titrer'>" . _T('upload_zip_titrer') .
"</label>".
"</div></div>"
. fin_block()
. "<div style='text-align: right;'><input class='fondo spip_xx-small' type='submit' value='".
_T('bouton_valider').
"' />";
$texte = "<p>" .
_T('upload_fichier_zip_texte') .
"</p><p>" .
_T('upload_fichier_zip_texte2') .
"</p>" .
generer_form_action('joindre', $texte,' method="post"');
if(_request("iframe")=="iframe") {
return "<p>build form $iframe_redirect</p>" .
"<div class='upload_answer upload_zip_list'>" .
$texte .
"</div>";
} else { return minipres(_T('upload_fichier_zip'), $texte); }
return true;
}
// http://doc.spip.org/@liste_archive_taille
function liste_archive_taille($files) {
$res = '';
foreach ($files as $nom => $file) {
$date = date_interface(date("Y-m-d H:i:s", $file['mtime']));
$taille = taille_en_octets($file['size']);
$res .= "<li title=\"".texte_backend($title)."\"><b>$nom</b> &ndash; $taille<br />&nbsp; $date</li>\n";
}
return $res;
}
?>
?>

21
action/changer_mode_document.php

@ -3,14 +3,14 @@
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2011 *
* Copyright (c) 2001-2009 *
* 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. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined("_ECRIRE_INC_VERSION")) return;
// Cette action permet de basculer du mode image au mode document et vice versa
@ -23,30 +23,17 @@ function action_changer_mode_document_dist()
if (!preg_match(",^(\d+)\W(\w+)$,", $arg, $r))
spip_log("action_changer_mode_document $arg pas compris");
else action_changer_mode_document_post($r);
else action_changer_mode_document_post($r[1],$r[2]);
}
// http://doc.spip.org/@action_changer_mode_document_post
function action_changer_mode_document_post($r)
function action_changer_mode_document_post($id_document, $mode)
{
// - id_document le doc a modifier
// - mode le mode a lui donner
list(, $id_document, $mode) = $r;
if ($id_document = intval($id_document)
AND in_array($mode, array('vignette', 'image', 'document'))) {
sql_updateq('spip_documents', array('mode'=>$mode), 'id_document='.$id_document);
}
if ($case = _request('afficher_case')){
$case = explode('-',$case);
list($id,$type,$script) = $case;
include_spip('inc/presentation');
include_spip('inc/documents');
include_spip('inc/actions');
// vilain hack pour ne pas recharger un script js
affiche_raccourci_doc('doc', $id_document, 'left');
// voila
ajax_retour(afficher_case_document($id_document, $id, $script, $type, true));
exit();
}
}
?>

60
action/copier_local.php

@ -3,14 +3,14 @@
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2011 *
* Copyright (c) 2001-2009 *
* 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. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined("_ECRIRE_INC_VERSION")) return;
// Fonction appellee lorsque l'utilisateur clique sur le bouton
// 'copier en local' (document/portfolio).
@ -18,19 +18,22 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
// realise la copie.
// http://doc.spip.org/@action_copier_local_dist
function action_copier_local_dist() {
function action_copier_local_dist($id_document=null) {
// Recupere les arguments.
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_document = intval($arg);
if (!$id_document){
// Recupere les arguments.
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_document = intval($arg);
}
if (!$id_document) {
spip_log("action_copier_local_dist $arg pas compris");
return false;
} else {
// arguments recuperes, on peut maintenant appeler la fonction.
action_copier_local_post($id_document);
return action_copier_local_post($id_document);
}
}
@ -38,45 +41,30 @@ function action_copier_local_dist() {
function action_copier_local_post($id_document) {
// Il faut la source du document pour le copier
$row = sql_fetsel("fichier, descriptif", "spip_documents", "id_document=$id_document");
$row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document=$id_document");
$source = $row['fichier'];
include_spip('inc/distant'); // pour 'copie_locale'
include_spip('inc/documents'); // pour 'set_spip_doc'
$fichier = copie_locale($source);
if ($fichier) {
$fichier = _DIR_RACINE . $fichier;
$taille = filesize($fichier);
// On le sort du repertoire IMG/distant/
$dest = preg_replace(',^.*/distant/[^/_]+[/_],', '', $fichier);
$dest = sous_repertoire(_DIR_IMG, preg_replace(',^.*\.,', '', $fichier)) . $dest;
if ($dest != $fichier
AND @rename($fichier, $dest))
$fichier = $dest;
// On indique l'ancien URL dans le descriptif (pis-aller)
$row['descriptif'] .= ($row['descriptif'] ? "\n\n":'') . "[->$source]";
// $fichier contient IMG/distant/...
// or, dans la table documents, IMG doit etre exclu.
$fichier = set_spip_doc($fichier);
$files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
$ajouter_documents = charger_fonction('ajouter_documents','action');
spip_log("convertit doc $id_document en local: $source => $fichier");
sql_updateq('spip_documents', array('fichier' =>$fichier, 'distant'=>'non', 'taille'=>$taille, 'descriptif'=> $row['descriptif']),"id_document=".$id_document);
$liste = array();
$ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
spip_unlink($fichier);
pipeline('post_edition',
array(
'args' => array(
'operation' => 'copier_local_post',
'table' => 'spip_documents',
'id_objet' => $id_document
),
'data' => null
)
);
// ajouter l'origine du document aux credits
include_spip('action/editer_document');
document_set($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
return true;
} else {
spip_log("echec copie locale $source");
}
return _T('medias:erreur_copie_fichier',array('nom'=>$source));
}
?>

102
action/dissocier_document.php

@ -0,0 +1,102 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2009 *
* 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. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_dissocier_document_dist(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$arg = explode('-',$arg);
list($id_objet, $objet, $document) = $arg;
$suppr=false;
if (count($arg)>3 AND $arg[3]=='suppr')
$suppr = true;
if (count($arg)>4 AND $arg[4]=='safe')
$check = true;
if ($id_objet=intval($id_objet) AND autoriser('modifier',$objet,$id_objet))
dissocier_document($document, $objet, $id_objet, $suppr, $check);
else
spip_log("Interdit de modifier $objet $id_objet","spip");
}
// http://doc.spip.org/@supprimer_lien_document
function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
if (!$id_document = intval($id_document))
return false;
// D'abord on ne supprime pas, on dissocie
sql_delete("spip_documents_liens", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_document=".$id_document);
// Si c'est une vignette, l'eliminer du document auquel elle appartient
sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
pipeline('post_edition',
array(
'args' => array(
'operation' => 'delier_document',
'table' => 'spip_documents',
'id_objet' => $id_document,
'objet' => $objet,
'id' => $id_objet
),
'data' => null
)
);
if ($check) {
// si demande, on verifie que ses documents vus sont bien lies !
$spip_table_objet = table_objet_sql($objet);
$table_objet = table_objet($objet);
$id_table_objet = id_table_objet($objet,$serveur);
$champs = sql_fetsel('*',$spip_table_objet,addslashes($id_table_objet)."=".intval($id_objet));
$marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc');
$marquer_doublons_doc($champs,$id_objet,$objet,$id_table_objet,$table_objet,$spip_table_objet, '', $serveur);
}
// On supprime ensuite s'il est orphelin
// et si demande
if ($supprime AND !sql_countsel('spip_documents_liens', 'id_document='.$id_document)){
$supprimer_document = charger_fonction('supprimer_document','action');
return $supprimer_document($id_document);
}
}
function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false){
if ($id_document=intval($document)) {
supprimer_lien_document($id_document, $objet, $id_objet, $supprime, $check);
}
else {
list($image,$mode) = explode('/',$document);
$image = ($image=='I');
$typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image ? '' : 'NOT');
$obj = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet);
$s = sql_select('docs.id_document',
"spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document",
"$obj AND vu='non' AND docs.mode=".sql_quote($mode)." AND $typdoc");
while ($t = sql_fetch($s)) {
supprimer_lien_document($t['id_document'], $objet, $id_objet, $supprime, $check);
}
}
// pas tres generique ca ...
if ($objet == 'rubrique') {
include_spip('inc/rubriques');
depublier_branche_rubrique_if($id);
}
}
?>

77
action/documenter.php

@ -1,77 +0,0 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2011 *
* 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. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
// Comme son nom ne l'indique pas cette action consiste a SUPPRIMER un document
// http://doc.spip.org/@action_documenter_dist
function action_documenter_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^(-?)(\d+)\W(\w+)(\W(\d+))?$,", $arg, $r))
spip_log("action_documenter $arg pas compris");
else action_documenter_post($r);
}
// http://doc.spip.org/@supprimer_lien_document
function supprimer_lien_document($id_document, $objet, $id_objet) {
if (!$id_document = intval($id_document))
return false;
// D'abord on ne supprime pas, on dissocie
sql_delete("spip_documents_liens",
$z = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_document=".$id_document);
// Si c'est une vignette, l'eliminer du document auquel elle appartient
sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
// On supprime ensuite s'il est orphelin
// (autorisation verifiee dans l'action)
$supprimer_document = charger_fonction('supprimer_document','action');
return $supprimer_document($id_document);
}
// http://doc.spip.org/@action_documenter_post
function action_documenter_post($r)
{
// - sign indique le portfolio image ou document, dans le cas de
// la page exec=articles
// - id est l'id_objet (id_article ou id_rubrique etc)
// - type est 'article' (ou 'rubrique')
// - id_document le doc a supprimer ou a delier de l'objet
// SI VIDE, on supprime tous les documents du type SIGN
// (bouton "supprimer tous les documents")
list(, $sign, $id, $type, ,$id_document) = $r;
if ($id_document) {
supprimer_lien_document($id_document, $type, $id);
}
else {
$obj = "id_objet=".intval($id)." AND objet=".sql_quote($type);
$s = sql_select('D.id_document AS id_doc', "spip_documents AS D LEFT JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "$obj AND D.mode='document' AND " . (sql_in('D.extension', array('gif', 'jpg', 'png'), $sign ? '' : 'NOT')));
while ($t = sql_fetch($s)) {
supprimer_lien_document($t['id_doc'], $type, $id);
}
}
if ($type == 'rubrique') {
include_spip('inc/rubriques');
depublier_branche_rubrique_if($id);
}
}
?>

229
action/editer_document.php

@ -0,0 +1,229 @@
<?php
/**
* Plugin Portfolio/Gestion des documents
* Licence GPL (c) 2006-2008 Cedric Morin, romy.tetue.net
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Action editer_document
*
* @return unknown
*/
function action_editer_document_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// Envoi depuis le formulaire de creation d'un document
if (!$id_document = intval($arg)) {
$id_document = insert_document();
}
if ($id_document = intval($id_document)) {
document_set($id_document);
}
// Erreur
else{
include_spip('inc/headers');
redirige_url_ecrire();
}
if (_request('redirect')) {
$redirect = parametre_url(urldecode(_request('redirect')),
'id_document', $id_document, '&');
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_document,'');
}
/**
* Creer un nouveau document
*
* @return unknown
*/
function insert_document() {
$champs = array(
'statut' => 'prop',
'date' => 'NOW()',
);
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_documents',
),
'data' => $champs
)
);
$id_document = sql_insertq("spip_documents", $champs);
return $id_document;
}
/**
* Enregistre une revision de document.
* $c est un contenu (par defaut on prend le contenu via _request())
*
* @param int $id_document
* @param array $c
*/
function document_set ($id_document, $c=false) {
// champs normaux
$champs = array();
foreach (array(
'titre', 'descriptif', 'date', 'taille', 'largeur','hauteur','mode','credits',
'fichier','distant','extension', 'id_vignette',
) as $champ)
if (($a = _request($champ,$c)) !== null)
$champs[$champ] = $a;
// Si le document est publie, invalider les caches et demander sa reindexation
$t = sql_getfetsel("statut", "spip_documents", 'id_document='.intval($id_document));
if ($t == 'publie') {
$invalideur = "id='id_document/$id_document'";
$indexation = true;
}
$ancien_fichier = "";
// si le fichier est modifie, noter le nom de l'ancien pour faire le menage
if (isset($champs['fichier'])){
$ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document));
}
include_spip('inc/modifier');
modifier_contenu('document', $id_document,
array(
'invalideur' => $invalideur,
'indexation' => $indexation
),
$champs);
// nettoyer l'ancien fichier si necessaire
if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ
AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
AND @file_exists($f = get_spip_doc($ancien_fichier)))
spip_unlink($f);
// Changer le statut du document ?
// le statut n'est jamais fixe manuellement mais decoule de celui des objets lies
if(instituer_document($id_document,array('parents'=>_request('parents',$c),'ajout_parents'=>_request('ajout_parents',$c)))) {
//
// Post-modifications
//
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='id_document/$id_document'");
}
}
/**
* determiner le statut d'un document : prepa/publie
* si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
*
* @param int $id_document
*/
function instituer_document($id_document,$champs=array()){
$statut=isset($champs['statut'])?$champs['statut']:null;
$date_publication = isset($champs['date_publication'])?$champs['date_publication']:null;
if (isset($champs['parents']))
medias_revision_document_parents($id_document,$champs['parents']);
if (isset($champs['ajout_parents']))
medias_revision_document_parents($id_document,$champs['ajout_parents'],true);
$row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document");
$statut_ancien = $row['statut'];
$date_publication_ancienne = $row['date_publication'];
if (is_null($statut)){
$statut = 'prepa';
$trouver_table = charger_fonction('trouver_table','base');
$res = sql_select('id_objet,objet','spip_documents_liens','id_document='.intval($id_document));
// dans 10 ans, ca nous fera un bug a corriger vers 2018
// penser a ouvrir un ticket d'ici la :p
$date_publication=time()+10*365*24*3600;
while($row = sql_fetch($res)){
$table = table_objet_sql($row['objet']);
$desc = $trouver_table($table);
// si pas de champ statut, c'est un objet publie, donc c'est bon
if (!isset($desc['field']['statut'])){
$statut = 'publie';
$date_publication=0;
continue;
}
$id_table = id_table_objet($row['objet']);
$row2 = sql_fetsel('statut'.($table=='spip_articles'?",date":""),$table,$id_table.'='.intval($row['id_objet']));
if ($row2['statut']=='publie'){
$statut = 'publie';
// si ce n'est pas un article, c'est donc deja publie, on met la date a 0
if (!$row2['date']){
$date_publication=0;
continue;
}
else {
$date_publication = min($date_publication,strtotime($row2['date']));
}
}
}
$date_publication = date('Y-m-d H:i:s',$date_publication);
if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publie==$date_publication_ancienne)
return false;
if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0')
return false;
}
if ($statut!==$statut_ancien
OR $date_publication!=$date_publication_ancienne){
sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document));
return true;
}
return false;
}
/**
* Revision des parents d'un document
* chaque parent est liste au format objet|id_objet
*
* @param unknown_type $id_document
* @param unknown_type $parents
*/
function medias_revision_document_parents($id_document, $parents=null, $ajout=false){
if (!is_array($parents))
return;
$insertions = array();
$cond = array();
// au format objet|id_objet
foreach($parents as $p){
$p = explode('|',$p);
if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0])){ // securite
$insertions[] = array('id_document'=>$id_document,'objet'=>$p[0],'id_objet'=>$p[1]);
$cond[] = "(id_objet=".intval($p[1])." AND objet=".sql_quote($p[0]).")";
}
}
if (!$ajout){
// suppression des parents obsoletes
$cond_notin = "id_document=".intval($id_document).(count($cond)?" AND NOT(".implode(") AND NOT(",$cond).")":"");
#$cond_in = "id_document=".intval($id_document).(count($cond)?" AND (".implode(" OR (",$cond).")":"");
sql_delete("spip_documents_liens", $cond_notin);
}
foreach($insertions as $ins){
if (!sql_countsel('spip_documents_liens','id_document='.intval($ins['id_document'])." AND id_objet=".intval($ins['id_objet'])." AND objet=".sql_quote($ins['objet'])))
sql_insertq('spip_documents_liens',$ins);
}
}
?>

265
action/joindre.php