source: spip-zone/_core_/plugins/mots/inc/mots.php

Last change on this file was 113294, checked in by spip.franck@…, 2 months ago

Il parait que le futur c'est maintenant :-D

File size: 4.5 KB
Line 
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 * Déclaration de filtres pour les squelettes
15 *
16 * @package SPIP\Mots\Filtres
17 **/
18if (!defined('_ECRIRE_INC_VERSION')) {
19        return;
20}
21
22include_spip('inc/presentation');
23include_spip('inc/actions');
24include_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 **/
39function 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 */
76function 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}
Note: See TracBrowser for help on using the repository browser.