Reading list Switch to dark mode

    Detect the mobile devices in the Magento as Zend_Http_UserAgent_Mobile is deprecated.

    Updated 1 May 2023

    Hello Friends!!

    In today’s blog, I will recommend a solution to detect mobile devices. As after Magento 2.4.4 Zend_Http_UserAgent_Mobile is deprecated.

    We will create a helper with all the methods we need. And later we will use this helper in the block file. You can simply use the below code in your helper file.

    <?php
    
    namespace Webkul\DetectMobile\Helper;
    
    class Mobile
    {
        /**
         * @var array
         */
        protected $_haTerms = [
            'midp',
            'wml',
            'vnd.rim',
            'vnd.wap',
            'j2me',
        ];
    
        /**
         * User Agent Signatures
         *
         * @var array
         */
        protected $_uaSignatures = [
            'iphone',
            'ipod',
            'ipad',
            'android',
            'blackberry',
            'opera mini',
            'opera mobi',
            'palm',
            'palmos',
            'elaine',
            'windows ce',
            'icab',
            '_mms',
            'ahong',
            'archos',
            'armv',
            'astel',
            'avantgo',
            'benq',
            'blazer',
            'brew',
            'com2',
            'compal',
            'danger',
            'pocket',
            'docomo',
            'epoc',
            'ericsson',
            'eudoraweb',
            'hiptop',
            'htc-',
            'htc_',
            'iemobile',
            'iris',
            'j-phone',
            'kddi',
            'kindle',
            'lg ',
            'lg-',
            'lg/',
            'lg;lx',
            'lge vx',
            'lge',
            'lge-',
            'lge-cx',
            'lge-lx',
            'lge-mx',
            'linux armv',
            'maemo',
            'midp',
            'mini 9.5',
            'minimo',
            'mob-x',
            'mobi',
            'mobile',
            'mobilephone',
            'mot 24',
            'mot-',
            'motorola',
            'n410',
            'netfront',
            'nintendo wii',
            'nintendo',
            'nitro',
            'nokia',
            'novarra-vision',
            'nuvifone',
            'openweb',
            'opwv',
            'palmsource',
            'pdxgw',
            'phone',
            'playstation',
            'polaris',
            'portalmmm',
            'qt embedded',
            'reqwirelessweb',
            'sagem',
            'sam-r',
            'samsu',
            'samsung',
            'sec-',
            'sec-sgh',
            'semc-browser',
            'series60',
            'series70',
            'series80',
            'series90',
            'sharp',
            'sie-m',
            'sie-s',
            'smartphone',
            'sony cmd',
            'sonyericsson',
            'sprint',
            'spv',
            'symbian os',
            'symbian',
            'symbianos',
            'telco',
            'teleca',
            'treo',
            'up.browser',
            'up.link',
            'vodafone',
            'vodaphone',
            'webos',
            'wml',
            'windows phone os 7',
            'wireless',
            'wm5 pie',
            'wms pie',
            'xiino',
            'wap',
            'up/',
            'psion',
            'j2me',
            'klondike',
            'kbrowser'
        ];
    
        /**
         * first 4 letters of mobile User Agent chains
         *
         * @var array
         */
        protected $_uaBegin = [
            'w3c ',
            'acs-',
            'alav',
            'alca',
            'amoi',
            'audi',
            'avan',
            'benq',
            'bird',
            'blac',
            'blaz',
            'brew',
            'cell',
            'cldc',
            'cmd-',
            'dang',
            'doco',
            'eric',
            'hipt',
            'inno',
            'ipaq',
            'java',
            'jigs',
            'kddi',
            'keji',
            'leno',
            'lg-c',
            'lg-d',
            'lg-g',
            'lge-',
            'maui',
            'maxo',
            'midp',
            'mits',
            'mmef',
            'mobi',
            'mot-',
            'moto',
            'mwbp',
            'nec-',
            'newt',
            'noki',
            'palm',
            'pana',
            'pant',
            'phil',
            'play',
            'port',
            'prox',
            'qwap',
            'sage',
            'sams',
            'sany',
            'sch-',
            'sec-',
            'send',
            'seri',
            'sgh-',
            'shar',
            'sie-',
            'siem',
            'smal',
            'smar',
            'sony',
            'sph-',
            'symb',
            't-mo',
            'teli',
            'tim-',
            'tosh',
            'tsm-',
            'upg1',
            'upsi',
            'vk-v',
            'voda',
            'wap-',
            'wapa',
            'wapi',
            'wapp',
            'wapr',
            'webc',
            'winw',
            'winw',
            'xda',
            'xda-',
        ];
    
        /**
         * Comparison of the UserAgent chain and User Agent signatures
         *
         * @param  string $userAgent User Agent chain
         * @param  array $server $_SERVER like param
         * @return bool
         */
        public function match($userAgent, $server)
        {
            //  To have a quick identification, try light-weight tests first
            if (isset($server['all_http'])) {
                if (strpos(strtolower(str_replace(' ', '', $server['all_http'])), 'operam') !== false) {
                    // Opera Mini or Opera Mobi
                    return true;
                }
            }
    
            if (isset($server['http_x_wap_profile']) || isset($server['http_profile'])) {
                return true;
            }
    
            if (isset($server['http_accept'])) {
                if ($this->matchAgentAgainstSignatures($server['http_accept'], $this->_haTerms)) {
                    return true;
                }
            }
    
            if ($this->userAgentStart($userAgent)) {
                return true;
            }
    
            if ($this->matchAgentAgainstSignatures($userAgent, $this->_uaSignatures)) {
                return true;
            }
    
            return false;
        }
    
        /**
         * Match a user agent string against a list of signatures
         *
         * @param  string $userAgent
         * @param  array $signatures
         * @return bool
         */
        protected function matchAgentAgainstSignatures($userAgent, $signatures)
        {
            $userAgent = strtolower($userAgent);
            foreach ($signatures as $signature) {
                if (!empty($signature)) {
                    if (strpos($userAgent, $signature) !== false) {
                        // Browser signature was found in user agent string
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * Retrieve beginning clause of user agent
         *
         * @param  string $userAgent
         * @return string
         */
        public function userAgentStart($userAgent)
        {
    
            $mobile_ua = strtolower(substr($userAgent, 0, 4));
    
            return (in_array($mobile_ua, $this->_uaBegin));
        }
    }
    ?>

    Now we will create the block file and will use the helper which we created earlier to check if it’s a mobile device or not.

    You can simply use the below code in your block file.

    Searching for an experienced
    Magento Company ?
    Find out More
    <?php
    
    namespace Webkul\DetectMobile\Block;
    
    class DetectMobile extends \Magento\Framework\View\Element\Template
    {
        /**
         * @var \Webkul\DetectMobile\Helper\Mobile
         */
        protected $mobile;
    
        /**
         * @param \Magento\Framework\View\Element\Template\Context $context
         * @param \Webkul\DetectMobile\Helper\Mobile $Mobile
         * @param array $data
         */
        public function __construct(
            \Magento\Framework\View\Element\Template\Context $context,
            \Magento\Framework\HTTP\Header $httpHeader,
            \Webkul\DetectMobile\Helper\Mobile $mobile,
            array $data = []
        ) {
            $this->httpHeader = $httpHeader;
            $this->mobile = $mobile;
            parent::__construct($context, $data);
        }
    
        /**
         * Is Mobile
         *
         * @return bool
         */
        public function Ismobile()
        {
            $userAgent = $this->httpHeader->getHttpUserAgent();
            $server = $this->getRequest()->getServer();
            $isMobileDevice = $this->mobile->match($userAgent, $server);
            return $isMobileDevice;
        }
    }
    ?>

    Now, the method Ismobile() will return the desired result.

    That’s all about detecting the mobile without Zend_Http_UserAgent Hope this will be helpful.

    If you have any questions please comment below, and we will try to respond to you.

    Thanks! 🙂

    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    4 comments

  • Gagandeep Singh
    • Shweta Singh (Moderator)
  • Gagandeep
    • Shweta Singh (Moderator)
  • Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home