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));
 | |
| 	}
 | |
| } |