source: spip-zone/_plugins_/paniers/trunk/inc/paniers.php

Last change on this file was 107568, checked in by nicolas.dorigny@…, 11 months ago

PSR

File size: 5.0 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) {
5        return;
6}
7
8/*
9 * Chercher le panier associé au visiteur actuel. Cette fonction ne crée pas de panier.
10 *
11 * @return Retourne l'identifiant du panier en cours
12 */
13function paniers_id_panier_encours() {
14        static $id_panier;
15        // Si on a déjà fait les calculs, on termine déjà
16        if ($id_panier > 0) {
17                return $id_panier;
18        }
19
20        // si rien en cookie ni session, rien a faire (perf issue visiteurs anonymes)
21        if (!(isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_panier'])
22                OR (isset($GLOBALS['visiteur_session']['id_panier']) AND $GLOBALS['visiteur_session']['id_panier'])
23                OR (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']))) {
24                return $id_panier;
25        }
26
27        $id_panier = 0;
28
29        // le session id_panier est toujours pose d'apres le cookie, donc si il est la on peut s'y fier
30        // c'est plus rapide
31        if (isset($GLOBALS['visiteur_session']['id_panier']) AND $id_panier = intval($GLOBALS['visiteur_session']['id_panier'])) {
32                return $id_panier;
33        }
34
35        // sinon on regarde le cookie
36        $nom_cookie = $GLOBALS['cookie_prefix'] . '_panier';
37        $cookie     = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : null;
38
39        // On va chercher un panier existant en cours, correspondant au cookie
40        if ($cookie) {
41                include_spip('base/abstract_sql');
42                $id_panier = intval(sql_getfetsel(
43                        'id_panier',
44                        'spip_paniers',
45                        array(
46                                'cookie = ' . sql_quote($cookie),
47                                'statut = ' . sql_quote('encours'),
48                        )
49                ));
50        }
51
52        // S'il n'y a pas de panier avec le cookie, on regarde si le visiteur est identifie
53        // et si un panier est lié a son id_auteur
54        if (!$id_panier
55                AND isset($GLOBALS['visiteur_session']['id_auteur'])
56                AND $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur'])
57                AND include_spip('base/abstract_sql')
58                AND $panier = sql_fetsel(
59                        'id_panier, cookie, date',
60                        'spip_paniers',
61                        array(
62                                'id_auteur = ' . $id_auteur,
63                                'statut = ' . sql_quote('encours'),
64                        ),
65                        '',
66                        'date desc',
67                        '0,1'
68                )) {
69                $date   = $panier['date'];
70                $cookie = $panier['cookie'];
71
72                if (!function_exists('lire_config')) {
73                        include_spip('inc/config');
74                }
75
76                // Mais ce panier n'est valide que s'il n'est pas trop vieux !
77                if (time() < $st = strtotime("$date + " . 3600 * intval(lire_config('paniers/limite_enregistres',
78                                        168)) . 'seconds')) {
79                        // Dans ce cas on le prend
80                        $id_panier = intval($panier['id_panier']);
81                }
82        }
83
84        // Si on a bien un panier et un cookie à la fin
85        // synchroniser cookie et id_auteur en session
86        if ($id_panier > 0 and $cookie) {
87                if (!function_exists('lire_config')) {
88                        include_spip('inc/config');
89                }
90                if (!function_exists('spip_setcookie')) {
91                        include_spip('inc/cookie');
92                }
93                // On met son cookie en mémoire
94                spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie,
95                        time() + 3600 * lire_config('paniers/limite_ephemere', 24));
96                // On (re)met le panier dans la session si besoin
97                if (!isset($GLOBALS['visiteur_session']['id_panier']) OR $GLOBALS['visiteur_session']['id_panier'] != $id_panier) {
98                        if (!function_exists('session_set')) {
99                                include_spip('inc/session');
100                        }
101                        session_set('id_panier', $id_panier);
102                }
103        } // Sinon on vide le cookie et la session si besoin => evite un appel a cette fonction au prochain hit
104        else {
105                paniers_supprimer_panier_en_cours();
106        }
107
108        // On retourne enfin un panier (ou pas)
109        return $id_panier;
110}
111
112/**
113 * Supprimer completement le panier en cours (cookie et session SPIP)
114 */
115function paniers_supprimer_panier_en_cours() {
116        $nom_cookie = $GLOBALS['cookie_prefix'] . '_panier';
117        if (isset($_COOKIE[$nom_cookie])) {
118                if (!function_exists('spip_setcookie')) {
119                        include_spip('inc/cookie');
120                }
121                spip_setcookie($nom_cookie, '', 0);
122                unset($_COOKIE[$nom_cookie]);
123        }
124        if (isset($GLOBALS['visiteur_session']['id_panier'])) {
125                if (!function_exists('session_set')) {
126                        include_spip('inc/session');
127                }
128                session_set('id_panier');
129        }
130}
131
132/*
133 * Crée un panier pour le visiteur actuel et crée un cookie lié
134 *
135 * @return int Retourne l'identifiant du panier créé
136 */
137function paniers_creer_panier() {
138        include_spip("inc/acces");
139        include_spip('inc/session');
140        include_spip('base/abstract_sql');
141        include_spip('inc/cookie');
142
143        $id_auteur  = session_get('id_auteur') > 0 ? session_get('id_auteur') : 0;
144        $nom_cookie = $GLOBALS['cookie_prefix'] . '_panier';
145
146        // On crée l'identifiant du cookie
147        $cookie = creer_uniqid();
148
149        // On crée le panier
150        $id_panier = intval(sql_insertq(
151                'spip_paniers',
152                array(
153                        'id_auteur' => $id_auteur ? $id_auteur : 0,
154                        'cookie'    => $cookie,
155                        'date'      => date('Y-m-d H:i:s'),
156                )
157        ));
158
159        // Si on a un id_panier correct de créé, on le lie à un cookie
160        if ($id_panier > 0) {
161                spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie,
162                        time() + 3600 * lire_config('paniers/limite_ephemere', 24));
163                // Et on met aussi le panier dans la session
164                session_set('id_panier', $id_panier);
165        }
166
167        // On retourne
168        return $id_panier;
169}
170
Note: See TracBrowser for help on using the repository browser.