source: spip-zone/_core_/plugins/medias/action/dissocier_document.php @ 45996

Last change on this file since 45996 was 45996, checked in by cedric@…, 10 years ago

publication/depublication d'un document lié à une rubrique :
c'est un cas particulier car une rubrique est publiée des qu'elle contient un document qui l'est donc aussi.
il faut depublier la rubrique et mettre a jour le statut du document quand on supprime un lien document/objet

File size: 5.3 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
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
13if (!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 */
27function action_dissocier_document_dist(){
28        $securiser_action = charger_fonction('securiser_action', 'inc');
29        $arg = $securiser_action();
30
31        // attention au cas ou id_objet est negatif !
32        if (strncmp($arg,'-',1)==0){
33                $arg = explode('-',substr($arg,1));
34                list($id_objet, $objet, $document) = $arg;
35                $id_objet = -$id_objet;
36        }
37        else {
38                $arg = explode('-',$arg);
39                list($id_objet, $objet, $document) = $arg;
40        }
41
42        $suppr=false;
43        if (count($arg)>3 AND $arg[3]=='suppr')
44                $suppr = true;
45        if (count($arg)>4 AND $arg[4]=='safe')
46                $check = true;
47        if ($id_objet=intval($id_objet) AND autoriser('modifier',$objet,$id_objet))
48                dissocier_document($document, $objet, $id_objet, $suppr, $check);
49        else
50                spip_log("Interdit de modifier $objet $id_objet","spip");
51}
52
53/**
54 * Supprimer un lien entre un document et un objet
55 *
56 * @param int $id_document
57 * @param string $objet
58 * @param int $id_objet
59 * @param bool $supprime
60 *   si true, le document est supprime si plus lie a aucun objet
61 * @param bool $check
62 *   si true, on verifie les documents references dans le texte de l'objet
63 *   et on les associe si pas deja fait
64 * @return bool
65 */
66function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
67        if (!$id_document = intval($id_document))
68                return false;
69
70        // D'abord on ne supprime pas, on dissocie
71        include_spip('action/editer_liens');
72        objet_dissocier(array('document'=>$id_document),array($objet=>$id_objet));
73
74        // Si c'est une vignette, l'eliminer du document auquel elle appartient
75        // cas tordu peu probable
76        sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
77
78        // verifier son statut apres une suppression de lien
79        include_spip('action/editer_document');
80        instituer_document($id_document);
81
82        pipeline('post_edition',
83                array(
84                        'args' => array(
85                                'operation' => 'delier_document',
86                                'table' => 'spip_documents',
87                                'id_objet' => $id_document,
88                                'objet' => $objet,
89                                'id' => $id_objet
90                        ),
91                        'data' => null
92                )
93        );
94
95        if ($check) {
96                // si demande, on verifie que ses documents vus sont bien lies !
97                $spip_table_objet = table_objet_sql($objet);
98                $table_objet = table_objet($objet);
99                $id_table_objet = id_table_objet($objet,$serveur);
100                $champs = sql_fetsel('*',$spip_table_objet,addslashes($id_table_objet)."=".intval($id_objet));
101
102                $marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc');
103                $marquer_doublons_doc($champs,$id_objet,$objet,$id_table_objet,$table_objet,$spip_table_objet, '', $serveur);
104        }
105
106        // On supprime ensuite s'il est orphelin
107        // et si demande
108        // ici on ne bloque pas la suppression d'un document rattache a un autre
109        if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){
110                $supprimer_document = charger_fonction('supprimer_document','action');
111                return $supprimer_document($id_document);
112        }
113}
114
115/**
116 * Dissocier un ou des documents
117 *
118 * @param int|string $document
119 *   id_document a dissocier
120 *   I/image pour dissocier les images en mode Image
121 *   I/document pour dissocier les images en mode document
122 *   D/document pour dissocier les documents non image en mode document
123 * @param  $objet
124 *   objet duquel dissocier
125 * @param  $id_objet
126 *   id_objet duquel dissocier
127 * @param bool $supprime
128 *   supprimer les documents orphelins apres dissociation
129 * @param bool $check
130 *   verifier le texte des documents et relier les documents references dans l'objet
131 * @return void
132 */
133function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false){
134        if ($id_document=intval($document)) {
135                supprimer_lien_document($id_document, $objet, $id_objet, $supprime, $check);
136        }
137        else {
138                list($image,$mode) = explode('/',$document);
139                $image = ($image=='I');
140                $typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image  ? '' : 'NOT');
141
142                $obj = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet);
143
144                $s = sql_select('docs.id_document',
145                        "spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document",
146                        "$obj AND vu='non' AND docs.mode=".sql_quote($mode)." AND $typdoc");
147                while ($t = sql_fetch($s)) {
148                        supprimer_lien_document($t['id_document'], $objet, $id_objet, $supprime, $check);
149                }
150        }
151
152        // pas tres generique ca ...
153        if ($objet == 'rubrique') {
154                include_spip('inc/rubriques');
155                depublier_branche_rubrique_if($id_objet);
156        }
157}
158?>
Note: See TracBrowser for help on using the repository browser.