source:
spip-zone/_plugins_/pages_mobiles/pages_mobiles_options.php
@
67726
Last change on this file since 67726 was 67726, checked in by , 8 years ago | |
---|---|
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 | |
8 | if (!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 | */ |
111 | function 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 | */ |
139 | function 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 |
155 | if (!defined('_SPIP_SCRIPT')) define('_SPIP_SCRIPT', 'spip.php'); |
156 | |
157 | include_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 |
167 | if ($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.