source: spip-zone/_squelettes_/mobi.spip/detect/mobile_detect.php @ 42912

Last change on this file since 42912 was 42912, checked in by cedric@…, 9 years ago

mobile detection

File size: 4.1 KB
Line 
1<?php
2
3/**
4 * Mobile Detect
5 *
6 * @author     vic.stanciu - http://code.google.com/u/vic.stanciu
7 * @version    2010-08-30 15:17 MobileDetect.class.php updated by bkuberek http://github.com/bkuberek
8 * @todo       Make better Device Identification
9 *
10 * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
11 *
12 * example:
13 *         $detect = MobileDetect::getInstance();
14 *         if ($detect->isMobile()) { ... }
15 *         if ($detect->isIphone()) { ... }
16 *         ...etc.
17 */
18class MobileDetect {
19
20  /**
21   * @var MobileDetect
22   */
23  static protected $instance;
24
25  /**
26   * @var boolean
27   */
28  protected $accept;
29
30  /**
31   * @var boolean
32   */
33  protected $userAgent;
34
35  /**
36   * @var string
37   */
38  protected $device;
39
40  /**
41   * @var boolean
42   */
43  protected $isMobile     = false;
44
45  /**
46   * @var boolean
47   */
48  protected $isAndroid    = null;
49
50  /**
51   * @var boolean
52   */
53  protected $isIphone     = null;
54
55  /**
56   * @var boolean
57   */
58  protected $isBlackberry = null;
59
60  /**
61   * @var boolean
62   */
63  protected $isOpera      = null;
64
65  /**
66   * @var boolean
67   */
68  protected $isPalm       = null;
69
70  /**
71   * @var boolean
72   */
73  protected $isWindows    = null;
74
75  /**
76   * @var boolean
77   */
78  protected $isGeneric    = null;
79
80  /**
81   * Available devices and their respective matching pattern
82   *
83   * @var array [device] => pattern
84   */
85  protected $devices      = array(
86      "android"    => "android",
87      "blackberry" => "blackberry",
88      "iphone"     => "(iphone|ipod)",
89      "opera"      => "opera mini",
90      "palm"       => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)",
91      "windows"    => "windows ce; (iemobile|ppc|smartphone)",
92      "generic"    => "(kindle|mobile|mmp|midp|o2|pda|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap)"
93  );
94
95  /**
96   * Constructor - checks request headers hydrate properties
97   */
98  protected function __construct() {
99    $this->userAgent = $_SERVER['HTTP_USER_AGENT'];
100    $this->accept    = $_SERVER['HTTP_ACCEPT'];
101
102    if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
103      $this->isMobile = true;
104    } elseif (strpos($this->accept, 'text/vnd.wap.wml') > 0 || strpos($this->accept, 'application/vnd.wap.xhtml+xml') > 0) {
105      $this->isMobile = true;
106    } else {
107      foreach ($this->devices as $device => $regexp) {
108        if ($this->isDevice($device)) {
109          $this->isMobile = true;
110          $this->device = $device;
111          break;
112        }
113      }
114    }
115  }
116
117  /**
118   * Returns true if the detected device name matches the given {$device} parameter
119   *
120   * @param string $device
121   * @return bool
122   */
123  protected function isDevice($device) {
124    $var = "is".ucfirst($device);
125    $device = strtolower($device);
126    $return = is_null($this->$var) ? (bool) preg_match("/".$this->devices[$device]."/i", $this->userAgent) : $this->$var;
127    if ($device != 'generic' && $return == true) {
128      $this->isGeneric = false;
129    }
130    return $return;
131  }
132
133  /**
134   * Returns true if any type of mobile device detected, including special ones
135   * @return bool
136   */
137  public function isMobile() {
138    return $this->isMobile;
139  }
140
141  /**
142   * Get the current device
143   *
144   * @todo make better device identification
145   * @return string
146   */
147  public function getDevice() {
148    return $this->device;
149  }
150
151  /**
152   * Overloads isAndroid() | isBlackberry() | isOpera() | isPalm() | isWindows() | isGeneric() through isDevice()
153   *
154   * @param string $name
155   * @param array $arguments
156   * @return bool
157   */
158  public function __call($name, $arguments) {
159    $device = substr($name, 2);
160    if ($name == "is".ucfirst($device)) {
161      return $this->isDevice($device);
162    } else {
163      trigger_error("Method $name not defined", E_USER_ERROR);
164    }
165  }
166
167  /**
168   * Disable cloning
169   */
170  protected function __clone() {
171    trigger_error("Cannot clone a singleton class", E_USER_ERROR);
172  }
173
174  /**
175   * Retrieve the MobileDetect object
176   *
177   * @return MobileDetect
178   */
179  static public function getInstance() {
180    if (!(self::$instance instanceof self)) {
181      self::$instance = new self;
182    }
183    return self::$instance;
184  }
185}
Note: See TracBrowser for help on using the repository browser.