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