-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathXDetectMobileBrowser.php
138 lines (125 loc) · 5.56 KB
/
XDetectMobileBrowser.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
/**
* XDetectMobileBrowser class file.
*
* @author Marco van 't Wout <[email protected]>
* @copyright Copyright © Tremani, 2014
*/
/**
* Handles detecting mobile browsers.
* @see README.md
*/
class XDetectMobileBrowser extends CApplicationComponent
{
/**
* Cookie name for storing user preference
*/
const COOKIE_NAME_SHOW = 'showMobile';
/**
* Cookie name for storing detected result
*/
const COOKIE_NAME_IS = 'isMobile';
/**
* @var bool set secure cookies
*/
public $secure = false;
/**
* @var bool set http only cookies
*/
public $httpOnly = false;
/**
* @var boolean show mobile version to the client?
*/
protected $_showMobile;
/**
* @var boolean is mobile device detected?
*/
protected $_isMobile;
/**
* Check user preference for mobile.
* Store result in class var and cookie.
*/
public function getShowMobile()
{
if (!isset($this->_showMobile)) {
$cookie = Yii::app()->request->cookies[self::COOKIE_NAME_SHOW];
if (isset($cookie)) {
$this->_showMobile = (bool)$cookie->value; // int to bool
} else {
$this->setShowMobile($this->getIsMobile());
}
}
return $this->_showMobile;
}
/**
* Set user preference for showMobile.
* Store result in class var and cookie.
* @param bool $value
*/
public function setShowMobile($value)
{
$this->resetShowMobile();
$this->_showMobile = (bool)$value;
$this->setCookie(self::COOKIE_NAME_SHOW, $this->_showMobile);
}
/**
* Detect if user is mobile.
* Store result in class var and cookie.
*/
public function getIsMobile()
{
if (!isset($this->_isMobile)) {
$cookie = Yii::app()->request->cookies[self::COOKIE_NAME_IS];
if (isset($cookie)) {
$this->_isMobile = (bool)$cookie->value; // int to bool
} else {
$this->_isMobile = $this->isMobileBrowser();
$this->setCookie(self::COOKIE_NAME_IS, $this->_isMobile);
}
}
return $this->_isMobile;
}
/**
* Clears the cookie for user preference.
*/
public function resetShowMobile()
{
unset(Yii::app()->request->cookies[self::COOKIE_NAME_SHOW]);
}
/**
* Clears the cookie for detected value.
*/
public function resetIsMobile()
{
unset(Yii::app()->request->cookies[self::COOKIE_NAME_IS]);
}
/**
* Set cookie for storing isMobile
* @var string cookie name
* @var boolean value (must be stored as int)
*/
protected function setCookie($cookieName, $value)
{
$cookie = new CHttpCookie($cookieName, (int)$value); // bool to int
$cookie->expire = time()+(3600*24*365); //1 year
$cookie->path = Yii::app()->baseUrl . '/';
$cookie->secure = $this->secure;
$cookie->httpOnly = $this->httpOnly;
Yii::app()->request->cookies[$cookieName] = $cookie;
}
/**
* Performs a regexp check on the User Agent string to determine if this is a mobile browser.
* I kindly asked them to put their code on GitHub, but no response.
* Last updated: 1-8-2014
* @see http://detectmobilebrowsers.com/
* @return bool is mobile
*/
protected function isMobileBrowser()
{
if (!isset($_SERVER['HTTP_USER_AGENT'])) {
return false;
}
$useragent=$_SERVER['HTTP_USER_AGENT'];
return preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4));
}
}