* @copyright PrestaShop * @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0 * @version 1.3 * */ class Configuration extends ObjectModel { public $id; /** @var string Key */ public $name; /** @var string Value */ public $value; /** @var string Object creation date */ public $date_add; /** @var string Object last modification date */ public $date_upd; protected $fieldsRequired = array('name'); protected $fieldsSize = array('name' => 32); protected $fieldsValidate = array('name' => 'isConfigName'); protected $table = 'configuration'; protected $identifier = 'id_configuration'; /** @var array Configuration cache */ private static $_CONF; /** @var array Configuration multilang cache */ private static $_CONF_LANG; public function getFields() { parent::validateFields(); $fields['name'] = pSQL($this->name); $fields['value'] = pSQL($this->value); $fields['date_add'] = pSQL($this->date_add); $fields['date_upd'] = pSQL($this->date_upd); return $fields; } /** * Check then return multilingual fields for database interaction * * @return array Multilingual fields */ public function getTranslationsFieldsChild() { if (!is_array($this->value)) return true; parent::validateFieldsLang(); return parent::getTranslationsFields(array('value')); } /** * Delete a configuration key in database (with or without language management) * * @param string $key Key to delete * @return boolean Deletion result */ static public function deleteByName($key) { if (!Validate::isConfigName($key)) die(Tools::displayError()); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'configuration_lang` WHERE `id_configuration` = (SELECT `id_configuration` FROM `'._DB_PREFIX_.'configuration` WHERE `name` = \''.pSQL($key).'\')'); return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'configuration` WHERE `name` = \''.pSQL($key).'\''); } /** * Get a single configuration value (in one language only) * * @param string $key Key wanted * @param integer $id_lang Language ID * @return string Value */ static public function get($key, $id_lang = NULL) { if (!is_array(self::$_CONF) OR !is_array(self::$_CONF_LANG) OR !Validate::isConfigName($key)) die(Tools::displayError()); if ($id_lang) { if (key_exists(intval($id_lang), self::$_CONF_LANG) AND key_exists($key, self::$_CONF_LANG[intval($id_lang)])) return self::$_CONF_LANG[intval($id_lang)][$key]; } elseif (key_exists($key, self::$_CONF)) return self::$_CONF[$key]; $result = Db::getInstance()->GetRow(' SELECT IFNULL('.($id_lang ? 'cl' : 'c').'.`value`, c.`value`) AS value FROM `'._DB_PREFIX_.'configuration` c '.($id_lang ? ('LEFT JOIN `'._DB_PREFIX_.'configuration_lang` cl ON (c.`id_configuration` = cl.`id_configuration` AND cl.`id_lang` = '.intval($id_lang).')') : '').' WHERE `name` = \''.pSQL($key).'\''); if ($id_lang) { self::$_CONF_LANG[intval($id_lang)][$key] = ($result ? $result['value'] : false); return self::$_CONF_LANG[intval($id_lang)][$key]; } else { self::$_CONF[$key] = ($result ? $result['value'] : false); return self::$_CONF[$key]; } } /** * Set TEMPORARY a single configuration value (in one language only) * * @param string $key Key wanted * @param mixed $values $values is an array if the configuration is multilingual, a single string else. * @param boolean $html Specify if html is authorized in value */ static public function set($key, $values, $html = false) { if (!Validate::isConfigName($key)) die(Tools::displayError()); /* Update classic values */ if (!is_array($values)) self::$_CONF[$key] = $values; /* Update multilingual values */ else /* Add multilingual values */ foreach ($values as $k => $value) self::$_CONF_LANG[intval($k)][$key] = $value; } /** * Get a single configuration value (in multiple languages) * * @param string $key Key wanted * @return array Values in multiple languages */ static public function getInt($key) { $languages = Language::getLanguages(); $resultsArray = array(); foreach($languages as $language) $resultsArray[$language['id_lang']] = self::get($key, $language['id_lang']); return $resultsArray; } /** * Get several configuration values (in one language only) * * @param array $keys Keys wanted * @param integer $id_lang Language ID * @return array Values */ static public function getMultiple($keys, $id_lang = NULL) { if (!is_array($keys) OR !is_array(self::$_CONF) OR ($id_lang AND !is_array(self::$_CONF_LANG))) die(Tools::displayError()); $resTab = array(); if (!$id_lang) { foreach ($keys AS $key) if (key_exists($key, self::$_CONF)) $resTab[$key] = self::$_CONF[$key]; } elseif (key_exists($id_lang, self::$_CONF_LANG)) foreach ($keys AS $key) if (key_exists($key, self::$_CONF_LANG[intval($id_lang)])) $resTab[$key] = self::$_CONF_LANG[intval($id_lang)][$key]; return $resTab; } /** * Get several configuration values (in multiple languages) * * @param array $keys Keys wanted * @return array Values in multiple languages */ static public function getMultipleInt($keys) { $languages = Language::getLanguages(); $resultsArray = array(); foreach($languages as $language) $resultsArray[$language['id_lang']] = self::getMultiple($keys, $language['id_lang']); return $resultsArray; } /** * Insert configuration key and value into database * * @param string $key Key * @param string $value Value * @eturn boolean Insert result */ static private function _addConfiguration($key, $value = NULL) { $newConfig = new Configuration(); $newConfig->name = $key; if (!is_null($value)) $newConfig->value = $value; return $newConfig->add(); } /** * Update configuration key and value into database (automatically insert if key does not exist) * * @param string $key Key * @param mixed $values $values is an array if the configuration is multilingual, a single string else. * @param boolean $html Specify if html is authorized in value * @eturn boolean Update result */ static public function updateValue($key, $values, $html = false) { if ($key == NULL) return; if (!Validate::isConfigName($key)) die(Tools::displayError()); $db = Db::getInstance(); /* Update classic values */ if (!is_array($values)) { if (Configuration::get($key) !== false) { $result = $db->AutoExecute( _DB_PREFIX_.'configuration', array('value' => pSQL($values, $html), 'date_upd' => date('Y-m-d H:i:s')), 'UPDATE', '`name` = \''.pSQL($key).'\'', true); self::$_CONF[$key] = $values; } else { $result = self::_addConfiguration($key, $values); if ($result) self::$_CONF[$key] = $values; return $result; } } /* Update multilingual values */ else { $result = 1; /* Add the key in the configuration table if it does not already exist... */ $conf = $db->getRow('SELECT `id_configuration` FROM `'._DB_PREFIX_.'configuration` WHERE `name` = \''.pSQL($key).'\''); if (!is_array($conf) OR !array_key_exists('id_configuration', $conf)) { self::_addConfiguration($key); $conf = $db->getRow('SELECT `id_configuration` FROM `'._DB_PREFIX_.'configuration` WHERE `name` = \''.pSQL($key).'\''); } /* ... then add multilingual values into configuration_lang table */ if (!array_key_exists('id_configuration', $conf) OR !intval($conf['id_configuration'])) return false; foreach ($values as $id_lang => $value) { $result &= $db->Execute('INSERT INTO `'._DB_PREFIX_.'configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES ('.$conf['id_configuration'].', '.intval($id_lang).', \''.pSQL($value, $html).'\', NOW()) ON DUPLICATE KEY UPDATE `value` = \''.pSQL($value, $html).'\', `date_upd` = NOW()'); self::$_CONF_LANG[intval($id_lang)][$key] = $value; } } return $result; } static public function loadConfiguration() { /* Configuration */ self::$_CONF = array(); $result = Db::getInstance()->ExecuteS('SELECT `name`, `value` FROM `'._DB_PREFIX_.'configuration`'); if ($result) foreach ($result AS $row) self::$_CONF[$row['name']] = $row['value']; /* Multilingual configuration */ self::$_CONF_LANG = array(); $result = Db::getInstance()->ExecuteS(' SELECT c.`name`, cl.`id_lang`, IFNULL(cl.`value`, c.`value`) AS value FROM `'._DB_PREFIX_.'configuration_lang` cl LEFT JOIN `'._DB_PREFIX_.'configuration` c ON c.id_configuration = cl.id_configuration'); if ($result === false) die(Tools::displayError('Invalid loadConfiguration() SQL query!')); foreach ($result AS $row) self::$_CONF_LANG[intval($row['id_lang'])][$row['name']] = $row['value']; } } ?>