source: spip-zone/_plugins_/objets_virtuels/trunk/objets_virtuels_fonctions.php

Last change on this file was 103934, checked in by marcimat@…, 3 years ago

On intègre l'ensemble du plugin Rubriques Virtuelles de Kent1 que je mets en auteur du coup.
Ainsi, les rubriques qui ont un champ virtuelles sont publiées automatiquement.
Et on ne peut pas supprimer un objet qui a une redirection sans avoir préalablement enlevé la redirection.

File size: 3.7 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Objets virtuels
4 *
5 * @plugin     Objets virtuels
6 * @copyright  2017
7 * @author     Matthieu Marcillaud
8 * @licence    GNU/GPL
9 * @package    SPIP\Objets_virtuels\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Retourne la liste des tables où le champ virtuel est activé
18 *
19 * On prend en compte la configuration de ce plugin et la configuration
20 * du champ 'virtuel' sur les articles (historique)
21 */
22function objets_virtuels_tables_actives() {
23        $tables = lire_config('objets_virtuels', '');
24        $tables = array_filter(explode(',', $tables));
25        if (lire_config('articles_redirection') == 'oui') {
26                $tables = array_unique(array_merge($tables, ['spip_articles']));
27        }
28        return $tables;
29}
30
31/**
32 * Afficher le lien de redirection d'un objet virtuel si il y a lieu
33 *
34 * @param string $virtuel
35 * @return string
36 */
37function lien_objet_virtuel($virtuel) {
38        include_spip('inc/lien');
39        if (!$virtuel = virtuel_redirige($virtuel)) {
40                return '';
41        }
42
43        return propre("[->" . $virtuel . "]");
44}
45
46
47/**
48 * Retourne l'URL de redirection d'un objet virtuel, seulement si il est publié
49 *
50 * @param string $objet
51 * @param int $id_objet
52 * @param string $connect
53 * @param bool $statut Test du statut ?
54 * @return array|bool|null
55 */
56function quete_objet_virtuel($objet, $id_objet, $connect = '', $statut = false) {
57        $table = table_objet_sql($objet);
58        $infos = lister_tables_objets_sql($table);
59        $id_table_objet = id_table_objet($objet);
60
61        $where = [$id_table_objet . '=' . intval($id_objet)];
62
63        // gros bazar pour prendre en compte du mieux que l'on peut le champ statut
64        // s'il y en a un de déclaré.
65        if ($statut and !empty($infos['statut'])) {
66                $principal = array_shift($infos['statut']);
67                if (
68                        !empty($principal['champ'])
69                        and !empty($principal['publie'])
70                        and !empty($infos['field'][$principal['champ']])
71                ) {
72                        if ($principal['publie'][0] == '!') {
73                                $where[] = $principal['champ'] . "!=" . sql_quote(substr($principal['publie'], 1));
74                        } else {
75                                $where[] = $principal['champ'] . "=" . sql_quote($principal['publie']);
76                        }
77                }
78        }
79
80        return sql_getfetsel(
81                'virtuel',
82                $table,
83                $where,
84                '',
85                '',
86                '',
87                '',
88                $connect
89        );
90}
91
92
93
94
95/**
96 * Si le champ virtuel est non vide c'est une redirection.
97 * avec un éventuel raccourci Spip
98 *
99 * Si le raccourci a un titre il sera pris comme corps du 302
100 *
101 * @param string $fond
102 * @param array $contexte
103 * @param string $connect
104 * @return array|bool
105 */
106function public_tester_redirection($fond, $contexte, $connect) {
107        include_spip('objets_virtuels_fonctions');
108
109        $table = table_objet_sql($fond);
110
111        if (in_array($table, objets_virtuels_tables_actives())) {
112                $id_table_objet = id_table_objet($table);
113                if (
114                        isset($contexte[$id_table_objet])
115                        and $id_objet = intval($contexte[$id_table_objet])
116                ) {
117                        $objet = objet_type($table);
118                        $m = quete_objet_virtuel($objet, $id_objet, $connect, true);
119                        if (strlen($m)) {
120                                include_spip('inc/texte');
121                                // les navigateurs pataugent si l'URL est vide
122                                if ($url = virtuel_redirige($m, true)) {
123                                        // passer en url absolue car cette redirection pourra
124                                        // etre utilisee dans un contexte d'url qui change
125                                        // y compris url arbo
126                                        $status = 302;
127                                        if (defined('_STATUS_REDIRECTION_VIRTUEL')) {
128                                                $status = _STATUS_REDIRECTION_VIRTUEL;
129                                        }
130                                        if (!preg_match(',^\w+:,', $url)) {
131                                                include_spip('inc/filtres_mini');
132                                                $url = url_absolue($url);
133                                        }
134                                        $url = str_replace('&amp;', '&', $url);
135
136                                        return array(
137                                                'texte' => "<"
138                                                        . "?php include_spip('inc/headers');redirige_par_entete('"
139                                                        . texte_script($url)
140                                                        . "','',$status);"
141                                                        . "?" . ">",
142                                                'process_ins' => 'php',
143                                                'status' => $status
144                                        );
145                                }
146                        }
147                }
148        }
149
150        return false;
151}
Note: See TracBrowser for help on using the repository browser.