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

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

Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage

File size: 4.5 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2015                                                *
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('afficher_nombre_objets_associes_a',
57                array('args' => array('objet' => 'mot', 'id_objet' => $id_mot), 'data' => $associes));
58
59        return $associes;
60
61}
62
63/**
64 * Calculer les nombres d'éléments (articles, etc.) liés à chaque mot
65 * d'un groupe de mots
66 *
67 * @param int $id_groupe
68 *     Identifiant du groupe de mots
69 * @return array
70 *     Couples (tables de liaison => mots).
71 *     Mots est un tableau de couples (id_mot => nombre d'utilisation)
72 */
73function calculer_utilisations_mots($id_groupe) {
74        $retour = array();
75        $objets = sql_allfetsel('DISTINCT objet', array('spip_mots_liens AS L', 'spip_mots AS M'),
76                array('L.id_mot=M.id_mot', 'M.id_groupe=' . intval($id_groupe)));
77
78        foreach ($objets as $o) {
79                $objet = $o['objet'];
80                $_id_objet = id_table_objet($objet);
81                $table_objet_sql = table_objet_sql($objet);
82                $infos = lister_tables_objets_sql($table_objet_sql);
83                if (isset($infos['field']) AND $infos['field']) {
84                        // uniquement certains statut d'objet,
85                        // et uniquement si la table dispose du champ statut.
86                        $statuts = "";
87                        if (isset($infos['field']['statut']) OR isset($infos['statut'][0]['champ'])) {
88                                // on s'approche au mieux de la declaration de l'objet.
89                                // il faudrait ameliorer ce point.
90                                $c_statut = isset($infos['statut'][0]['champ']) ? $infos['statut'][0]['champ'] : 'statut';
91
92                                // bricoler les statuts d'apres la declaration de l'objet (champ previsu a defaut de mieux)
93                                if (array_key_exists('previsu', $infos['statut'][0]) AND strlen($infos['statut'][0]['previsu']) > 1) {
94                                        $str_statuts = $infos['statut'][0]['previsu'];
95                                        if ($GLOBALS['connect_statut'] != "0minirezo") {
96                                                $str_statuts = str_replace('prepa', '', $str_statuts);
97                                        }
98                                        $not = (substr($str_statuts, 0, 1) == '!' ? 'NOT' : '');
99                                        $str_statuts = str_replace('!', '', $str_statuts);
100                                        $Tstatuts = array_filter(explode(',', $str_statuts));
101                                        $statuts = " AND " . sql_in("O.$c_statut", $Tstatuts, $not);
102                                } // objets sans champ previsu ou avec un previsu == '!' (par ex les rubriques)
103                                else {
104                                        $statuts = " AND " . sql_in("O.$c_statut",
105                                                        ($GLOBALS['connect_statut'] == "0minirezo") ? array('prepa', 'prop', 'publie') : array('prop', 'publie'));
106                                }
107                        }
108                        $res = sql_allfetsel(
109                                "COUNT(*) AS cnt, L.id_mot",
110                                "spip_mots_liens AS L
111                                        LEFT JOIN spip_mots AS M ON L.id_mot=M.id_mot
112                                                AND L.objet=" . sql_quote($objet) . "
113                                        LEFT JOIN " . $table_objet_sql . " AS O ON L.id_objet=O.$_id_objet",
114                                "M.id_groupe=$id_groupe$statuts",
115                                "L.id_mot");
116                        foreach ($res as $row) {
117                                $retour[$table_objet_sql][$row['id_mot']] = $row['cnt'];
118                        }
119                }
120        }
121
122        return $retour;
123}
124
125?>
Note: See TracBrowser for help on using the repository browser.