382166cbe45ee66295010260cc536b5d5e965e6e
[lhc/web/www.git] / www / plugins-dist / medias / inc / marquer_doublons_doc.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 * Analyse des textes pour trouver et marquer comme vu les documents utilisés dedans
15 *
16 * @package SPIP\Medias\Fonctions
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 // la dist ne regarde que chapo et texte, on laisse comme ca,
24 // mais ca permet d etendre a descriptif ou toto depuis d autres plugins
25 $GLOBALS['medias_liste_champs'][] = 'texte';
26 $GLOBALS['medias_liste_champs'][] = 'chapo';
27
28 /**
29 * Trouver les documents utilisés dans le texte d'un objet et enregistrer cette liaison comme vue.
30 *
31 * La liste des champs susceptibles de contenir des documents ou images est indiquée
32 * par la globale `medias_liste_champs` (un tableau).
33 *
34 * Le contenu de ces champs (du moins ceux qui existent pour l'objet demandé) est récupéré et analysé.
35 * La présence d'un modèle de document dans ces contenus, tel que imgXX, docXX ou embXX
36 * indique que le document est utilisé et doit être lié à l'objet, avec le champ `vu=oui`
37 *
38 * S'il y avait des anciens liens avec vu=oui qui n'ont plus lieu d'être, ils passent à non.
39 *
40 * @note
41 * La fonction pourrait avoir bien moins d'arguments : seuls $champs, $id, $type ou $objet, $desc, $serveur
42 * sont nécessaires. On calcule $desc s'il est absent, et il contient toutes les infos…
43 *
44 * @param array $champs
45 * Couples [champ => valeur] connus de l'objet
46 * @param int $id
47 * Identifiant de l'objet
48 * @param string $type
49 * Type d'objet éditorial (ex: article)
50 * @param string $id_table_objet
51 * Nom de la clé primaire sur la table sql de l'objet
52 * @param string $table_objet
53 * Nom de l'objet éditorial (ex: articles)
54 * @param string $spip_table_objet
55 * Nom de la table sql de l'objet
56 * @param array $desc
57 * Description de l'objet, si déjà calculé
58 * @param string $serveur
59 * Serveur sql utilisé.
60 * @return void|null
61 **/
62 function inc_marquer_doublons_doc_dist(
63 $champs,
64 $id,
65 $type,
66 $id_table_objet,
67 $table_objet,
68 $spip_table_objet,
69 $desc = array(),
70 $serveur = ''
71 ) {
72
73 // On conserve uniquement les champs qui modifient le calcul des doublons de documents
74 // S'il n'y en a aucun, les doublons ne sont pas impactés, donc rien à faire d'autre..
75 if (!$champs = array_intersect_key($champs, array_flip($GLOBALS['medias_liste_champs']))) {
76 return;
77 }
78
79 if (!$desc) {
80 $trouver_table = charger_fonction('trouver_table', 'base');
81 $desc = $trouver_table($table_objet, $serveur);
82 }
83
84 // Il faut récupérer toutes les données qui impactent les liens de documents vus
85 // afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec
86 // les liens actuellement enregistrés.
87 $absents = array();
88
89 // Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque
90 foreach ($GLOBALS['medias_liste_champs'] as $champ) {
91 if (isset($desc['field'][$champ]) and !isset($champs[$champ])) {
92 $absents[] = $champ;
93 }
94 }
95
96 // Retrouver les textes des champs manquants
97 if ($absents) {
98 $row = sql_fetsel($absents, $spip_table_objet, "$id_table_objet=" . sql_quote($id));
99 if ($row) {
100 $champs = array_merge($row, $champs);
101 }
102 }
103
104 include_spip('inc/texte');
105 include_spip('base/abstract_sql');
106 include_spip('action/editer_liens');
107 include_spip('base/objets');
108
109 // récupérer la liste des modèles qui considèrent un document comme vu s'ils sont utilisés dans un texte
110 $modeles = lister_tables_objets_sql('spip_documents');
111 $modeles = $modeles['modeles'];
112
113 // liste d'id_documents trouvés dans les textes
114 $GLOBALS['doublons_documents_inclus'] = array();
115
116 // detecter les doublons dans ces textes
117 traiter_modeles(implode(' ', $champs), array('documents' => $modeles), '', '', null, array(
118 'objet' => $type,
119 'id_objet' => $id,
120 $id_table_objet => $id
121 ));
122
123 $texte_documents_vus = $GLOBALS['doublons_documents_inclus'];
124
125 // on ne modifie les liaisons que si c'est nécessaire
126 $bdd_documents_vus = array(
127 'oui' => array(),
128 'non' => array()
129 );
130
131 $liaisons = objet_trouver_liens(array('document' => '*'), array($type => $id));
132 foreach ($liaisons as $l) {
133 $bdd_documents_vus[$l['vu']][] = $l['id_document'];
134 }
135
136 // il y a des nouveaux documents vus dans le texte
137 $nouveaux = array_diff($texte_documents_vus, $bdd_documents_vus['oui']);
138
139 // il y a des anciens documents vus dans la bdd
140 $anciens = array_diff($bdd_documents_vus['oui'], $texte_documents_vus);
141
142 if ($nouveaux) {
143 // on vérifie que les documents indiqués vus existent réellement tout de même (en cas d'erreur de saisie)
144 $ids = sql_allfetsel('id_document', 'spip_documents', sql_in('id_document', $nouveaux));
145 $ids = array_map('reset', $ids);
146 if ($ids) {
147 // Creer le lien s'il n'existe pas déjà
148 objet_associer(array('document' => $ids), array($type => $id), array('vu' => 'oui'));
149 objet_qualifier_liens(array('document' => $ids), array($type => $id), array('vu' => 'oui'));
150 }
151 }
152
153 if ($anciens) {
154 objet_qualifier_liens(array('document' => $anciens), array($type => $id), array('vu' => 'non'));
155 }
156 }