dissocier_document.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. /**
  13. * Dissocier un document
  14. * $arg fournit les arguments de la fonction dissocier_document
  15. * sous la forme
  16. * $id_objet-$objet-$document-suppr-safe
  17. *
  18. * 4eme arg : suppr = true, false sinon
  19. * 5eme arg : safe = true, false sinon
  20. *
  21. * @return void
  22. */
  23. function action_dissocier_document_dist($arg=null){
  24. if(is_null($arg)){
  25. $securiser_action = charger_fonction('securiser_action', 'inc');
  26. $arg = $securiser_action();
  27. }
  28. // attention au cas ou id_objet est negatif !
  29. if (strncmp($arg,'-',1)==0){
  30. $arg = explode('-',substr($arg,1));
  31. list($id_objet, $objet, $document) = $arg;
  32. $id_objet = -$id_objet;
  33. }
  34. else {
  35. $arg = explode('-',$arg);
  36. list($id_objet, $objet, $document) = $arg;
  37. }
  38. $suppr=false;
  39. if (count($arg)>3 AND $arg[3]=='suppr')
  40. $suppr = true;
  41. if (count($arg)>4 AND $arg[4]=='safe')
  42. $check = true;
  43. if ($id_objet=intval($id_objet)
  44. AND (
  45. ($id_objet<0 AND $id_objet==-$GLOBALS['visiteur_session']['id_auteur'])
  46. OR autoriser('dissocierdocuments',$objet,$id_objet)
  47. ))
  48. dissocier_document($document, $objet, $id_objet, $suppr, $check);
  49. else
  50. spip_log("Interdit de modifier $objet $id_objet","spip");
  51. }
  52. /**
  53. * Supprimer un lien entre un document et un objet
  54. *
  55. * @param int $id_document
  56. * @param string $objet
  57. * @param int $id_objet
  58. * @param bool $supprime
  59. * si true, le document est supprime si plus lie a aucun objet
  60. * @param bool $check
  61. * si true, on verifie les documents references dans le texte de l'objet
  62. * et on les associe si pas deja fait
  63. * @return bool
  64. */
  65. function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
  66. if (!$id_document = intval($id_document))
  67. return false;
  68. // D'abord on ne supprime pas, on dissocie
  69. include_spip('action/editer_liens');
  70. objet_dissocier(array('document'=>$id_document),array($objet=>$id_objet));
  71. // Si c'est une vignette, l'eliminer du document auquel elle appartient
  72. // cas tordu peu probable
  73. sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
  74. // verifier son statut apres une suppression de lien
  75. include_spip('action/editer_document');
  76. document_instituer($id_document);
  77. pipeline('post_edition',
  78. array(
  79. 'args' => array(
  80. 'operation' => 'delier_document', // compat v<=2
  81. 'action' => 'delier_document',
  82. 'table' => 'spip_documents',
  83. 'id_objet' => $id_document,
  84. 'objet' => $objet,
  85. 'id' => $id_objet
  86. ),
  87. 'data' => null
  88. )
  89. );
  90. if ($check) {
  91. // si demande, on verifie que ses documents vus sont bien lies !
  92. $spip_table_objet = table_objet_sql($objet);
  93. $table_objet = table_objet($objet);
  94. $id_table_objet = id_table_objet($objet,$serveur);
  95. $champs = sql_fetsel('*',$spip_table_objet,addslashes($id_table_objet)."=".intval($id_objet));
  96. $marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc');
  97. $marquer_doublons_doc($champs,$id_objet,$objet,$id_table_objet,$table_objet,$spip_table_objet, '', $serveur);
  98. }
  99. // On supprime ensuite s'il est orphelin
  100. // et si demande
  101. // ici on ne bloque pas la suppression d'un document rattache a un autre
  102. if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){
  103. $supprimer_document = charger_fonction('supprimer_document','action');
  104. return $supprimer_document($id_document);
  105. }
  106. }
  107. /**
  108. * Dissocier un ou des documents
  109. *
  110. * @param int|string $document
  111. * id_document a dissocier
  112. * I/image pour dissocier les images en mode Image
  113. * I/document pour dissocier les images en mode document
  114. * D/document pour dissocier les documents non image en mode document
  115. * @param $objet
  116. * objet duquel dissocier
  117. * @param $id_objet
  118. * id_objet duquel dissocier
  119. * @param bool $supprime
  120. * supprimer les documents orphelins apres dissociation
  121. * @param bool $check
  122. * verifier le texte des documents et relier les documents references dans l'objet
  123. * @return void
  124. */
  125. function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false){
  126. if ($id_document=intval($document)) {
  127. supprimer_lien_document($id_document, $objet, $id_objet, $supprime, $check);
  128. }
  129. else {
  130. list($image,$mode) = explode('/',$document);
  131. $image = ($image=='I');
  132. $typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image ? '' : 'NOT');
  133. $obj = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet);
  134. $s = sql_select('docs.id_document',
  135. "spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document",
  136. "$obj AND vu='non' AND docs.mode=".sql_quote($mode)." AND $typdoc");
  137. while ($t = sql_fetch($s)) {
  138. supprimer_lien_document($t['id_document'], $objet, $id_objet, $supprime, $check);
  139. }
  140. }
  141. // pas tres generique ca ...
  142. if ($objet == 'rubrique') {
  143. include_spip('inc/rubriques');
  144. depublier_branche_rubrique_if($id_objet);
  145. }
  146. }
  147. ?>