|
|
|
|
@ -23,7 +23,7 @@ function vchamilo_hook_configuration(&$_configuration) { |
|
|
|
|
$side_cnx = vchamilo_boot_connection($_configuration, 'main'); |
|
|
|
|
|
|
|
|
|
$table = 'vchamilo'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$query = " |
|
|
|
|
SELECT * FROM $table WHERE root_web = '{$_configuration['vchamilo_web_root']}' |
|
|
|
|
"; |
|
|
|
|
@ -64,7 +64,7 @@ function vchamilo_get_hostname(&$_configuration) { |
|
|
|
|
} else { |
|
|
|
|
$protocol = 'http'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (defined('CLI_VCHAMILO_OVERRIDE')) { |
|
|
|
|
$_configuration['vchamilo_web_root'] = CLI_VCHAMILO_OVERRIDE; |
|
|
|
|
$_configuration['vchamilo_name'] = preg_replace('#https?://#', '', CLI_VCHAMILO_OVERRIDE); // remove radical from override for name |
|
|
|
|
@ -107,7 +107,7 @@ function vchamilo_boot_connection(&$_configuration, $binddb = false) { |
|
|
|
|
} |
|
|
|
|
mysql_set_charset('utf8', $mysql_side_cnx); |
|
|
|
|
if (!empty($binddb)) { |
|
|
|
|
if (!in_array($binddb, array('main', 'statistics', 'user_personal'), true)) { |
|
|
|
|
if (!in_array($binddb, array('main'), true)) { |
|
|
|
|
echo('Not a chamilo database. should be one of "main", "statistics" or "user_personal"'); |
|
|
|
|
mysql_close($mysql_side_cnx); |
|
|
|
|
return false; |
|
|
|
|
@ -175,7 +175,7 @@ function vchamilo_template_exists($template) { |
|
|
|
|
$absolute_templatesdir = $_configuration['root_sys'].$templatefoldername; |
|
|
|
|
$relative_datadir = $templatefoldername.$separator.$template.'_sql'; |
|
|
|
|
$absolute_datadir = $_configuration['root_sys'].$relative_datadir; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return is_dir($absolute_datadir); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -187,7 +187,7 @@ function vchamilo_template_exists($template) { |
|
|
|
|
*/ |
|
|
|
|
function vchamilo_drop_databases(&$vchamilo){ |
|
|
|
|
global $plugininstance; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (is_array($vchamilo)) $vchamilo = (object)$vchamilo; |
|
|
|
|
|
|
|
|
|
// Drop databases you need to drop |
|
|
|
|
@ -245,10 +245,11 @@ function vchamilo_create_databases($vchamilo, $cnx = null) { |
|
|
|
|
foreach($dbs as $adb){ |
|
|
|
|
ctrace("Creating DB $adb "); |
|
|
|
|
$sql = str_replace('%DATABASE%', $adb, $createstatement); |
|
|
|
|
if(!$DB->execute_sql($sql)){ |
|
|
|
|
Database::query($sql); |
|
|
|
|
/*if(!$DB->execute_sql($sql)){ |
|
|
|
|
print_error('noexecutionfor','block_vmoodle', $sql); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
@ -257,7 +258,7 @@ function vchamilo_create_databases($vchamilo, $cnx = null) { |
|
|
|
|
/** |
|
|
|
|
* get a proper SQLdump command |
|
|
|
|
* @param object $vmoodledata the complete new host information |
|
|
|
|
* @return string the shell command |
|
|
|
|
* @return string the shell command |
|
|
|
|
*/ |
|
|
|
|
function vchamilo_get_database_dump_cmd($vchamilodata){ |
|
|
|
|
global $CFG; |
|
|
|
|
@ -309,7 +310,7 @@ function vchamilo_load_db_template($vchamilo, $dbtemplate, $template){ |
|
|
|
|
$absolute_templatesdir = $_configuration['root_sys'].$templatefoldername; |
|
|
|
|
$relative_datadir = $templatefoldername.$separator.$template.'_sql'; |
|
|
|
|
$absolute_datadir = $_configuration['root_sys'].$relative_datadir; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$filerad = preg_replace('/_database$/', '', $dbtemplate); |
|
|
|
|
$sqlfile = 'chamilo_master_'.$filerad.'.sql'; |
|
|
|
|
|
|
|
|
|
@ -326,7 +327,7 @@ function vchamilo_load_db_template($vchamilo, $dbtemplate, $template){ |
|
|
|
|
ctrace("load_database_from_dump : executing feeding sql as \n $import "); |
|
|
|
|
|
|
|
|
|
if (!defined('CLI_SCRIPT')){ |
|
|
|
|
putenv('LANG=en_US.utf-8'); |
|
|
|
|
putenv('LANG=en_US.utf-8'); |
|
|
|
|
} |
|
|
|
|
// ensure utf8 is correctly handled by php exec() |
|
|
|
|
// @see http://stackoverflow.com/questions/10028925/call-a-program-via-shell-exec-with-utf-8-text-input |
|
|
|
|
@ -353,7 +354,7 @@ function vchamilo_execute_db_sql(&$vchamilo, $bulkfile, $cnx = null, $vars=null, |
|
|
|
|
$erroritems[] = $erroritem; |
|
|
|
|
return $erroritem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$local_cnx = 0; |
|
|
|
|
if (is_null($cnx)){ |
|
|
|
|
$cnx = vchamilo_make_connection($vchamilo, true); |
|
|
|
|
@ -412,7 +413,7 @@ function vchamilo_execute_db_sql(&$vchamilo, $bulkfile, $cnx = null, $vars=null, |
|
|
|
|
if ($local_cnx){ |
|
|
|
|
vchamilo_close_connection($vchamilo, $cnx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($erroritems)){ |
|
|
|
|
return $erroritems; |
|
|
|
|
} |
|
|
|
|
@ -439,7 +440,7 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad){ |
|
|
|
|
// By default, empty password. |
|
|
|
|
$pass = ''; |
|
|
|
|
$pgm = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (empty($port)){ |
|
|
|
|
$port = 3306; |
|
|
|
|
} |
|
|
|
|
@ -479,7 +480,7 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad){ |
|
|
|
|
$cmds[] = $cmd_user . ' > ' . escapeshellarg($outputfilerad.'_user_personal.sql'); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$mysqldumpcmd = vchamilo_get_config('vchamilo', 'cmd_mysqldump', true); |
|
|
|
|
|
|
|
|
|
$pgm = (!empty($mysqldumpcmd)) ? stripslashes($mysqldumpcmd) : false ; |
|
|
|
|
@ -510,7 +511,7 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad){ |
|
|
|
|
if ($LOG = fopen(dirname($outputfilerad).'/cmd.log', 'a')){ |
|
|
|
|
fwrite($LOG, $cmd."\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Executes the SQL command. |
|
|
|
|
exec($cmd, $execoutput, $returnvalue); |
|
|
|
|
if ($LOG){ |
|
|
|
|
@ -551,12 +552,9 @@ function vchamilo_make_this(){ |
|
|
|
|
$thischamilo->db_user = $_configuration['db_user']; |
|
|
|
|
$thischamilo->db_password = $_configuration['db_password']; |
|
|
|
|
$thischamilo->db_prefix = $_configuration['db_prefix']; |
|
|
|
|
$thischamilo->main_database = $_configuration['main_databse']; |
|
|
|
|
$thischamilo->statistics_database = $_configuration['statistics_databse']; |
|
|
|
|
$thischamilo->user_personal_database = $_configuration['user_personal_databse']; |
|
|
|
|
$thischamilo->main_database = $_configuration['main_database']; ; |
|
|
|
|
$thischamilo->table_prefix = $_configuration['table_prefix']; |
|
|
|
|
$thischamilo->single_database = $_configuration['single_database']; |
|
|
|
|
$thischamilo->tracking_enabled = $_configuration['tracking_enabled']; |
|
|
|
|
|
|
|
|
|
return $thischamilo; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -606,30 +604,33 @@ function vchamilo_print_error($errortrace, $return = false){ |
|
|
|
|
$str .= '</pre>'; |
|
|
|
|
$str .= '</div>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($return) return $str; |
|
|
|
|
echo $str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* this function set will map standard moodle API calls to chamilo |
|
|
|
|
* internal primitives. This avoids too many changes to do in imported |
|
|
|
|
* internal primitives. This avoids too many changes to do in imported |
|
|
|
|
* code |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function vchamilo_get_config($module, $key, $isplugin = true){ |
|
|
|
|
global $_configuration, $DB; |
|
|
|
|
|
|
|
|
|
if ($isplugin){ |
|
|
|
|
function vchamilo_get_config($module, $key, $isplugin = true) |
|
|
|
|
{ |
|
|
|
|
if ($isplugin) { |
|
|
|
|
$key = $module.'_'.$key; |
|
|
|
|
} |
|
|
|
|
if($configrec = $DB->get_record(TABLE_MAIN_SETTINGS_CURRENT, array('variable' => $key, 'subkey' => $module))){ |
|
|
|
|
return $configrec->selected_value; |
|
|
|
|
|
|
|
|
|
$params = array('variable = ? AND subkey = ?' => [$key, $module]); |
|
|
|
|
$result = api_get_settings_params_simple($params); |
|
|
|
|
if ($result) { |
|
|
|
|
return $result['selected_value']; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function vchamilo_load_files_from_template($vchamilo, $template){ |
|
|
|
|
function vchamilo_load_files_from_template($vchamilo, $template) |
|
|
|
|
{ |
|
|
|
|
global $_configuration; |
|
|
|
|
|
|
|
|
|
// Make template directory (files and SQL). |
|
|
|
|
@ -646,12 +647,12 @@ function vchamilo_load_files_from_template($vchamilo, $template){ |
|
|
|
|
$vcoursepath = api_get_path(TO_SYS, SYS_COURSE_PATH, (array)$vchamilo); |
|
|
|
|
$vhomepath = api_get_path(TO_SYS, SYS_HOME_PATH, (array)$vchamilo); |
|
|
|
|
$varchivepath = api_get_path(TO_SYS, SYS_ARCHIVE_PATH, (array)$vchamilo); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo "archiveapth : $varchivepath"; |
|
|
|
|
|
|
|
|
|
// Rename some dirs top match instance requirements |
|
|
|
|
$manifest = vchamilo_get_vmanifest($template); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// get the protocol free hostname |
|
|
|
|
$originarchivedir = preg_replace('/https?:\/\//', '', $manifest->templatewwwroot); |
|
|
|
|
$originhomedir = preg_replace('/https?:\/\//', '', $manifest->templatewwwroot); |
|
|
|
|
@ -663,10 +664,10 @@ function vchamilo_load_files_from_template($vchamilo, $template){ |
|
|
|
|
copyDirContentTo(chop_last_slash($absolute_template_datadir.'/'.$manifest->coursefolder), chop_last_slash($vcoursepath), false); |
|
|
|
|
copyDirContentTo(chop_last_slash($absolute_template_datadir.'/archive/'.$originarchivedir), chop_last_slash($varchivepath), false); |
|
|
|
|
copyDirContentTo(chop_last_slash($absolute_template_datadir.'/home/'.$originhomedir), chop_last_slash($vhomepath), false); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function chop_last_slash($path){ |
|
|
|
|
function chop_last_slash($path) |
|
|
|
|
{ |
|
|
|
|
return preg_replace('/\/$/', '', $path); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -718,3 +719,496 @@ function copyDirContentTo($source, $destination, $move = true) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// from moot |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
define('PARAM_BOOL', 1); |
|
|
|
|
define('PARAM_INT', 2); |
|
|
|
|
define('PARAM_TEXT', 3); |
|
|
|
|
define('PARAM_RAW', 4); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* this function set will map standard moodle API calls to chamilo |
|
|
|
|
* internal primitives. This avoids too many changes to do in imported |
|
|
|
|
* code |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function get_config($module, $key = false, $isplugin = true) { |
|
|
|
|
global $_configuration, $DB; |
|
|
|
|
static $static_settings; |
|
|
|
|
|
|
|
|
|
if (!isset($static_settings)) { |
|
|
|
|
include_once $_configuration['root_sys'].'local/ent_installer/static_settings.php'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($isplugin){ |
|
|
|
|
$configkey = $module.'_'.$key; |
|
|
|
|
} else { |
|
|
|
|
$configkey = $key; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($module == 'ent_installer') { |
|
|
|
|
$dyna_setting = $DB->get_field(TABLE_MAIN_SETTINGS_CURRENT, 'selected_value', array('subkey' => 'ent_installer', 'variable' => $configkey)); |
|
|
|
|
if (!is_null($dyna_setting)) { |
|
|
|
|
return $dyna_setting; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(empty($config)){ |
|
|
|
|
ctrace("Wrap to static setting $module,$configkey "); |
|
|
|
|
if (array_key_exists($key, $static_settings)){ |
|
|
|
|
return $static_settings[$key]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (!$module) { |
|
|
|
|
return $DB->get_field(TABLE_MAIN_SETTINGS_CURRENT, 'selected_value', array('variable' => $configkey)); |
|
|
|
|
} |
|
|
|
|
if ($key) { |
|
|
|
|
return $DB->get_field(TABLE_MAIN_SETTINGS_CURRENT, 'selected_value', array('variable' => $configkey, 'subkey' => $module)); |
|
|
|
|
} else { |
|
|
|
|
// Get all config from a subkey as an object |
|
|
|
|
$configs = $DB->get_records(TABLE_MAIN_SETTINGS_CURRENT, array('subkey' => $module)); |
|
|
|
|
if (!empty($configs)) { |
|
|
|
|
$config = new StdClass; |
|
|
|
|
foreach ($configs as $cf) { |
|
|
|
|
$key = str_replace($module.'_', '', $cf->variable); |
|
|
|
|
$config->$key = $cf->selected_value; |
|
|
|
|
} |
|
|
|
|
return $config; |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function set_config($key, $value, $module, $isplugin = false) { |
|
|
|
|
|
|
|
|
|
if ($isplugin) { |
|
|
|
|
$key = $module.'_'.$key; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($isplugin) { |
|
|
|
|
// ensure setting is actually in database |
|
|
|
|
api_update_setting($value, $key, $module); |
|
|
|
|
} else { |
|
|
|
|
api_update_setting($value, $module, $key); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* gets a string from a component |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function get_string($key, $component = 'local_ent_installer', $a = ''){ |
|
|
|
|
global $_configuration; |
|
|
|
|
static $strings; |
|
|
|
|
static $fallbackstrings; |
|
|
|
|
|
|
|
|
|
if ($component == 'local_ent_installer') { |
|
|
|
|
$fallbackpath = $_configuration['root_sys'].'local/ent_installer/lang/english/local_ent_installer.php'; |
|
|
|
|
|
|
|
|
|
if (!isset($strings)) { |
|
|
|
|
$lang = api_get_language_from_type('platform_lang'); |
|
|
|
|
if (empty($lang)) $lang = 'english'; |
|
|
|
|
$path = $_configuration['root_sys'].'local/ent_installer/lang/'.$lang.'/local_ent_installer.php'; |
|
|
|
|
|
|
|
|
|
if (!file_exists($path)) { |
|
|
|
|
if (!file_exists($path)) { |
|
|
|
|
print_error('missinglang', null); |
|
|
|
|
die; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!isset($fallbackstrings)) { |
|
|
|
|
include $fallbackpath; |
|
|
|
|
$fallbackstrings = $string; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
include $path; |
|
|
|
|
$strings = $string; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!array_key_exists($key, $strings)) { |
|
|
|
|
if (!isset($fallbackstrings)) { |
|
|
|
|
include $fallbackpath; |
|
|
|
|
$fallbackstrings = $string; |
|
|
|
|
} |
|
|
|
|
if (!array_key_exists($key, $fallbackstrings)) { |
|
|
|
|
return "[[$key]]"; |
|
|
|
|
} |
|
|
|
|
if (is_scalar($a)) { |
|
|
|
|
return str_replace('{$a}', $a, $fallbackstrings[$key]); |
|
|
|
|
} |
|
|
|
|
if (is_array($a)) { |
|
|
|
|
$a = (object)$a; |
|
|
|
|
} |
|
|
|
|
if (is_object($a)) { |
|
|
|
|
return replace_string_vars($a, $fallbackstrings[$key]); |
|
|
|
|
} |
|
|
|
|
debugging('String insertion not supported', 1); |
|
|
|
|
die; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (is_scalar($a)) { |
|
|
|
|
return str_replace('{$a}', $a, $strings[$key]); |
|
|
|
|
} |
|
|
|
|
if (is_array($a)){ |
|
|
|
|
$a = (object)$a; |
|
|
|
|
} |
|
|
|
|
if (is_object($a)){ |
|
|
|
|
return replace_string_vars($a, $strings[$key]); |
|
|
|
|
} |
|
|
|
|
debugging('String insertion not supported', 1); |
|
|
|
|
die; |
|
|
|
|
} else { |
|
|
|
|
return get_lang($key); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function replace_string_vars($a, $str){ |
|
|
|
|
preg_match_all('/{\$a-\>(.+?)}/', $str, $matches); |
|
|
|
|
if (!empty($matches[1])){ |
|
|
|
|
foreach($matches[1] as $replacekey){ |
|
|
|
|
$str = str_replace('{$a->'.$replacekey.'}', $a->$replacekey, $str); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return $str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function print_error($key, $component = '', $passthru = false, $extrainfo = ''){ |
|
|
|
|
global $debuglevel; |
|
|
|
|
global $debugdisplay; |
|
|
|
|
|
|
|
|
|
if ($component === null){ |
|
|
|
|
$str = $key; |
|
|
|
|
} else { |
|
|
|
|
$str = get_string($string, $component); |
|
|
|
|
} |
|
|
|
|
ctrace('ERROR: '. $str); |
|
|
|
|
if (!empty($extrainfo)){ |
|
|
|
|
ctrace('Extra: '. $extrainfo); |
|
|
|
|
} |
|
|
|
|
if ($debugdisplay >= 3){ |
|
|
|
|
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); |
|
|
|
|
} |
|
|
|
|
if (!$passthru) die; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function debugging($message, $level) { |
|
|
|
|
global $debuglevel; |
|
|
|
|
global $debugdisplay; |
|
|
|
|
|
|
|
|
|
if ($level <= $debuglevel) { |
|
|
|
|
ctrace('DEBUG: '.$message); |
|
|
|
|
if ($debugdisplay >= 3){ |
|
|
|
|
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Wrap moodle to chamilo side |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function mtrace($message){ |
|
|
|
|
ctrace($message); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function ctrace($str) { |
|
|
|
|
if (!defined('CLI_SCRIPT')) echo "<pre>"; |
|
|
|
|
echo $str; |
|
|
|
|
if (!defined('CLI_SCRIPT')) echo "</pre>"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Sets a platform configuration setting to a given value, creating it if necessary |
|
|
|
|
* @param string The value we want to record |
|
|
|
|
* @param string The variable name we want to insert |
|
|
|
|
* @param string The subkey for the variable we want to insert |
|
|
|
|
* @param string The type for the variable we want to insert |
|
|
|
|
* @param string The category for the variable we want to insert |
|
|
|
|
* @param string The title |
|
|
|
|
* @param string The comment |
|
|
|
|
* @param string The scope |
|
|
|
|
* @param string The subkey text |
|
|
|
|
* @param int The access_url for which this parameter is valid |
|
|
|
|
* @param int The changeability of this setting for non-master urls |
|
|
|
|
* @return boolean true on success, false on failure |
|
|
|
|
*/ |
|
|
|
|
function api_update_setting($val, $var, $sk = null, $type = 'textfield', $c = null, $title = '', $com = '', $sc = null, $skt = null, $a = 1, $v = 0) { |
|
|
|
|
global $_setting; |
|
|
|
|
|
|
|
|
|
if (empty($var) || !isset($val)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); |
|
|
|
|
$var = Database::escape_string($var); |
|
|
|
|
$val = Database::escape_string($val); |
|
|
|
|
$a = (int) $a; |
|
|
|
|
|
|
|
|
|
if (empty($a)) { $a = 1; } |
|
|
|
|
|
|
|
|
|
// Check if this variable doesn't exist already |
|
|
|
|
$select = "SELECT id FROM $t_settings WHERE variable = '$var' "; |
|
|
|
|
|
|
|
|
|
if (!empty($sk)) { |
|
|
|
|
$sk = Database::escape_string($sk); |
|
|
|
|
$select .= " AND subkey = '$sk'"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($a > 1) { |
|
|
|
|
$select .= " AND access_url = $a"; |
|
|
|
|
} else { |
|
|
|
|
$select .= " AND access_url = 1 "; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$res = Database::query($select); |
|
|
|
|
if (Database::num_rows($res) > 0) { // Found item for this access_url. |
|
|
|
|
$row = Database::fetch_array($res); |
|
|
|
|
// update value |
|
|
|
|
$update['selected_value'] = $val; |
|
|
|
|
Database::update($t_settings, $update, array('id = ?' => $row['id'])); |
|
|
|
|
return $row['id']; |
|
|
|
|
|
|
|
|
|
// update in memory setting value |
|
|
|
|
$_setting[$var][$sk] = $val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Item not found for this access_url, we have to check if the whole thing is missing |
|
|
|
|
// (in which case we ignore the insert) or if there *is* a record but just for access_url = 1 |
|
|
|
|
$insert = "INSERT INTO $t_settings " . |
|
|
|
|
"(variable,selected_value," . |
|
|
|
|
"type,category," . |
|
|
|
|
"subkey,title," . |
|
|
|
|
"comment,scope," . |
|
|
|
|
"subkeytext,access_url,access_url_changeable)" . |
|
|
|
|
" VALUES ('$var','$val',"; |
|
|
|
|
if (isset($type)) { |
|
|
|
|
$type = Database::escape_string($type); |
|
|
|
|
$insert .= "'$type',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($c)) { // Category |
|
|
|
|
$c = Database::escape_string($c); |
|
|
|
|
$insert .= "'$c',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($sk)) { // Subkey |
|
|
|
|
$sk = Database::escape_string($sk); |
|
|
|
|
$insert .= "'$sk',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($title)) { // Title |
|
|
|
|
$title = Database::escape_string($title); |
|
|
|
|
$insert .= "'$title',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($com)) { // Comment |
|
|
|
|
$com = Database::escape_string($com); |
|
|
|
|
$insert .= "'$com',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($sc)) { // Scope |
|
|
|
|
$sc = Database::escape_string($sc); |
|
|
|
|
$insert .= "'$sc',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
if (isset($skt)) { // Subkey text |
|
|
|
|
$skt = Database::escape_string($skt); |
|
|
|
|
$insert .= "'$skt',"; |
|
|
|
|
} else { |
|
|
|
|
$insert .= "NULL,"; |
|
|
|
|
} |
|
|
|
|
$insert .= "$a,$v)"; |
|
|
|
|
$res = Database::query($insert); |
|
|
|
|
|
|
|
|
|
// update in memory setting value |
|
|
|
|
$_setting[$var][$sk] = $value; |
|
|
|
|
|
|
|
|
|
return $res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* converts a timestamp to sql tms |
|
|
|
|
* @param lint $time a unix timestamp |
|
|
|
|
*/ |
|
|
|
|
function make_tms($time) { |
|
|
|
|
$tms = date('Y-m-d H:i:s', $time); |
|
|
|
|
return $tms; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Makes sure the data is using valid utf8, invalid characters are discarded. |
|
|
|
|
* |
|
|
|
|
* Note: this function is not intended for full objects with methods and private properties. |
|
|
|
|
* |
|
|
|
|
* @param mixed $value |
|
|
|
|
* @return mixed with proper utf-8 encoding |
|
|
|
|
*/ |
|
|
|
|
function fix_utf8($value) { |
|
|
|
|
if (is_null($value) or $value === '') { |
|
|
|
|
return $value; |
|
|
|
|
|
|
|
|
|
} else if (is_string($value)) { |
|
|
|
|
if ((string)(int)$value === $value) { |
|
|
|
|
// shortcut |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Lower error reporting because glibc throws bogus notices. |
|
|
|
|
$olderror = error_reporting(); |
|
|
|
|
if ($olderror & E_NOTICE) { |
|
|
|
|
error_reporting($olderror ^ E_NOTICE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Note: this duplicates min_fix_utf8() intentionally. |
|
|
|
|
static $buggyiconv = null; |
|
|
|
|
if ($buggyiconv === null) { |
|
|
|
|
$buggyiconv = (!function_exists('iconv') or iconv('UTF-8', 'UTF-8//IGNORE', '100'.chr(130).'\80') !== '100\80'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($buggyiconv) { |
|
|
|
|
if (function_exists('mb_convert_encoding')) { |
|
|
|
|
$subst = mb_substitute_character(); |
|
|
|
|
mb_substitute_character(''); |
|
|
|
|
$result = mb_convert_encoding($value, 'utf-8', 'utf-8'); |
|
|
|
|
mb_substitute_character($subst); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
// Warn admins on admin/index.php page. |
|
|
|
|
$result = $value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
$result = iconv('UTF-8', 'UTF-8//IGNORE', $value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($olderror & E_NOTICE) { |
|
|
|
|
error_reporting($olderror); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $result; |
|
|
|
|
|
|
|
|
|
} else if (is_array($value)) { |
|
|
|
|
foreach ($value as $k=>$v) { |
|
|
|
|
$value[$k] = fix_utf8($v); |
|
|
|
|
} |
|
|
|
|
return $value; |
|
|
|
|
|
|
|
|
|
} else if (is_object($value)) { |
|
|
|
|
$value = clone($value); // do not modify original |
|
|
|
|
foreach ($value as $k=>$v) { |
|
|
|
|
$value->$k = fix_utf8($v); |
|
|
|
|
} |
|
|
|
|
return $value; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
// this is some other type, no utf-8 here |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function print_object($obj) { |
|
|
|
|
echo '<pre>'; |
|
|
|
|
print_r($obj); |
|
|
|
|
echo '</pre>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function require_js($file, $component, $return = false) { |
|
|
|
|
global $_configuration, $htmlHeadXtra; |
|
|
|
|
|
|
|
|
|
if (preg_match('/^local_/', $component)) { |
|
|
|
|
$component = str_replace('local_', '', $component); |
|
|
|
|
$path = 'local/'; |
|
|
|
|
} else { |
|
|
|
|
$path = 'plugin/'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Secure the postslashing of the roots. |
|
|
|
|
$root_web = $_configuration['root_web'].'/'; |
|
|
|
|
$root_web = preg_replace('#//$#', '/', $root_web); |
|
|
|
|
|
|
|
|
|
$str = '<script type="text/javascript" src="'.$root_web.$path.$component.'/js/'.$file.'"></script>'."\n"; |
|
|
|
|
if ($return === 'head') { |
|
|
|
|
$htmlHeadXtra[] = $str; |
|
|
|
|
} |
|
|
|
|
if ($return) { |
|
|
|
|
return $str; |
|
|
|
|
} |
|
|
|
|
echo $str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function require_css($file, $component, $return = false) { |
|
|
|
|
global $_configuration, $htmlHeadXtra; |
|
|
|
|
|
|
|
|
|
if (preg_match('/^local_/', $component)) { |
|
|
|
|
$component = str_replace('local_', '', $component); |
|
|
|
|
$path = 'local/'; |
|
|
|
|
} else { |
|
|
|
|
$path = 'plugin/'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Secure the postslashing of the roots. |
|
|
|
|
$root_web = $_configuration['root_web'].'/'; |
|
|
|
|
$root_web = preg_replace('#//$#', '/', $root_web); |
|
|
|
|
|
|
|
|
|
$str = '<link rel="stylesheet" type="text/css" href="'.$root_web.$path.$component.'/'.$file.'.css" />'."\n"; |
|
|
|
|
if ($return === 'head') { |
|
|
|
|
$htmlHeadXtra[] = $str; |
|
|
|
|
} |
|
|
|
|
if ($return) { |
|
|
|
|
return $str; |
|
|
|
|
} |
|
|
|
|
echo $str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function required_param($key, $type = 0) { |
|
|
|
|
if (array_key_exists($key, $_REQUEST)) { |
|
|
|
|
$value = $_REQUEST[$key]; |
|
|
|
|
$value = param_filter_type($value, $type); |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
die("Missing expected param $key in request input"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function optional_param($key, $default, $type = 0) { |
|
|
|
|
if (array_key_exists($key, $_REQUEST)) { |
|
|
|
|
$value = $_REQUEST[$key]; |
|
|
|
|
$value = param_filter_type($value, $type); |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
return $default; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function param_filter_type($value, $type) { |
|
|
|
|
switch($type) { |
|
|
|
|
case 0: |
|
|
|
|
return $value; // no filtering |
|
|
|
|
case PARAM_BOOL: |
|
|
|
|
return $value == 0; // forces outputing boolean |
|
|
|
|
case PARAM_INT: |
|
|
|
|
if (preg_match('/^([1-90]+)/', $value, $matches)) { |
|
|
|
|
return $matches[1]; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
case PARAM_TEXT: |
|
|
|
|
// TODO more filtering here |
|
|
|
|
return $value; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function redirect($url) { |
|
|
|
|
header("Location: $url\n\n"); |
|
|
|
|
} |