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

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

Plugin pour gérer éventuellement des redirections sur des objets éditoriaux autres que les articles.
On reprend le même principe en configurant les objets sur lesquels ont veut appliquer le fonctionnement ;
les tables SQL des objets reçoivent alors un champ 'virtuel' en plus, qui peut être renseigné
par le formulaire de redirection sur la vue de l'objet.
La redirection se fait alors normallement comme elle se faisait pour les articles.

Nécessite SPIP 3.1 ou 3.2 SVN de ce soir.

File size: 3.6 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 stsring $connect
53 * @return array|bool|null
54 */
55function quete_objet_virtuel($objet, $id_objet, $connect) {
56        $table = table_objet_sql($objet);
57        $infos = lister_tables_objets_sql($table);
58        $id_table_objet = id_table_objet($objet);
59
60        $where = [$id_table_objet . '=' . intval($id_objet)];
61
62        // gros bazar pour prendre en compte du mieux que l'on peut le champ statut
63        // s'il y en a un de déclaré.
64        if (!empty($infos['statut'])) {
65                $principal = array_shift($infos['statut']);
66                if (
67                        !empty($principal['champ'])
68                        and !empty($principal['publie'])
69                        and !empty($infos['field'][$principal['champ']])
70                ) {
71                        if ($principal['publie'][0] == '!') {
72                                $where[] = $principal['champ'] . "!=" . sql_quote(substr($principal['publie'], 1));
73                        } else {
74                                $where[] = $principal['champ'] . "=" . sql_quote($principal['publie']);
75                        }
76                }
77        }
78
79        return sql_getfetsel(
80                'virtuel',
81                $table,
82                $where,
83                '',
84                '',
85                '',
86                '',
87                $connect
88        );
89}
90
91
92
93
94/**
95 * Si le champ virtuel est non vide c'est une redirection.
96 * avec un éventuel raccourci Spip
97 *
98 * Si le raccourci a un titre il sera pris comme corps du 302
99 *
100 * @param string $fond
101 * @param array $contexte
102 * @param string $connect
103 * @return array|bool
104 */
105function public_tester_redirection($fond, $contexte, $connect) {
106        include_spip('objets_virtuels_fonctions');
107
108        $table = table_objet_sql($fond);
109
110        if (in_array($table, objets_virtuels_tables_actives())) {
111                $id_table_objet = id_table_objet($table);
112                if (
113                        isset($contexte[$id_table_objet])
114                        and $id_objet = intval($contexte[$id_table_objet])
115                ) {
116                        $objet = objet_type($table);
117                        $m = quete_objet_virtuel($objet, $id_objet, $connect);
118                        if (strlen($m)) {
119                                include_spip('inc/texte');
120                                // les navigateurs pataugent si l'URL est vide
121                                if ($url = virtuel_redirige($m, true)) {
122                                        // passer en url absolue car cette redirection pourra
123                                        // etre utilisee dans un contexte d'url qui change
124                                        // y compris url arbo
125                                        $status = 302;
126                                        if (defined('_STATUS_REDIRECTION_VIRTUEL')) {
127                                                $status = _STATUS_REDIRECTION_VIRTUEL;
128                                        }
129                                        if (!preg_match(',^\w+:,', $url)) {
130                                                include_spip('inc/filtres_mini');
131                                                $url = url_absolue($url);
132                                        }
133                                        $url = str_replace('&amp;', '&', $url);
134
135                                        return array(
136                                                'texte' => "<"
137                                                        . "?php include_spip('inc/headers');redirige_par_entete('"
138                                                        . texte_script($url)
139                                                        . "','',$status);"
140                                                        . "?" . ">",
141                                                'process_ins' => 'php',
142                                                'status' => $status
143                                        );
144                                }
145                        }
146                }
147        }
148
149        return false;
150}
Note: See TracBrowser for help on using the repository browser.