[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / mots / inc / mots.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 * Déclaration de filtres pour les squelettes
15 *
16 * @package SPIP\Mots\Filtres
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 include_spip('inc/presentation');
23 include_spip('inc/actions');
24 include_spip('base/abstract_sql');
25
26 /**
27 * Compte le nombre d'objets associés pour chaque type d'objet, liés
28 * à un mot clé donné.
29 *
30 * @pipeline_appel afficher_nombre_objets_associes_a
31 *
32 * @param int $id_mot
33 * Identifiant du mot clé
34 * @param int $id_groupe
35 * Identifiant du groupe parent
36 * @return string[]
37 * Tableau de textes indiquant le nombre d'éléments tel que '3 articles'
38 **/
39 function filtre_objets_associes_mot_dist($id_mot, $id_groupe) {
40 static $occurrences = array();
41
42 // calculer tous les liens du groupe d'un coup
43 if (!isset($occurrences[$id_groupe])) {
44 $occurrences[$id_groupe] = calculer_utilisations_mots($id_groupe);
45 }
46
47 $associes = array();
48 $tables = lister_tables_objets_sql();
49 foreach ($tables as $table_objet_sql => $infos) {
50 $nb = (isset($occurrences[$id_groupe][$table_objet_sql][$id_mot]) ? $occurrences[$id_groupe][$table_objet_sql][$id_mot] : 0);
51 if ($nb) {
52 $associes[] = objet_afficher_nb($nb, $infos['type']);
53 }
54 }
55
56 $associes = pipeline(
57 'afficher_nombre_objets_associes_a',
58 array('args' => array('objet' => 'mot', 'id_objet' => $id_mot),
59 'data' => $associes)
60 );
61
62 return $associes;
63
64 }
65
66 /**
67 * Calculer les nombres d'éléments (articles, etc.) liés à chaque mot
68 * d'un groupe de mots
69 *
70 * @param int $id_groupe
71 * Identifiant du groupe de mots
72 * @return array
73 * Couples (tables de liaison => mots).
74 * Mots est un tableau de couples (id_mot => nombre d'utilisation)
75 */
76 function calculer_utilisations_mots($id_groupe) {
77 $retour = array();
78 $objets = sql_allfetsel(
79 'DISTINCT objet',
80 array('spip_mots_liens AS L', 'spip_mots AS M'),
81 array('L.id_mot=M.id_mot', 'M.id_groupe=' . intval($id_groupe))
82 );
83
84 foreach ($objets as $o) {
85 $objet = $o['objet'];
86 $_id_objet = id_table_objet($objet);
87 $table_objet_sql = table_objet_sql($objet);
88 $infos = lister_tables_objets_sql($table_objet_sql);
89 if (isset($infos['field']) and $infos['field']) {
90 // uniquement certains statut d'objet,
91 // et uniquement si la table dispose du champ statut.
92 $statuts = '';
93 if (isset($infos['field']['statut']) or isset($infos['statut'][0]['champ'])) {
94 // on s'approche au mieux de la declaration de l'objet.
95 // il faudrait ameliorer ce point.
96 $c_statut = isset($infos['statut'][0]['champ']) ? $infos['statut'][0]['champ'] : 'statut';
97
98 // bricoler les statuts d'apres la declaration de l'objet (champ previsu a defaut de mieux)
99 if (array_key_exists('previsu', $infos['statut'][0]) and strlen($infos['statut'][0]['previsu']) > 1) {
100 $str_statuts = $infos['statut'][0]['previsu'];
101 if ($GLOBALS['connect_statut'] != '0minirezo') {
102 $str_statuts = str_replace('prepa', '', $str_statuts);
103 }
104 $not = (substr($str_statuts, 0, 1) == '!' ? 'NOT' : '');
105 $str_statuts = str_replace('!', '', $str_statuts);
106 $Tstatuts = array_filter(explode(',', $str_statuts));
107 $statuts = ' AND ' . sql_in("O.$c_statut", $Tstatuts, $not);
108 } // objets sans champ previsu ou avec un previsu == '!' (par ex les rubriques)
109 else {
110 $statuts = ' AND ' . sql_in(
111 "O.$c_statut",
112 ($GLOBALS['connect_statut'] == '0minirezo') ? array('prepa', 'prop', 'publie') : array('prop', 'publie')
113 );
114 }
115 }
116 $res = sql_allfetsel(
117 'COUNT(*) AS cnt, L.id_mot',
118 'spip_mots_liens AS L
119 LEFT JOIN spip_mots AS M ON L.id_mot=M.id_mot
120 AND L.objet=' . sql_quote($objet) . '
121 LEFT JOIN ' . $table_objet_sql . " AS O ON L.id_objet=O.$_id_objet",
122 "M.id_groupe=$id_groupe$statuts",
123 'L.id_mot'
124 );
125 foreach ($res as $row) {
126 $retour[$table_objet_sql][$row['id_mot']] = $row['cnt'];
127 }
128 }
129 }
130
131 return $retour;
132 }