925 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			925 lines
		
	
	
		
			20 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;
 | |
| 
 | |
| use NRFramework\Cache;
 | |
| use Joomla\Registry\Registry;
 | |
| use Joomla\CMS\Factory;
 | |
| use Joomla\CMS\Language\Text;
 | |
| use Joomla\CMS\Http\HttpFactory;
 | |
| 
 | |
| 
 | |
| defined( '_JEXEC' ) or die( 'Restricted access' );
 | |
| 
 | |
| class Extension
 | |
| {
 | |
| 	/**
 | |
| 	 * Indicates the base url of Tassos.gr Joomla Extensions
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public static $product_base_url = 'https://www.tassos.gr/joomla-extensions';
 | |
| 
 | |
| 	/**
 | |
| 	 * Array including already loaded extensions
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	public static $cache = [];
 | |
| 
 | |
| 	/**
 | |
| 	 * Get extension ID
 | |
| 	 *
 | |
| 	 * @param	string	$element	The extension element name
 | |
| 	 * @param	string	$type		The extension type: component, plugin, library e.t.c
 | |
| 	 * @param	mixed	$folder		The plugin folder: system, content e.t.c
 | |
| 	 *
 | |
| 	 * @return	mixed 	False on failure, Integer on success
 | |
| 	 */
 | |
| 	public static function getID($element, $type = 'component', $folder = null)
 | |
| 	{
 | |
| 		if (!$extension = self::get($element, $type, $folder))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return (int) $extension['extension_id'];
 | |
| 	}
 | |
| 
 | |
| 	public static function getModuleByID($module_id = null)
 | |
| 	{
 | |
| 		if (!$module_id)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$hash = 'get_module_by_id_' . $module_id;
 | |
| 
 | |
| 		// Render modal once
 | |
| 		if ($module_data = Cache::get($hash))
 | |
| 		{
 | |
| 			return $module_data;
 | |
| 		}
 | |
| 
 | |
| 		// Let's call the database
 | |
| 		$db = Factory::getDBO();	
 | |
| 
 | |
|         $query = $db->getQuery(true)
 | |
|             ->select('*')
 | |
|             ->from($db->quoteName('#__modules'))
 | |
| 			->where($db->quoteName('id') . ' = ' . $module_id);
 | |
| 			
 | |
| 		$db->setQuery($query);
 | |
| 
 | |
| 		$module_data = $db->loadAssoc();
 | |
| 
 | |
| 		Cache::set($hash, $module_data);
 | |
| 
 | |
| 		return $module_data;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get extension data by ID
 | |
| 	 *
 | |
| 	 * @param	string	$extension_id		The extension primary key
 | |
| 	 * 
 | |
| 	 * @return	void
 | |
| 	 */
 | |
| 	public static function getByID($extension_id)
 | |
| 	{
 | |
| 		// Check if element is already cached
 | |
| 		if (isset(self::$cache[$extension_id]))
 | |
| 		{
 | |
| 			return self::$cache[$extension_id];
 | |
| 		}
 | |
| 
 | |
| 		// Let's call the database
 | |
| 		$db = Factory::getDBO();	
 | |
| 
 | |
|         $query = $db->getQuery(true)
 | |
|             ->select('*')
 | |
|             ->from($db->quoteName('#__extensions'))
 | |
| 			->where($db->quoteName('extension_id') . ' = ' . $extension_id);
 | |
| 			
 | |
| 		$db->setQuery($query);
 | |
| 
 | |
| 		return self::$cache[$extension_id] = $db->loadAssoc();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get extension information from database
 | |
| 	 *
 | |
| 	 * @param	string	$element	The extension element name
 | |
| 	 * @param	string	$type		The extension type: component, plugin, library e.t.c
 | |
| 	 * @param	mixed	$folder		The plugin folder: system, content e.t.c
 | |
| 	 *
 | |
| 	 * @return	array
 | |
| 	 */
 | |
|     public static function get($element, $type = 'component', $folder = null)
 | |
|     {
 | |
| 		// Check if element is already cached
 | |
| 		$hash = md5($element . '_' . $type . '_' . $folder);
 | |
| 		if (isset(self::$cache[$hash]))
 | |
| 		{
 | |
| 			return self::$cache[$hash];
 | |
| 		}
 | |
| 
 | |
| 		// Let's call the database
 | |
| 		$db = Factory::getDBO();
 | |
| 
 | |
| 		switch ($type)
 | |
| 		{
 | |
| 			case 'component':
 | |
| 				$element = 'com_' . str_replace('com_', '', $element);
 | |
| 				break;
 | |
| 			case 'module':
 | |
| 				$element = 'mod_' . str_replace('mod_', '', $element);
 | |
| 				break;
 | |
| 		}
 | |
| 		
 | |
|         $query = $db->getQuery(true)
 | |
|             ->select('*')
 | |
|             ->from($db->quoteName('#__extensions'))
 | |
|             ->where($db->quoteName('element') . ' = ' . $db->quote($element))
 | |
|             ->where($db->quoteName('type') . ' = ' . $db->quote($type));
 | |
| 
 | |
|         if (!is_null($folder))
 | |
|         {
 | |
|             $query->where($db->quoteName('folder') . ' = ' . $db->quote($folder));
 | |
|         }
 | |
| 
 | |
| 		$db->setQuery($query);
 | |
| 
 | |
| 		return self::$cache[$hash] = $db->loadAssoc();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get framework plugin data
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public static function getFramework()
 | |
| 	{
 | |
| 		return self::get('nrframework', 'plugin', 'system');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Helper method to check if a plugin is enabled
 | |
| 	 *
 | |
| 	 * @param	string	$element	The extension element name
 | |
| 	 * @param	string	$type		The extension type: component, plugin, library e.t.c
 | |
| 	 *
 | |
| 	 * @return  boolean
 | |
| 	 */
 | |
| 	public static function pluginIsEnabled($element, $folder = 'system') 
 | |
| 	{
 | |
| 		return self::isEnabled($element, 'plugin', $folder);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Update an extension's params.
 | |
| 	 * 
 | |
| 	 * @param	string	$name		The extension name
 | |
| 	 * @param	string	$type		The extension type
 | |
| 	 * @param	string	$element	The extension element
 | |
| 	 * @param	array	$params		The new params
 | |
| 	 * 
 | |
| 	 * @return	bool
 | |
| 	 */
 | |
| 	public static function updateExtensionParams($name = '', $type = '', $element = '', $params = [])
 | |
| 	{
 | |
| 		if (empty($name) || empty($type) || empty($element) || empty($params))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// Update params
 | |
| 		$db = Factory::getDBO();
 | |
| 
 | |
| 		// Update params
 | |
| 		$query = $db->getQuery(true)
 | |
| 			->update('#__extensions')
 | |
| 			->set($db->quoteName('params') . ' = ' . $db->quote(json_encode($params)))
 | |
| 			->where($db->quoteName('name') . ' = ' . $db->quote($name))
 | |
| 			->where($db->quoteName('type') . ' = ' . $db->quote($type))
 | |
| 			->where($db->quoteName('element') . ' = ' . $db->quote($element));
 | |
| 		$db->setQuery($query);
 | |
| 		$db->execute();
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Helper method to check if a component is enabled
 | |
| 	 *
 | |
| 	 * @param	string	$element	The component element name
 | |
| 	 *
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function componentIsEnabled($element) 
 | |
| 	{
 | |
| 		return self::isEnabled($element);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Checks if an extension is enabled
 | |
| 	 *
 | |
| 	 * @param	string	$element	The extension element name
 | |
| 	 * @param	string	$type		The extension type: component, plugin, library e.t.c
 | |
| 	 * @param	mixed	$folder		The plugin folder: system, content e.t.c
 | |
| 	 *
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function isEnabled($element, $type = 'component', $folder = 'system')
 | |
| 	{
 | |
| 		switch ($type)
 | |
| 		{
 | |
| 			case 'component':
 | |
| 				if (!$extension = self::get($element))
 | |
| 				{
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				return (bool) $extension['enabled'];
 | |
| 				break;
 | |
| 
 | |
| 			case 'plugin':
 | |
| 				if (!$extension = self::get($element, $type = 'plugin', $folder))
 | |
| 				{
 | |
| 					return false;
 | |
| 				}
 | |
| 		
 | |
| 				return (bool) $extension['enabled'];
 | |
| 				break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
|      *  Checks if an extension is installed
 | |
|      *
 | |
|      *  @param   string  $extension  The extension element name
 | |
|      *  @param   string  $type       The extension's type 
 | |
|      *  @param   string  $folder     Plugin folder
 | |
|      *
 | |
|      *  @return  boolean             Returns true if extension is installed
 | |
|      */
 | |
|     public static function isInstalled($extension, $type = 'component', $folder = 'system')
 | |
|     {
 | |
|         $db = Factory::getDbo();
 | |
| 
 | |
|         switch ($type)
 | |
|         {
 | |
| 			case 'component':
 | |
| 				$extension_data = self::get('com_' . str_replace('com_', '', $extension));
 | |
| 				return isset($extension_data['extension_id']);
 | |
|                 break;
 | |
| 
 | |
|             case 'plugin':
 | |
|                 return file_exists(JPATH_PLUGINS . '/' . $folder . '/' . $extension . '/' . $extension . '.php');
 | |
| 
 | |
|             case 'module':
 | |
|                 return (file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/' . $extension . '.php')
 | |
|                     || file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
 | |
|                     || file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/' . $extension . '.php')
 | |
|                     || file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
 | |
|                 );
 | |
| 
 | |
|             case 'library':
 | |
|                 return is_dir(JPATH_LIBRARIES . '/' . $extension);
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Discover extension's name based on the query string
 | |
| 	 *
 | |
| 	 * @param	boolean	$translate	If set to yes, the name will be returned translated
 | |
| 	 * 
 | |
| 	 * @return	string
 | |
| 	 */
 | |
| 	public static function getExtensionNameByRequest($translate = false)
 | |
| 	{
 | |
| 		$input  = Factory::getApplication()->input;
 | |
| 		$option = $input->get('option');
 | |
| 
 | |
| 		$name = '';
 | |
| 
 | |
| 		switch ($option)
 | |
| 		{
 | |
| 			case 'com_modules':
 | |
| 				$name = 'com_smilepack';
 | |
| 				break;
 | |
| 			case 'com_fields':
 | |
| 				$name = 'plg_system_acf';
 | |
| 				break;
 | |
| 			case 'com_plugins':
 | |
| 				$plugin = self::getByID($input->get('extension_id'));
 | |
| 
 | |
| 				if (is_array($plugin))
 | |
| 				{
 | |
| 					$name = $plugin['name'];
 | |
| 				}
 | |
| 				break;
 | |
| 			case 'com_config':
 | |
| 				$component = $input->get('component');
 | |
| 
 | |
| 				$extension = self::get($component);
 | |
| 
 | |
| 				if (is_array($extension))
 | |
| 				{
 | |
| 					$name = $extension['name'];
 | |
| 				}
 | |
| 				
 | |
| 				break;
 | |
| 			default:
 | |
| 				$name = $option;
 | |
| 				break;
 | |
| 		}
 | |
| 
 | |
| 		if ($translate)
 | |
| 		{
 | |
| 			$name = explode(' - ', Text::_($name));
 | |
| 			return end($name);
 | |
| 		}
 | |
| 
 | |
| 		return $name;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns Tassos.gr extension checkout URL
 | |
| 	 *
 | |
| 	 * @param	string	$name		 The extension's element name
 | |
| 	 * @param	bool	$append_utm	 Set whether to append the UTM parameters
 | |
| 	 *
 | |
| 	 * @return	string
 | |
| 	 */
 | |
| 	public static function getTassosExtensionUpgradeURL($name = null, $append_utm = true)
 | |
| 	{
 | |
| 		$name = is_null($name) ? strtolower(self::getExtensionNameByRequest()) : $name;
 | |
| 
 | |
|         $suffix = $append_utm ? '?utm_source=Joomla&utm_medium=upgradebutton&utm_campaign=freeversion' : '';
 | |
| 
 | |
| 		return self::$product_base_url . '/' . self::getProductAlias($name) . '/upgrade-to-pro' . $suffix;
 | |
| 	}
 | |
| 
 | |
| 	public static function getProductAlias($extension)
 | |
| 	{
 | |
| 		$extension = is_null($extension) ? self::getExtensionNameByRequest() : $extension;
 | |
| 
 | |
| 		switch ($extension)
 | |
| 		{
 | |
| 			case 'com_gsd': case 'plg_system_gsd': return 'google-structured-data';
 | |
| 			case 'com_rstbox': return 'engagebox';
 | |
| 			case 'com_convertforms': return 'convert-forms';
 | |
| 			case 'com_smilepack': return 'smile-pack';
 | |
| 			case 'plg_system_tweetme': return 'tweetme';
 | |
| 			case 'plg_system_acf': return 'advanced-custom-fields';
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static function getExtensionName($extension_element = null)
 | |
| 	{
 | |
| 		if (!$extension_element)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		// Load extension's language file
 | |
| 		Functions::loadLanguage($extension_element);
 | |
| 
 | |
| 		// Remove plugin folder prefix from plugins
 | |
| 		return str_replace('System -', '', Text::_($extension_element));
 | |
| 	}
 | |
| 
 | |
| 	public static function getProductURL($extension) 
 | |
| 	{
 | |
| 		return self::$product_base_url . '/' . self::getProductAlias($extension);
 | |
| 	}
 | |
| 
 | |
| 	public static function getPath($element)
 | |
| 	{
 | |
| 		$parts = explode('_', $element);
 | |
| 
 | |
| 		switch ($parts[0])
 | |
| 		{
 | |
| 			case 'com':
 | |
| 				return JPATH_ADMINISTRATOR . '/components/' . $element;
 | |
| 			case 'plg':
 | |
| 				return JPATH_SITE . '/plugins/' . $parts[1] . '/' . $parts[2];
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static function getVersion($extension, $include_type = false)
 | |
| 	{
 | |
| 		$xml = self::getXML($extension);
 | |
| 
 | |
| 		if (!$xml || !isset($xml->version))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$version = (string) $xml->version;
 | |
| 
 | |
| 		// If enabled, it returns EngageBox Pro
 | |
| 		if ($include_type)
 | |
| 		{
 | |
| 			$isPro = self::isPro($extension);
 | |
| 			$version_type = $isPro ? 'Pro' : 'Free';
 | |
| 			$version .= ' ' . $version_type;
 | |
| 		}
 | |
| 
 | |
| 		return $version;
 | |
| 	}
 | |
| 
 | |
| 	public static function elementToAlias($element)
 | |
| 	{
 | |
| 		$parts = explode('_', $element);
 | |
| 		return end($parts);
 | |
| 	}
 | |
| 
 | |
| 	public static function getXML($element)
 | |
| 	{
 | |
| 		if (!$path = self::getPath($element))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$extension_alias = self::elementToAlias($element);
 | |
| 		$xml = $path . '/' . $extension_alias . '.xml';
 | |
| 
 | |
| 		return simplexml_load_file($xml);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a URL where we can check for extension updates.
 | |
| 	 *
 | |
| 	 * @param  strong $extension
 | |
| 	 *
 | |
| 	 * @return mixed  Null of fail, String on success
 | |
| 	 */
 | |
| 	public static function getUpdateServer($extension)
 | |
| 	{
 | |
| 		$xml = self::getXML($extension);
 | |
| 
 | |
| 		if (!$xml || !isset($xml->updateservers))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$updateserver = trim($xml->updateservers->server);
 | |
| 
 | |
| 		// Remove unwanted string added by Free / Pro versions
 | |
| 		$pp = strpos($updateserver, '@');
 | |
| 		if ($pp !== false)
 | |
| 		{
 | |
| 			$updateserver = substr($updateserver, 0, $pp);
 | |
| 		}
 | |
| 
 | |
| 		return $updateserver;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the latest extension version from the remote update server
 | |
| 	 *
 | |
| 	 * @param  string $extension
 | |
| 	 *
 | |
| 	 * @return mixed	Null on failure, String on success
 | |
| 	 */
 | |
| 	public static function getLatestVersion($extension)
 | |
| 	{
 | |
| 		// Get the extension's update server URL
 | |
| 		if (!$updateserver = self::getUpdateServer($extension))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Call the Update Server and make sure the response is valid
 | |
| 		$response = HttpFactory::getHttp()->get($updateserver);
 | |
| 
 | |
| 		if ($response->code != 200 || strpos($response->body, '<updates>') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$body = new \SimpleXMLElement($response->body);
 | |
| 
 | |
| 		$version = (string) $body->update[0]->version;
 | |
| 
 | |
| 		return $version;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if we have the Pro version of the extension
 | |
| 	 *
 | |
| 	 * @param  string $element
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function isPro($element)
 | |
| 	{
 | |
| 		if (!$path = self::getPath($element))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$versionFile = $path . '/version.php';
 | |
| 
 | |
| 		// If version file does not exist we assume a PRO version
 | |
| 		if (!file_exists($versionFile))
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		require $versionFile;
 | |
| 
 | |
| 		// If the NR_PRO variable is not set we're probably under development mode. Assume a Pro version.
 | |
| 		if (!isset($NR_PRO))
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		return (bool) $NR_PRO;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Checks whether an extension is outdated.
 | |
| 	 * 
 | |
| 	 * @param   string  $extension
 | |
| 	 * @param   int     $days_old
 | |
| 	 * 
 | |
| 	 * @return  bool
 | |
| 	 */
 | |
| 	public static function isOutdated($extension, $days_old = 120)
 | |
| 	{
 | |
|         $versionFile = Functions::getExtensionPath($extension) . "/version.php";
 | |
| 
 | |
|         if (!file_exists($versionFile))
 | |
|         {
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		require $versionFile;
 | |
| 
 | |
| 		if (!isset($RELEASE_DATE))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		if (!$then = strtotime($RELEASE_DATE))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		$days_old = (int) $days_old;
 | |
| 		$now = time();
 | |
| 		$diff = $now - $then;
 | |
| 		$days_diff = round($diff / (60 * 60 * 24));
 | |
| 		
 | |
| 		if ($days_diff <= $days_old)
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Checks whether the geolocation plugin needs an update.
 | |
| 	 * 
 | |
| 	 * @return  bool
 | |
| 	 */
 | |
|     public static function geoPluginNeedsUpdate()
 | |
|     {
 | |
|         // Check if TGeoIP plugin is enabled
 | |
|         if (!self::pluginIsEnabled('tgeoip'))
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $plugin_path = JPATH_PLUGINS . '/system/tgeoip/';
 | |
| 
 | |
|         // Load plugin language (Needed by Joomla 4)
 | |
|         Factory::getLanguage()->load('plg_system_tgeoip', $plugin_path);
 | |
| 
 | |
|         // Load TGeoIP classes
 | |
|         @include_once $plugin_path . 'vendor/autoload.php';
 | |
|         @include_once $plugin_path . 'helper/tgeoip.php';
 | |
| 
 | |
|         if (!class_exists('TGeoIP'))
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // Check if database needs update. 
 | |
|         $geo = new \TGeoIP();
 | |
|         if (!$geo->needsUpdate())
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // Database is too old and needs an update! Let's inform user.
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the extension's JED URL.
 | |
|      * 
 | |
|      * @param   string  $xml_folder
 | |
|      * 
 | |
|      * @return  string
 | |
|      */
 | |
|     public static function getExtensionJEDURL($xml_folder = null)
 | |
|     {
 | |
|         if (empty($xml_folder))
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $url = 'https://extensions.joomla.org/extensions/extension/';
 | |
| 
 | |
|         switch ($xml_folder) {
 | |
|             case 'com_smilepack':
 | |
|                 $url .= 'smile-pack';
 | |
|                 break;
 | |
|             case 'com_rstbox':
 | |
|                 $url .= 'style-a-design/popups-a-iframes/engage-box';
 | |
|                 break;
 | |
|             case 'com_convertforms':
 | |
|                 $url .= 'contacts-and-feedback/forms/convert-forms';
 | |
|                 break;
 | |
|             case 'plg_system_acf':
 | |
|                 $url .= 'authoring-a-content/content-construction/advanced-custom-fields';
 | |
|                 break;
 | |
|             case 'plg_system_gsd':
 | |
|                 $url .= 'search-a-indexing/web-search/google-structured-data';
 | |
|                 break;
 | |
|             case 'tm_mailchimpuserautoadd':
 | |
|                 $url .= 'marketing/mailing-a-newsletter-bridges/user-auto-add-to-mailchimp-for-joomla';
 | |
|                 break;
 | |
|             case 'tweetme':
 | |
|                 $url .= 'social-web/social-share/tweetme';
 | |
|                 break;
 | |
|             case 'mod_webhotelier':
 | |
|                 $url .= 'vertical-markets/booking-a-reservations/webhotelier-booking-form';
 | |
|                 break;
 | |
|         }
 | |
|         
 | |
|         return $url;
 | |
|     }
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the installation date of an extension given its extension element.
 | |
| 	 * 
 | |
| 	 * @param   string  $element
 | |
| 	 * 
 | |
| 	 * @return  string
 | |
| 	 */
 | |
| 	public static function getInstallationDate($element = null)
 | |
| 	{
 | |
| 		$alias = self::getExtensionDataFileAlias($element);
 | |
| 		
 | |
| 		$path = self::getExtensionsDataFilePath();
 | |
| 		
 | |
| 		// If file does not exist, abort
 | |
| 		if (!file_exists($path))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// If file exists, retrieve its contents
 | |
| 		$content = file_get_contents($path);
 | |
| 
 | |
| 		// Decode it
 | |
| 		if (!$content = json_decode($content, true))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// If no installation date exists, abort
 | |
| 		if (!isset($content[$alias]))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Ensure install date exists
 | |
| 		if (!isset($content[$alias]['install_date']))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		return $content[$alias]['install_date'];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Sets the installation date of an extension.
 | |
| 	 * 
 | |
| 	 * @param   string  $element
 | |
| 	 * @param   string  $install_date
 | |
| 	 * 
 | |
| 	 * @return  bool
 | |
| 	 */
 | |
| 	public static function setInstallationDate($element = null, $install_date = null)
 | |
| 	{
 | |
| 		$alias = self::getExtensionDataFileAlias($element);
 | |
| 		
 | |
| 		$path = self::getExtensionsDataFilePath();
 | |
| 		
 | |
| 		// If file does not exist, abort
 | |
| 		if (!file_exists($path))
 | |
| 		{
 | |
| 			\NRFramework\File::createDirs(dirname($path));
 | |
| 			
 | |
| 			file_put_contents($path, json_encode([
 | |
| 				$alias => [
 | |
| 					'install_date' => $install_date
 | |
| 				]
 | |
| 			]));
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// If file exists, retrieve its contents
 | |
| 		$content = file_get_contents($path);
 | |
| 
 | |
| 		// Decode it
 | |
| 		$content = json_decode($content, true);
 | |
| 
 | |
| 		if (!isset($content[$alias]))
 | |
| 		{
 | |
| 			$content[$alias]['install_date'] = $install_date;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			foreach ($content as $key => &$value)
 | |
| 			{
 | |
| 				if ($key !== $alias)
 | |
| 				{
 | |
| 					continue;
 | |
| 				}
 | |
| 
 | |
| 				if (isset($value['install_date']))
 | |
| 				{
 | |
| 					return false;
 | |
| 				}
 | |
| 				
 | |
| 				$value['install_date'] = $install_date;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		file_put_contents($path, json_encode($content));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns all extensions file details.
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	public static function getExtensionsFileDetails()
 | |
| 	{
 | |
| 		$file = self::getExtensionsDataFilePath();
 | |
| 
 | |
| 		if (!file_exists($file))
 | |
| 		{
 | |
| 			return [];
 | |
| 		}
 | |
| 
 | |
| 		if (!$data = file_get_contents($file))
 | |
| 		{
 | |
| 			return [];
 | |
| 		}
 | |
| 
 | |
| 		if (!$data = json_decode($data, true))
 | |
| 		{
 | |
| 			return [];
 | |
| 		}
 | |
| 
 | |
| 		return $data;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns an extension's alias used to find an extensions data within the extensions.json data file.
 | |
| 	 * 
 | |
| 	 * @param   string  $element
 | |
| 	 * 
 | |
| 	 * @return  string
 | |
| 	 */
 | |
| 	public static function getExtensionDataFileAlias($element)
 | |
| 	{
 | |
| 		$element = str_replace('com_', '', $element);
 | |
| 
 | |
| 		switch ($element) {
 | |
| 			case 'rstbox':
 | |
| 				$element = 'engagebox';
 | |
| 				break;
 | |
| 			case 'smilepack':
 | |
| 				$element = 'smile-pack';
 | |
| 				break;
 | |
| 		}
 | |
| 
 | |
| 		return $element;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * The file path that stores all extensions data.
 | |
| 	 * 
 | |
| 	 * @return  string
 | |
| 	 */
 | |
| 	public static function getExtensionsDataFilePath()
 | |
| 	{
 | |
| 		return JPATH_SITE . '/media/plg_system_nrframework/data/extensions.json';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns all extensions details.
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	public static function getExtensionsDetails()
 | |
| 	{
 | |
| 		return [
 | |
| 			'smilepack' => [
 | |
| 				'extension' => 'com_smilepack',
 | |
| 				'type' => 'component'
 | |
| 			],
 | |
| 			'engagebox' => [
 | |
| 				'extension' => 'com_rstbox',
 | |
| 				'type' => 'component'
 | |
| 			],
 | |
| 			'gsd' => [
 | |
| 				'extension' => 'com_gsd',
 | |
| 				'type' => 'component'
 | |
| 			],
 | |
| 			'acf' => [
 | |
| 				'extension' => 'acf',
 | |
| 				'type' => 'plugin'
 | |
| 			],
 | |
| 			'convertforms' => [
 | |
| 				'extension' => 'com_convertforms',
 | |
| 				'type' => 'component'
 | |
| 			]
 | |
| 		];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the number of tassos.gr installed extensions.
 | |
| 	 * 
 | |
| 	 * @return  int
 | |
| 	 */
 | |
| 	public static function getTotalInstalledExtensions()
 | |
| 	{
 | |
| 		$installed = 0;
 | |
| 		
 | |
| 		foreach (self::getExtensionsDetails() as $key => $value)
 | |
| 		{
 | |
| 			if (!self::isInstalled($value['extension'], $value['type']))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$installed++;
 | |
| 		}
 | |
| 
 | |
| 		return $installed;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the number of users active subscription plans.
 | |
| 	 * 
 | |
| 	 * @param   array  $license_data
 | |
| 	 * 
 | |
| 	 * @return  int
 | |
| 	 */
 | |
| 	public static function getUserTotalPaidPlans($license_data = [])
 | |
| 	{
 | |
| 		if (!$license_data)
 | |
| 		{
 | |
| 			return 0;
 | |
| 		}
 | |
| 
 | |
| 		$count = 0;
 | |
| 
 | |
| 		foreach ($license_data as $key => $value)
 | |
| 		{
 | |
| 			if (!isset($value['active']))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 			
 | |
| 			if (!$value['active'])
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 			
 | |
| 			$count++;
 | |
| 		}
 | |
| 		
 | |
| 		return $count;
 | |
| 	}
 | |
| } |