source: spip-zone/_squelettes_/mobi.spip/detect/mobile.php @ 42915

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

switch site mobile/normal selon cookie mobispip=='mobile'
?var_mobile=oui/non ou 1/0 permet de forcer le passage vers mobile ou retour vers site normal
En l'absence du cookie (au premier hit), on utilise le script de detection selon le user agent,
et si c'est bien un mobile mais pas un iPad, on passe en vue mobile.
Dans tous les cas on pose un cookie pour ne pas refaire de detection les hits suivants

File size: 3.9 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 * Complete User_Agent string :
13 * http://www.zytrax.com/tech/web/mobile_ids.html
14 *
15 * example:
16 *         $detect = MobileDetect::getInstance();
17 *         if ($detect->isMobile()) { ... }
18 *         if ($detect->isIphone()) { ... }
19 *         ...etc.
20 */
21class MobileDetect {
22
23  /**
24   * @var MobileDetect
25   */
26  static protected $instance;
27
28  /**
29   * @var boolean
30   */
31  protected $accept;
32
33  /**
34   * @var boolean
35   */
36  protected $userAgent;
37
38  /**
39   * @var string
40   */
41  protected $device;
42
43  /**
44   * @var array
45   */
46  protected $is           = array();
47
48        /**
49         * @var boolean
50         */
51  protected $isMobile     = false;
52
53
54  /**
55   * Available devices and their respective matching pattern
56   *
57   * @var array [device] => pattern
58   */
59  protected $devices      = array(
60      "android"    => "android",
61      "blackberry" => "blackberry",
62      "iphone"     => "(iphone|ipod)",
63            "ipad"       => "ipad",
64      "opera"      => "opera (mini|mobi)",
65      "palm"       => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)",
66      "windows"    => "windows ce; (iemobile|ppc|smartphone)",
67      "generic"    => "(kindle|mobile|mmp|midp|o2|pda|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap)"
68  );
69
70  /**
71   * Constructor - checks request headers hydrate properties
72   */
73  protected function __construct() {
74    $this->userAgent = $_SERVER['HTTP_USER_AGENT'];
75    $this->accept    = $_SERVER['HTTP_ACCEPT'];
76
77    if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
78      $this->isMobile = true;
79    } elseif (strpos($this->accept, 'text/vnd.wap.wml') > 0 || strpos($this->accept, 'application/vnd.wap.xhtml+xml') > 0) {
80      $this->isMobile = true;
81    } else {
82      foreach ($this->devices as $device => $regexp) {
83        if ($this->isDevice($device)) {
84          $this->isMobile = true;
85          $this->device = $device;
86          break;
87        }
88      }
89    }
90  }
91
92  /**
93   * Returns true if the detected device name matches the given {$device} parameter
94   *
95   * @param string $device
96   * @return bool
97   */
98  protected function isDevice($device) {
99    $var = "is".ucfirst($device);
100    $device = strtolower($device);
101    $return = (isset($this->is[$device]) ? $this->is[$device] : (bool) preg_match("/".$this->devices[$device]."/i", $this->userAgent));
102    if ($device != 'generic' && $return == true) {
103      $this->is['generic'] = false;
104    }
105    return $return;
106  }
107
108  /**
109   * Returns true if any type of mobile device detected, including special ones
110   * @return bool
111   */
112  public function isMobile() {
113    return $this->isMobile;
114  }
115
116  /**
117   * Get the current device
118   *
119   * @todo make better device identification
120   * @return string
121   */
122  public function getDevice() {
123    return $this->device;
124  }
125
126  /**
127   * Overloads isAndroid() | isBlackberry() | isOpera() | isPalm() | isWindows() | isGeneric()
128   * or every isXxxx() where xxxx is a known device in $devices
129   * through isDevice()
130   *
131   * @param string $name
132   * @param array $arguments
133   * @return bool
134   */
135  public function __call($name, $arguments) {
136    $device = substr($name, 2);
137    if ($name == "is".ucfirst($device)) {
138      return $this->isDevice($device);
139    } else {
140      trigger_error("Method $name not defined", E_USER_ERROR);
141    }
142  }
143
144  /**
145   * Disable cloning
146   */
147  protected function __clone() {
148    trigger_error("Cannot clone a singleton class", E_USER_ERROR);
149  }
150
151  /**
152   * Retrieve the MobileDetect object
153   *
154   * @return MobileDetect
155   */
156  static public function getInstance() {
157    if (!(self::$instance instanceof self)) {
158      self::$instance = new self;
159    }
160    return self::$instance;
161  }
162}
Note: See TracBrowser for help on using the repository browser.