* @copyright 2007-2011 PrestaShop SA
* @version Release: $Revision: 9526 $
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
include_once(PS_ADMIN_DIR.'/tabs/AdminPreferences.php');
class AdminThemes extends AdminPreferences
{
/** This value is used in isThemeCompatible method. only version node with an
* higher version number will be used in [theme]/config.xml
* @since 1.4.0.11, check theme compatibility 1.4
* @static
*/
public static $check_features_version = '1.4';
/** $check_features is a multidimensional array used to check [theme]/config.xml values,
* and also checks prestashop current configuration if not match.
* @static
*/
public static $check_features = array(
'ccc' => array( // feature key name
'attributes' => array(
'available' => array(
'value' => 'true', // accepted attribute value
// if value doesnt match,
// prestashop configuration value must have thoses values
'check_if_not_valid' => array(
'PS_CSS_THEME_CACHE' => 0,
'PS_JS_THEME_CACHE' => 0,
'PS_HTML_THEME_COMPRESSION' => 0,
'PS_JS_HTML_THEME_COMPRESSION' => 0,
'PS_HIGH_HTML_THEME_COMPRESSION' => 0,
),
),
),
'error' => 'This theme may not correctly use "combine, compress and cache"',
'tab' => 'AdminPerformance',
),
'guest_checkout' => array(
'attributes' => array(
'available' => array(
'value' => 'true',
'check_if_not_valid' => array('PS_GUEST_CHECKOUT_ENABLED' => 0)
),
),
'error' => 'This theme may not correctly use "guest checkout"',
'tab' => 'AdminPreferences',
),
'one_page_checkout' => array(
'attributes' => array(
'available' => array(
'value' => 'true',
'check_if_not_valid' => array('PS_ORDER_PROCESS_TYPE' => 0),
),
),
'error' => 'This theme may not correctly use "one page checkout"',
'tab' => 'AdminPreferences',
),
'store_locator' => array(
'attributes' => array(
'available' => array(
'value' => 'true',
'check_if_not_valid' => array('PS_STORES_SIMPLIFIED' => 0,'PS_STORES_DISPLAY_FOOTER' => 0),
)
),
'error' => 'This theme may not correctly use "display store location"',
'tab' => 'AdminStores',
)
);
public function __construct()
{
$this->className = 'Configuration';
$this->table = 'configuration';
$this->_fieldsAppearance = array(
'PS_LOGO' => array('title' => $this->l('Header logo:'), 'desc' => $this->l('Will appear on main page'), 'type' => 'file', 'thumb' => array('file' => _PS_IMG_.'logo.jpg?date='.time(), 'pos' => 'before')),
'PS_LOGO_MAIL' => array('title' => $this->l('Mail logo:'), 'desc' => $this->l('Will appear on e-mail headers, if undefined the Header logo will be used'), 'type' => 'file', 'thumb' => array('file' => ((file_exists(_PS_IMG_DIR_.'logo_mail.jpg')) ? _PS_IMG_.'logo_mail.jpg?date='.time() : _PS_IMG_.'logo.jpg?date='.time()), 'pos' => 'before')),
'PS_LOGO_INVOICE' => array('title' => $this->l('Invoice logo:'), 'desc' => $this->l('Will appear on invoices headers, if undefined the Header logo will be used'), 'type' => 'file', 'thumb' => array('file' => (file_exists(_PS_IMG_DIR_.'logo_invoice.jpg') ? _PS_IMG_.'logo_invoice.jpg?date='.time() : _PS_IMG_.'logo.jpg?date='.time()), 'pos' => 'before')),
'PS_FAVICON' => array('title' => $this->l('Favicon:'), 'desc' => $this->l('Will appear in the address bar of your web browser'), 'type' => 'file', 'thumb' => array('file' => _PS_IMG_.'favicon.ico?date='.time(), 'pos' => 'after')),
'PS_STORES_ICON' => array('title' => $this->l('Store icon:'), 'desc' => $this->l('Will appear on the store locator (inside Google Maps)').'
'.$this->l('Suggested size: 30x30, Transparent GIF'), 'type' => 'file', 'thumb' => array('file' => _PS_IMG_.'logo_stores.gif?date='.time(), 'pos' => 'before')),
'PS_NAVIGATION_PIPE' => array('title' => $this->l('Navigation pipe:'), 'desc' => $this->l('Used for navigation path inside categories/product'), 'cast' => 'strval', 'type' => 'text', 'size' => 20),
);
$this->_fieldsTheme = array(
'PS_THEME' => array('title' => $this->l('Theme'), 'validation' => 'isGenericName', 'type' => 'image', 'list' => $this->_getThemesList(), 'max' => 3)
);
parent::__construct();
}
public function display()
{
global $currentIndex;
/* PrestaShop demo mode */
if (_PS_MODE_DEMO_)
$this->_errors[] = Tools::displayError('This functionnality has been disabled.');
/* PrestaShop demo mode*/
if (file_exists(_PS_IMG_DIR_.'logo.jpg'))
{
list($width, $height, $type, $attr) = getimagesize(_PS_IMG_DIR_.'logo.jpg');
Configuration::updateValue('SHOP_LOGO_WIDTH', (int)round($width));
Configuration::updateValue('SHOP_LOGO_HEIGHT', (int)round($height));
}
// No cache for auto-refresh uploaded logo
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
$this->_displayForm('appearance', $this->_fieldsAppearance, $this->l('Appearance'), 'width3', 'appearance');
echo '
';
$this->_displayForm('themes', $this->_fieldsTheme, $this->l('Themes'), 'width3', 'themes');
echo '
';
}
/**
* Return an array with themes and thumbnails
*
* @return array
*/
private function _getThemesList()
{
$dir = opendir(_PS_ALL_THEMES_DIR_);
while ($folder = readdir($dir))
if ($folder != '.' AND $folder != '..' AND is_dir(_PS_ALL_THEMES_DIR_.$folder) AND file_exists(_PS_ALL_THEMES_DIR_.'/'.$folder.'/preview.jpg'))
$themes[$folder]['name'] = $folder;
closedir($dir);
return isset($themes) ? $themes : array();
}
/** This function checks if the theme designer has thunk to make his theme compatible 1.4,
* and noticed it on the $theme_dir/config.xml file. If not, some new functionnalities has
* to be desactivated
*
* @since 1.4
* @param string $theme_dir theme directory
* @return boolean Validity is ok or not
*/
private function _isThemeCompatible($theme_dir)
{
global $cookie;
$all_errors='';
$return=true;
$check_version=AdminThemes::$check_features_version;
if (!is_file(_PS_ALL_THEMES_DIR_ . $theme_dir . '/config.xml'))
{
$this->_errors[] = Tools::displayError('config.xml is missing in your theme path.').'
';
$xml=null;
}
else
{
$xml=@simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_dir.'/config.xml');
if (!$xml)
{
$this->_errors[] = Tools::displayError('config.xml is not a valid xml file in your theme path.').'
';
}
}
// will be set to false if any version node in xml is correct
$xml_version_too_old = true;
// foreach version in xml file,
// node means feature, attributes has to match
// the corresponding value in AdminThemes::$check_features[feature] array
$xmlArray = simpleXMLToArray($xml);
foreach($xmlArray AS $version)
{
if (isset($version['value']) AND version_compare($version['value'], $check_version) >= 0)
{
$checkedFeature = array();
foreach (AdminThemes::$check_features AS $codeFeature => $arrConfigToCheck)
foreach ($arrConfigToCheck['attributes'] AS $attr => $v)
if (!isset($version[$codeFeature]) OR !isset($version[$codeFeature][$attr]) OR $version[$codeFeature][$attr] != $v['value'])
if (!$this->_checkConfigForFeatures($codeFeature, $attr)) // feature missing in config.xml file, or wrong attribute value
$return = false;
$xml_version_too_old = false;
}
}
if ($xml_version_too_old AND !$this->_checkConfigForFeatures(array_keys(AdminThemes::$check_features)))
{
$this->_errors[] .= Tools::displayError('config.xml theme file has not been created for this version of prestashop.');
$return = false;
}
return $return;
}
/**
* _checkConfigForFeatures
*
* @param array $arrFeature array of feature code to check
* @param mixed $configItem will precise the attribute which not matches. If empty, will check every attributes
* @return error message, or null if disabled
*/
private function _checkConfigForFeatures($arrFeatures, $configItem = array())
{
$return = true;
if (is_array($configItem))
{
foreach ($arrFeatures as $feature)
if (!sizeof($configItem))
$configItem = array_keys(AdminThemes::$check_features[$feature]['attributes']);
foreach ($configItem as $attr)
{
$check = $this->_checkConfigForFeatures($arrFeatures,$attr);
if ($check == false)
$return = false;
}
return $return;
}
$return = true;
if (!is_array($arrFeatures))
$arrFeatures = array($arrFeatures);
foreach ($arrFeatures as $feature)
{
$arrConfigToCheck = AdminThemes::$check_features[$feature]['attributes'][$configItem]['check_if_not_valid'];
foreach ($arrConfigToCheck as $config_key => $config_val)
{
$config_get = Configuration::get($config_key);
if ($config_get != $config_val)
{
$this->_errors[] = Tools::displayError(AdminThemes::$check_features[$feature]['error']).'.'
.(!empty(AdminThemes::$check_features[$feature]['tab'])
?' '
.Tools::displayError('You can disable this function on this page')
.'':''
).'
' ;
$return = false;
break; // break for this attributes
}
}
}
return $return;
}
/** this functions make checks about AdminThemes configuration edition only.
*
* @since 1.4
*/
public function postProcess()
{
global $smarty;
/* PrestaShop demo mode */
if (_PS_MODE_DEMO_)
{
$this->_errors[] = Tools::displayError('This functionnality has been disabled.');
return;
}
/* PrestaShop demo mode*/
// new check compatibility theme feature (1.4) :
$val = Tools::getValue('PS_THEME');
Configuration::updateValue('PS_IMG_UPDATE_TIME', time());
if (!empty($val) AND !$this->_isThemeCompatible($val)) // don't submit if errors
unset($_POST['submitThemes'.$this->table]);
Tools::clearCache($smarty);
parent::postProcess();
}
}