source: spip-zone/_plugins_/pages_mobiles/pages_mobiles_options.php @ 67726

Last change on this file since 67726 was 67726, checked in by bmarne@…, 8 years ago

Correction d'un bug de transmission des paramètres: urls_decoder_url() retourne pafois du vide pour le contexte alors qu'il y e n a (pages recherches après un post par exemple). Donc on cherche les paramètres dans l'URL à la "main" (dans la query string).

incrément de version

File size: 11.4 KB
Line 
1<?php
2/**
3 * Plugin Pages pour mobiles
4 * (c) 2012 C. Imberti, B. Marne, JM. Labat
5 * Licence Creative commons BY-NC-SA
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9
10/**
11 * La fonction renvoie web s'il faut afficher le site classique,
12 * sinon elle renvoie le type de mobile.
13 * La détection passe par plusieurs phases décrites
14 * ici: http://contrib.spip.net/IMG/pdf/description_du_plugin_cimobile_110726.pdf
15 *
16 * À noter que le cookie est renommé "pages_mobiles"
17 *  comme le paramètre d'URL à passer "&pages_mobiles=le_nom_du_type_de_mobile"
18 *
19 *
20 * @return string
21 *     "web" ou le type de mobile, ou "autre_mobile".
22**/
23//
24
25        function pages_mobiles_detecter_mobile() {
26
27        // Par défaut c'est vide...
28        $pages_mobiles = '';
29
30
31        // Le parametre d'URL pages_mobiles est-il present ?
32        // On peut forcer l'affichage du site web classique et inversement retourner a la vue non classique
33        $pages_mobiles = isset($_GET['pages_mobiles']) ? $_GET['pages_mobiles'] : '';
34
35
36       
37        // Sinon un cookie de squelette est-il present ?
38        if (!$pages_mobiles) {
39                $pages_mobiles = isset($_COOKIE['pages_mobiles']) ? $_COOKIE['pages_mobiles'] : '';
40        }
41        // détection du mobile
42        if (!$pages_mobiles) {
43
44                $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?strtolower($_SERVER['HTTP_USER_AGENT']):'';
45               
46                // Cas d'un desktop (pour eviter des tests inutiles)
47                if (strpos($user_agent,'firefox')!==false AND strpos($user_agent,'fennec')===false) {
48                        // firefox (sauf version mobile)
49                        $pages_mobiles = 'web';
50                } elseif (strpos($user_agent,'msie')!==false AND strpos($user_agent,'windows ce')===false AND strpos($user_agent,'iemobile')===false) {
51                        // internet explorer (sauf version mobile)
52                        $pages_mobiles = 'web';
53                }
54                // Tableau des mobiles individualises (smartphones et tablettes)
55                // expression reguliere sur le user agent => nom du mobile
56                $mobiles = pages_mobiles_types_mobiles();
57                               
58                foreach($mobiles as $regexp=>$val){
59                        if (preg_match($regexp,$user_agent)) {
60                        $pages_mobiles = $val;
61                        break;
62                        }
63                }
64
65
66               
67
68                // Les autres cas
69                if (!$pages_mobiles) {
70                        $httpaccept = isset($_SERVER['HTTP_ACCEPT'])?strtolower($_SERVER['HTTP_ACCEPT']):'';
71                        $user_agent_4car = substr($user_agent,0,4);
72                       
73                        if (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|m881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|s800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|d736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |sonyericsson|samsung|240x|x320|vx10|nokia|sony cmd|motorola|up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|psp|treo)/i',$user_agent))
74                        $pages_mobiles = 'autre_mobile';
75                                       
76                elseif ((strpos($httpaccept,'text/vnd.wap.wml')>0)||(strpos($httpaccept,'application/vnd.wap.xhtml+xml')>0))
77                        $pages_mobiles = 'autre_mobile';
78                       
79                elseif (isset($_SERVER['HTTP_X_WAP_PROFILE'])||isset($_SERVER['HTTP_PROFILE']))
80                        $pages_mobiles = 'autre_mobile';
81               
82                elseif (in_array($user_agent_4car, array('1207','3gso','4thp','501i','502i','503i','504i','505i','506i','6310','6590','770s','802s','a wa','acer','acs-','airn','alav','asus','attw','au-m','aur ','aus ','abac','acoo','aiko','alco','alca','amoi','anex','anny','anyw','aptu','arch','argo','bell','bird','bw-n','bw-u','beck','benq','bilb','blac','c55/','cdm-','chtm','capi','cond','craw','dall','dbte','dc-s','dica','ds-d','ds12','dait','devi','dmob','doco','dopo','el49','erk0','esl8','ez40','ez60','ez70','ezos','ezze','elai','emul','eric','ezwa','fake','fly-','fly_','g-mo','g1 u','g560','gf-5','grun','gene','go.w','good','grad','hcit','hd-m','hd-p','hd-t','hei-','hp i','hpip','hs-c','htc ','htc-','htca','htcg','htcp','htcs','htct','htc_','haie','hita','huaw','hutc','i-20','i-go','i-ma','i230','iac','iac-','iac/','ig01','im1k','inno','iris','jata','java','kddi','kgt','kgt/','kpt ','kwc-','klon','lexi','lg g','lg-a','lg-b','lg-c','lg-d','lg-f','lg-g','lg-k','lg-l','lg-m','lg-o','lg-p','lg-s','lg-t','lg-u','lg-w','lg/k','lg/l','lg/u','lg50','lg54','lge-','lge/','lynx','leno','m1-w','m3ga','m50/','maui','mc01','mc21','mcca','medi','meri','mio8','mioa','mo01','mo02','mode','modo','mot ','mot-','mt50','mtp1','mtv ','mate','maxo','merc','mits','mobi','motv','mozz','n100','n101','n102','n202','n203','n300','n302','n500','n502','n505','n700','n701','n710','nec-','nem-','newg','neon','netf','noki','nzph','o2 x','o2-x','opwv','owg1','opti','oran','p800','pand','pg-1','pg-2','pg-3','pg-6','pg-8','pg-c','pg13','phil','pn-2','pt-g','palm','pana','pire','pock','pose','psio','qa-a','qc-2','qc-3','qc-5','qc-7','qc07','qc12','qc21','qc32','qc60','qci-','qwap','qtek','r380','r600','raks','rim9','rove','s55/','sage','sams','sc01','sch-','scp-','sdk/','se47','sec-','sec0','sec1','semc','sgh-','shar','sie-','sk-0','sl45','slid','smb3','smt5','sp01','sph-','spv ','spv-','sy01','samm','sany','sava','scoo','send','siem','smar','smit','soft','sony','t-mo','t218','t250','t600','t610','t618','tcl-','tdg-','telm','tim-','ts70','tsm-','tsm3','tsm5','tx-9','tagt','talk','teli','topl','hiba','up.b','upg1','utst','v400','v750','veri','vk-v','vk40','vk50','vk52','vk53','vm40','vx98','virg','vite','voda','vulc','w3c ','w3c-','wapj','wapp','wapu','wapm','wig ','wapi','wapr','wapv','wapy','wapa','waps','wapt','winc','winw','wonu','x700','xda2','xdag','yas-','your','zte-','zeto','acs-','alav','alca','amoi','aste','audi','avan','benq','bird','blac','blaz','brew','brvw','bumb','ccwa','cell','cldc','cmd-','dang','doco','eml2','eric','fetc','hipt','http','ibro','idea','ikom','inno','ipaq','jbro','jemu','java','jigs','kddi','keji','kyoc','kyok','leno','lg-c','lg-d','lg-g','lge-','libw','m-cr','maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','mywa','nec-','newt','nok6','noki','o2im','opwv','palm','pana','pant','pdxg','phil','play','pluc','port','prox','qtek','qwap','rozo','sage','sama','sams','sany','sch-','sec-','send','seri','sgh-','shar','sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-','tosh','treo','tsm-','upg1','upsi','vk-v','voda','vx52','vx53','vx60','vx61','vx70','vx80','vx81','vx83','vx85','wap-','wapa','wapi','wapp','wapr','webc','whit','winw','wmlb','xda-'),true))           
83                        $pages_mobiles = "autre_mobile";
84                        }
85
86        }
87        if ($pages_mobiles) {
88                // Securite
89                if (preg_match(',^[0-9a-z_]*$,i', $pages_mobiles)) {
90               
91                        // Poser un cookie s'il n'existe pas ou si son contenu doit changer
92                        if (!isset($_COOKIE['pages_mobiles']) OR (isset($_COOKIE['pages_mobiles']) AND $_COOKIE['pages_mobiles']!=$pages_mobiles)){
93                                include_spip('inc/cookie');
94                                spip_setcookie('pages_mobiles', $pages_mobiles);
95                        }
96
97                }
98        }
99
100// si ce n'était pas un mobile (ou n'avait pas le cookie ou l'URL), c'est web...
101        return ($pages_mobiles ? $pages_mobiles : 'web');
102
103}
104
105/**
106 * Tableau des mobiles individualises (smartphones et tablettes)
107 * (les anciens mobiles sont deja pris en compte avec 'autre_mobile')
108 *
109 * @return array (expression reguliere sur le user agent => nom du mobile)
110 */
111function pages_mobiles_types_mobiles() {
112        return array(
113                ',iphone,i'=>'iphone',
114                ',ipod,i'=>'ipod',
115                ',ipad,i'=>'ipad',
116                ',xoom,i'=>'androidtablette',
117                ',android,i'=>'android',
118                ',blackberry,i'=>'blackberry',
119                ',Windows Phone OS 7,i'=>'windowsphone7',
120                '/(iris|3g_t|windows ce|opera mobi|windows ce; smartphone;|windows ce; iemobile)/i'=>'windowsmobile',
121                ',opera mini,i'=>'opera',
122                '/(series60|series 60)/i'=>'S60',
123                '/(symbian|series60|series70|series80|series90)/i'=>'symbianos',
124                ',webos,i'=>'palmwebos',
125                '/(pre\/|palm os|palm|hiptop|avantgo|plucker|xiino|blazer|elaine)/i'=>'palmos',
126                '/nuvifone/i'=>'nuvifone',
127                '/(qt embedded|com2)/i'=>'sonymylo',
128                '/maemo/i'=>'nokiatablette',
129                '/playbook/i'=>'blackberrytablette',
130                '/archos/i'=>'archos'
131                );
132}       
133
134/**
135 * Tableau des groupes de mobiles
136 *
137 * @return array (groupe de mobiles => tableau des mobiles correspondants)
138 */
139function pages_mobiles_groupes_mobiles() {
140        return array(
141                'ios_phones' => array('iphone','ipod'),
142                'smartphones' => array('android','blackberry','windowsphone7','windowsmobile','opera','S60','symbianos','palmwebos','palmos','nuvifone','sonymylo'),
143                'tablettes' => array('ipad','androidtablette','nokiatablette','blackberrytablette','archos'),
144                'autres_mobiles' => array('autre_mobile')
145        );
146}
147
148
149// À chaque hit on regarde sur quelle page on est.
150// Si on est dans la liste des pages développées en mobile, alors
151// on redirige vers la page mobile
152
153// le define est necessaire quand on appelle urls_decoder_url(), voir:
154// http://thread.gmane.org/gmane.comp.web.spip.zone/29186/focus=29214
155if (!defined('_SPIP_SCRIPT')) define('_SPIP_SCRIPT', 'spip.php');
156
157include_spip('inc/urls');
158$url_decodee = urls_decoder_url($GLOBALS['REQUEST_URI']);
159
160// urls_decoder_url() retourne le type de page et le contexte
161$contexte = $url_decodee[1];
162$type_page = $url_decodee[0];
163// soit le type de page est déterminé par l'objet demandé, soit par page
164$type_page = $type_page ? $type_page : $_GET[page];
165
166// si on est pas déjà en train de rediriger vers les pages mobiles
167if ($type_page!="pages_mobiles" AND !test_espace_prive()) {
168
169        // Pas de type de page alors c'est le sommaire
170        if (!$type_page) $type_page = "sommaire";
171
172        // on identifie le type de navigation
173        $type_mobile = pages_mobiles_detecter_mobile();
174
175        // Si ce n'est pas web
176        if ($type_mobile !== 'web') {
177
178                // Par défaut on cherche le squelette mobile de l'objet
179                // dans un sous repertoire nommé comme type de mobile renvoyé par la detection
180                // ex. iphone/article.html
181                //
182                // Voir la fonction pages_mobiles_detecter_mobile() pour les différents types.
183                // Idem pour le groupe de mobile (voir pages_mobiles_groupes_mobiles())
184                //
185                // S'il n'y a pas le squelette de l'objet dans le repertoire specifique de ce type ou du groupe,
186                // c'est le repertoire "mobile" qui est choisi
187                // ex. mobile/rubrique.html
188
189                $chemin_mobile = $type_mobile."/".$type_page;
190
191                // si on ne trouve pas la page pour le mobile on cherche pour le groupe de mobile
192                if (!find_in_path($chemin_mobile.".html"))
193                                $chemin_mobile = pages_mobiles_groupes_mobiles($type_mobile)."/".$type_page;
194               
195                // si on ne trouve pas la page pour le groupe de mobile on cherche dans le répertoire générique
196                if (!find_in_path($chemin_mobile.".html")) $chemin_mobile = "mobile/".$type_page;
197
198                // si le squelette existe, on redirige vers une page pivot qui à son tour include la page mobile
199                // C'est necessaire car seul l'admin peut accéder à des pages placées dans un sous répertoire de
200                // l'arborescence.
201                if (find_in_path($chemin_mobile.".html")) {
202                        foreach ($contexte as $key => $value) {
203                                $liste_params .= "&".$key."=".$value;
204                        }
205                        // ??? étrange, le $contexte est parfois vide, il faut alors aller rechercher les paramètres dans la query_string
206                        if (!$contexte) {
207                                foreach(explode("&",$_SERVER['QUERY_STRING']) as $value) {
208                                        if (substr($value,0,5) != "page=") $liste_params .= "&".$value;
209                                }
210                        }
211                        include_spip('inc/headers');
212                        redirige_par_entete("spip.php?page=pages_mobiles&squelette_mobile=$chemin_mobile".$liste_params);
213                }
214
215        }
216}
217// sinon, on ne change rien à l'affichage (affichage par défaut)
218
219?>
Note: See TracBrowser for help on using the repository browser.