122 lines
3.2 KiB
PHP
122 lines
3.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Tassos Marinos <info@tassos.gr>
|
|
* @link https://www.tassos.gr
|
|
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
|
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
|
*/
|
|
|
|
namespace NRFramework;
|
|
|
|
defined( '_JEXEC' ) or die( 'Restricted access' );
|
|
|
|
class WebClient
|
|
{
|
|
/**
|
|
* Joomla Application Client
|
|
*
|
|
* @var object
|
|
*/
|
|
public static $client;
|
|
|
|
/**
|
|
* Get visitor's Device Type
|
|
*
|
|
* @param string $ua User Agent string, if null use the implicit one from the server's enviroment
|
|
*
|
|
* @return string The client's device type. Can be: tablet, mobile, desktop
|
|
*/
|
|
public static function getDeviceType($ua = null)
|
|
{
|
|
$detect = new \NRFramework\Vendor\MobileDetect(null, $ua);
|
|
return ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'mobile') : 'desktop');
|
|
}
|
|
|
|
/**
|
|
* Get visitor's Operating System
|
|
*
|
|
* @param string $ua User Agent string, if null use the implicit one from the server's enviroment
|
|
*
|
|
* @return string Possible values: any of JApplicationWebClient's OS constants (except 'iphone' and 'ipad'),
|
|
* 'ios', 'chromeos'
|
|
*/
|
|
public static function getOS($ua = null)
|
|
{
|
|
// detect iOS and CromeOS (not handled by JApplicationWebClient)
|
|
$ua = self::getClient($ua)->userAgent;
|
|
|
|
$ios_regex = '/iPhone|iPad|iPod/i';
|
|
if (preg_match($ios_regex, $ua))
|
|
{
|
|
return 'ios';
|
|
}
|
|
|
|
$chromeos_regex = '/CrOS/i';
|
|
if (preg_match($chromeos_regex, $ua))
|
|
{
|
|
return 'chromeos';
|
|
}
|
|
|
|
// use JApplicationWebClient for OS detection
|
|
$platformInt = self::getClient($ua)->platform;
|
|
$constants = self::getClientConstants();
|
|
|
|
if (isset($constants[$platformInt]))
|
|
{
|
|
return strtolower($constants[$platformInt]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get visitor's Browser name / version
|
|
*
|
|
* @param string $ua User Agent string, if null use the implicit one from the server's enviroment
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getBrowser($ua = null)
|
|
{
|
|
$browser = new \Joomla\CMS\Environment\Browser($ua);
|
|
|
|
// Keep IE's name as 'ie' instead of 'msie' to prevent breaking existing assignments
|
|
$browserName = $browser->getBrowser() == 'msie' ? 'ie' : $browser->getBrowser();
|
|
|
|
return [
|
|
'name' => $browserName,
|
|
'version' => $browser->getVersion()
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get the constants from JApplicationWebClient as an array using the Reflection API
|
|
*
|
|
* @return array
|
|
*/
|
|
private static function getClientConstants()
|
|
{
|
|
$r = new \ReflectionClass('\\Joomla\\Application\\Web\\WebClient');
|
|
$constantsArray = $r->getConstants();
|
|
|
|
// flip the associative array
|
|
return array_flip($constantsArray);
|
|
}
|
|
|
|
/**
|
|
* Get the Application Client helper
|
|
* see https://api.joomla.org/cms-3/classes/Joomla.Application.Web.WebClient.html
|
|
*
|
|
* @param string $ua User Agent string, if null use the implicit one from the server's enviroment
|
|
*
|
|
* @return object
|
|
*/
|
|
public static function getClient($ua = null)
|
|
{
|
|
if (is_object(self::$client) && $ua == null)
|
|
{
|
|
return self::$client;
|
|
}
|
|
|
|
return (self::$client = new \Joomla\Application\Web\WebClient($ua));
|
|
}
|
|
} |