Files
PrestaShop/modules/cloudcache/override/classes/Tools.php
jObregon fac1566a5f [+] MO : CloudCache module
git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@14929 b9a71923-0436-4b27-9f14-aed3839534dd
2012-04-26 16:39:43 +00:00

180 lines
5.7 KiB
PHP

<?php
/*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision: 12823 $
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
if (!class_exists('CloudCache') && file_exists(dirname(__FILE__).'/../../modules/cloudcache/cloudcache.php'))
require(dirname(__FILE__).'/../../modules/cloudcache/cloudcache.php');
class Tools extends ToolsCore
{
/** @var _totalServerCount Total count of all servers */
private static $_totalServerCount = 0;
/** @var _servers Array containing all the media servers by type */
private static $_servers = null;
/** @var _serversCount Array countaining the count of servers by type */
private static $_serversCount = null;
/** @var _fileTypes Available file types */
private static $_fileTypes = null;
/** @var _activatedModule Flag weither or not the module is active */
private static $_activatedModule = false;
public static $id_group_shop = 1;
public static $id_shop = 1;
/**
* @brief Init the statics needed by getMediaServer
*/
private static function _initServers()
{
require_once(dirname(__FILE__).'/../../modules/cloudcache/backward_compatibility/backward.php');
$context = Context::getContext();
self::$id_shop = $context->shop->id;
self::$id_group_shop = $context->shop->id_group_shop;
// Init the statics
self::$_servers = array();
self::$_serversCount = array();
self::$_fileTypes = array(CLOUDCACHE_FILE_TYPE_IMG, CLOUDCACHE_FILE_TYPE_JS,
CLOUDCACHE_FILE_TYPE_CSS, CLOUDCACHE_FILE_TYPE_OTHER,
CLOUDCACHE_FILE_TYPE_ALL);
// check if the module is active
self::$_activatedModule = Configuration::get('CLOUDCACHE_API_ACTIVE');
foreach (self::$_fileTypes as $type)
{
self::$_servers[$type] = array();
self::$_serversCount[$type] = 0;
}
$d = Db::getInstance()->executeS('SELECT `cdn_url`, `file_type`
FROM `'._DB_PREFIX_.'cloudcache_zone`
WHERE `file_type` != \''.CLOUDCACHE_FILE_TYPE_UNASSOCIATED.'\' AND `id_shop` = '.(int)self::$id_shop);
$allOnly = false;
foreach ($d as $line)
if ($line['file_type'] == CLOUDCACHE_FILE_TYPE_ALL)
{
self::$_servers[CLOUDCACHE_FILE_TYPE_ALL][] = pSQL($line['cdn_url']);
self::$_serversCount[CLOUDCACHE_FILE_TYPE_ALL]++;
self::$_totalServerCount++;
$allOnly = true;
}
foreach ($d as $line)
if ($line['file_type'] && !$allOnly)
{
self::$_servers[$line['file_type']][] = $line['cdn_url'];
self::$_serversCount[$line['file_type']]++;
self::$_totalServerCount++;
}
}
public static function addJS($js_uri)
{
parent::addJS($js_uri);
global $js_files;
foreach ($js_files as &$file)
if (!preg_match('/^http(s?):\/\//i', $file))
$file = 'http://'.self::getMediaServer($file).$file;
}
public static function addCSS($css_uri, $css_media_type = 'all')
{
parent::addCSS($css_uri, $css_media_type);
global $css_files;
$new = array();
foreach ($css_files as $key => $file)
{
if (!preg_match('/^http(s?):\/\//i', $key))
$key = 'http://'.self::getMediaServer($key).$key;
$new[$key] = $file;
}
$css_files = $new;
}
/**
* @brief Retrieve the media server to use
*
* @param filename Name of the file to serve (acually, part of the path)
*
* @todo Check performences
*
* @return URL of the server to use.
*/
public static function getMediaServer($filename)
{
// Override default behavior only if module is active
if (!class_exists('CloudCache'))
include(dirname(__FILE__).'/../../modules/cloudcache/cloudcache.php');
$module = new CloudCache();
if (!$module->active)
return parent::getMediaServer($filename);
// Init the server list if needed
if (!self::$_servers)
self::_initServers();
if (!self::$_activatedModule)
return parent::getMediaServer($filename);
// If there is a least one ALL server, then use one of them
if (self::$_serversCount[CLOUDCACHE_FILE_TYPE_ALL])
// Return one of those server
return (self::$_servers[CLOUDCACHE_FILE_TYPE_ALL][(abs(crc32($filename)) %
self::$_serversCount[CLOUDCACHE_FILE_TYPE_ALL])]);
// If there is servers, then use them
if (self::$_totalServerCount)
{
// Loop on the file types to find the current one
foreach (self::$_fileTypes as $type)
// If we find the type in the filename, then it is our
if (strstr($filename, $type) && self::$_serversCount[$type])
{
// Return one of those server
return (self::$_servers[$type][(abs(crc32($filename)) %
self::$_serversCount[$type])]);
}
// If no file type found, then it is 'other'
// If there is server setted for the 'other' type, use it
if (self::$_serversCount[CLOUDCACHE_FILE_TYPE_OTHER])
// Return one of the server setted up
return (self::$_servers[$type][(abs(crc32($filename)) %
self::$_serversCount[$type])]);
}
// If there is no server setted up, then use the parent method
return parent::getMediaServer($filename);
}
}