2bc85d06a53b98243881d486e60c34e24098c8db
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Déclaration de filtres pour les squelettes
16 * @package SPIP\Mots\Filtres
18 if (!defined('_ECRIRE_INC_VERSION')) {
22 include_spip('inc/presentation');
23 include_spip('inc/actions');
24 include_spip('base/abstract_sql');
27 * Compte le nombre d'objets associés pour chaque type d'objet, liés
30 * @pipeline_appel afficher_nombre_objets_associes_a
33 * Identifiant du mot clé
34 * @param int $id_groupe
35 * Identifiant du groupe parent
37 * Tableau de textes indiquant le nombre d'éléments tel que '3 articles'
39 function filtre_objets_associes_mot_dist($id_mot, $id_groupe) {
40 static $occurrences = array();
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);
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);
52 $associes[] = objet_afficher_nb($nb, $infos['type']);
57 'afficher_nombre_objets_associes_a',
58 array('args' => array('objet' => 'mot', 'id_objet' => $id_mot),
67 * Calculer les nombres d'éléments (articles, etc.) liés à chaque mot
70 * @param int $id_groupe
71 * Identifiant du groupe de mots
73 * Couples (tables de liaison => mots).
74 * Mots est un tableau de couples (id_mot => nombre d'utilisation)
76 function calculer_utilisations_mots($id_groupe) {
78 $objets = sql_allfetsel(
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))
84 foreach ($objets as $o) {
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.
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';
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);
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)
110 $statuts = ' AND ' . sql_in(
112 ($GLOBALS['connect_statut'] == '0minirezo') ?
array('prepa', 'prop', 'publie') : array('prop', 'publie')
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",
125 foreach ($res as $row) {
126 $retour[$table_objet_sql][$row['id_mot']] = $row['cnt'];