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