From cc96692eb8f101e1257c58e77bcf92c3d9e60898 Mon Sep 17 00:00:00 2001 From: Aleksei Miheev Date: Sun, 12 Feb 2012 17:23:52 +0400 Subject: [PATCH] add basic mobile user detection --- Mobile_Detect.php | 92 +++++++++++++++++++++++++++++++++++++++++++++++ index.php | 4 +++ 2 files changed, 96 insertions(+) create mode 100644 Mobile_Detect.php diff --git a/Mobile_Detect.php b/Mobile_Detect.php new file mode 100644 index 0000000..439ed09 --- /dev/null +++ b/Mobile_Detect.php @@ -0,0 +1,92 @@ + "android.*mobile", + "androidtablet" => "android(?!.*mobile)", + "blackberry" => "blackberry", + "blackberrytablet" => "rim tablet os", + "iphone" => "(iphone|ipod)", + "ipad" => "(ipad)", + "palm" => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)", + "windows" => "windows ce; (iemobile|ppc|smartphone)", + "windowsphone" => "windows phone os", + "generic" => "(kindle|mobile|mmp|midp|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap|opera mini)" + ); + + public function __construct() + { + $this->userAgent = $_SERVER['HTTP_USER_AGENT']; + $this->accept = $_SERVER['HTTP_ACCEPT']; + + if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { + $this->isMobile = true; + } elseif (strpos($this->accept, 'text/vnd.wap.wml') > 0 || strpos($this->accept, 'application/vnd.wap.xhtml+xml') > 0) { + $this->isMobile = true; + } else { + foreach ($this->devices as $device => $regexp) { + if ($this->isDevice($device)) { + $this->isMobile = true; + } + } + } + } + + /** + * Overloads isAndroid() | isAndroidtablet() | isIphone() | isIpad() | isBlackberry() | isBlackberrytablet() | isPalm() | isWindowsphone() | isWindows() | isGeneric() through isDevice() + * + * @param string $name + * @param array $arguments + * @return bool + */ + public function __call($name, $arguments) + { + $device = substr($name, 2); + if ($name == "is" . ucfirst($device) && array_key_exists(strtolower($device), $this->devices)) { + return $this->isDevice($device); + } else { + trigger_error("Method $name not defined", E_USER_WARNING); + } + } + + /** + * Returns true if any type of mobile device detected, including special ones + * @return bool + */ + public function isMobile() + { + return $this->isMobile; + } + + protected function isDevice($device) + { + $var = "is" . ucfirst($device); + $return = $this->$var === null ? (bool) preg_match("/" . $this->devices[strtolower($device)] . "/i", $this->userAgent) : $this->$var; + if ($device != 'generic' && $return == true) { + $this->isGeneric = false; + } + + return $return; + } + +} diff --git a/index.php b/index.php index 9e0ca15..a805de2 100644 --- a/index.php +++ b/index.php @@ -82,6 +82,10 @@ reloadSettings(); cleanRequest(); $context = array(); +include("Mobile_Detect.php"); +$detect = new Mobile_Detect(); +define('MOBILE', $detect->isMobile()); + // Determine if this is should be using WAP, WAP2, or imode. define('WIRELESS', isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || isset($_REQUEST['imode']));