11

I have used below code to detect mobile in magento1.

$isMobile = Zend_Http_UserAgent_Mobile::match(
    Mage::helper('core/http')->getHttpUserAgent(),
    $_SERVER
);

I am not sure if there is something available for Magento2 as well. Anyone have used something like this in magento2?

5
  • To detect the client devices, we have an extension here github.com/EaDesgin/magento2-mobiledetect Commented Sep 21, 2017 at 6:48
  • Let me know if you have any issue? Commented Sep 22, 2017 at 13:41
  • You should approve answer or ask your queries to help other developers to find right solutions. Commented Sep 25, 2017 at 6:54
  • @VishwasSoni I've tried you solution its give me blank page. without any error. That's why i've not accepted yet.
    – Kul
    Commented Sep 25, 2017 at 7:42
  • @Kul Debug the issue and came back with the errors you get. A community will help you. Commented Sep 25, 2017 at 8:55

6 Answers 6

13

Best way is to detect a mobile device is

//Identifying if user is on mobile browser or not
if(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|phone)|xda|xiino/i',$_SERVER['HTTP_USER_AGENT'])||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($_SERVER['HTTP_USER_AGENT'],0,4))) {
    $browserStatus = 'Mobile';
}

I have used this in many websites and working perfect.

1
  • Worked for me as well!
    – Kul
    Commented Oct 4, 2017 at 10:02
7

You can use same class in Magento2.

protected $httpHeader;

protected $mobileAgent;

public function __construct(
   ...
    \Magento\Framework\HTTP\Header $httpHeader,
    \Zend_Http_UserAgent_Mobile $mobileAgent
   ...
) {
    $this->httpHeader = $httpHeader;
    $this->mobileAgent = $mobileAgent
}

public function isMobile(){
  $userAgent = $this->httpHeader->getHttpUserAgent();

  return $this->mobileAgent->match($userAgent, $_SERVER); //the code which you want.
}
5
  • Getting Exception #0 (Exception): Notice: Undefined index: http_user_agent in /var/www/Magento2/vendor/magento/zendframework1/library/Zend/Http/UserAgent/Features/Adapter/Browscap.php on line 69 exception.... please help me
    – B.K
    Commented May 14, 2018 at 6:59
  • 1
    @kranthi you might have to build your plugin after DI injection php bin\magento setup:di:compile
    – Sumit
    Commented May 29, 2018 at 10:05
  • @SumitKumar ran command but no use
    – B.K
    Commented May 29, 2018 at 14:34
  • It seems your browser is not set http_user_agent. Try to use if condition like this : stackoverflow.com/questions/14130830/… Commented May 29, 2018 at 18:11
  • I am also getting the same error - Undefined index: http_user_agent in /var/www/Magento2/vendor/magento/zendframework1/library/Zend/Http/UserAgent/Features/Adapter/Browscap.php on line 69 exception Commented Apr 21, 2020 at 9:03
3

You can use below code

   protected $httpHeader;

   public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\HTTP\Header $httpHeader,
    )
    {
         $this->httpHeader = $httpHeader;
         parent::__construct($context);
    }
    public function execute(){
      $userAgent = $this->httpHeader->getHttpUserAgent();
    }
0
2

You use this Library for Mobile Detect

Link

create custom module add library in module and create helper and put this function to global use.

  public function isMobile() 
  {
     return $this->mobileDetector->isMobile() || $this->mobileDetector->isTablet();
  } 

Add mobileDetector in your constructor to inject library.

0
2

You need to inject only one class "\Magento\Framework\HTTP\Header", because "\Zend_Http_UserAgent_Mobile::match" is a static method, so this will work:

/**
 * @var \Magento\Framework\HTTP\Header
 */
protected $httpHeader;

/**
 * @param \Magento\Framework\HTTP\Header $httpHeader
 */
public function __construct(
    \Magento\Framework\HTTP\Header $httpHeader
) {
    $this->httpHeader = $httpHeader;
}

/**
 * @return bool
 */
public function isMobile()
{
    $userAgent = $this->httpHeader->getHttpUserAgent();
    return \Zend_Http_UserAgent_Mobile::match($userAgent, $_SERVER);
}
1

I'm running Magento 2.3.2

I found that the easiest way is to add "Mobile_Detect.php" to the "magento_path/lib/internal" folder. Then call it into my .phtml template file using the following:

<?php 
include(BP.'/lib/internal/Mobile_Detect.php');
$detect = new Mobile_Detect();
if( $detect->isMobile() && !$detect->isTablet() ){
    echo "Is Mobile";
} else{
    echo "Is Desktop";
}
?>

Hope this helps someone.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.