|
@@ -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");
|
|
|
+}
|