From 356522a410bef617907b70611cf8dd466cba3ee0 Mon Sep 17 00:00:00 2001 From: jmontoyaa Date: Tue, 26 Apr 2016 14:20:21 +0200 Subject: [PATCH] WIP fix vchamilo plugin --- plugin/vchamilo/ajax/service.php | 2 +- plugin/vchamilo/lib.php | 231 ++++++++---------- .../views/editinstance.controller.php | 8 +- .../vchamilo/views/syncparams.controller.php | 20 +- 4 files changed, 119 insertions(+), 142 deletions(-) diff --git a/plugin/vchamilo/ajax/service.php b/plugin/vchamilo/ajax/service.php index 12b34cc3f9..64e766e214 100644 --- a/plugin/vchamilo/ajax/service.php +++ b/plugin/vchamilo/ajax/service.php @@ -12,7 +12,7 @@ $thisurl = api_get_path(WEB_PLUGIN_PATH).'vchamilo/views/manage.php'; api_protect_admin_script(); if ($action == 'syncthis') { - $res = include_once(api_get_path(SYS_PLUGIN_PATH).'vchamilo/views/syncparams.controller.php'); + $res = include_once api_get_path(SYS_PLUGIN_PATH).'vchamilo/views/syncparams.controller.php'; if (!$res) { echo 'Success'; } else { diff --git a/plugin/vchamilo/lib.php b/plugin/vchamilo/lib.php index cd190752cc..a73d1b70f3 100644 --- a/plugin/vchamilo/lib.php +++ b/plugin/vchamilo/lib.php @@ -1,7 +1,7 @@ isset($_configuration['db_path']) ? $_configuration['db_path'] : '', // Only relevant for pdo_mysql, pdo_pgsql, and pdo_oci/oci8, - 'port' => isset($_configuration['db_port']) ? $_configuration['db_port'] : '' + 'port' => isset($_configuration['db_port']) ? $_configuration['db_port'] : '', ); try { $database = new \Database(); @@ -167,15 +167,16 @@ function vchamilo_get_default_course_index_fragment() { return ""; } -function vchamilo_template_exists($template) { +function vchamilo_template_exists($template) +{ global $_configuration; // Find and checktemplate directory (files and SQL). - $separator = DIRECTORY_SEPARATOR; - $templatefoldername = 'plugin'.$separator.'vchamilo'.$separator.'templates'; + $separator = DIRECTORY_SEPARATOR; + $templatefoldername = 'plugin'.$separator.'vchamilo'.$separator.'templates'; $absolute_templatesdir = $_configuration['root_sys'].$templatefoldername; - $relative_datadir = $templatefoldername.$separator.$template.'_sql'; - $absolute_datadir = $_configuration['root_sys'].$relative_datadir; + $relative_datadir = $templatefoldername.$separator.$template.'_sql'; + $absolute_datadir = $_configuration['root_sys'].$relative_datadir; return is_dir($absolute_datadir); } @@ -206,14 +207,14 @@ function vchamilo_drop_databases(&$vchamilo) foreach($sqls as $sql){ $res = Database::query($sql); if (!$res){ - $erroritem = new StdClass(); + $erroritem = new stdClass(); $erroritem->message = $plugininstance->get_lang('couldnotdropdb'); $erroritem->on = 'db'; $erroritems[] = $erroritem; } } - if (!empty($erroritems)){ + if (!empty($erroritems)) { return $erroritems; } @@ -254,13 +255,9 @@ function vchamilo_create_databases($vchamilo) */ function vchamilo_get_database_dump_cmd($vchamilodata) { - global $CFG; + $pgm = vchamilo_get_config('vchamilo', 'mysql_cmd'); - $pgm = vchamilo_get_config('mysql_cmd'); - - // Checks the needed program. - Display::addFlash(Display::return_message("load_database_from_dump : checking database command")); - if (!$pgm){ + if (!$pgm) { $pgm = '/usr/bin/mysql'; Display::addFlash(Display::return_message("Using default database command $pgm ")); } @@ -269,7 +266,6 @@ function vchamilo_get_database_dump_cmd($vchamilodata) $phppgm = str_replace("\"", '', $phppgm); $pgm = str_replace("/", DIRECTORY_SEPARATOR, $pgm); - Display::addFlash(Display::return_message('load_database_from_dump : checking command is available')); if (!is_executable($phppgm)){ print_error('databasecommanddoesnotmatchanexecutablefile'); return false; @@ -277,49 +273,44 @@ function vchamilo_get_database_dump_cmd($vchamilodata) // Retrieves the host configuration (more secure). $vchamilodata = vchamilo_make_this(); - if (strstr($vchamilodata->db_host, ':') !== false){ - list($vchamilodata->db_host, $vchamilodata->db_port) = split(':', $vchamilodata->db_host); + if (strstr($vchamilodata->db_host, ':') !== false) { + list($vchamilodata->db_host, $vchamilodata->db_port) = explode(':', $vchamilodata->db_host); } // Password. - if (!empty($vchamilodata->db_password)){ + if (!empty($vchamilodata->db_password)) { $vchamilodata->db_password = '-p'.escapeshellarg($vchamilodata->db_password).' '; } // Making the command line (see 'vconfig.php' file for defining the right paths). - $sqlcmd = $pgm.' -h'.$vchamilodata->db_host.(isset($vchamilodata->db_port) ? ' -P'.$vchamilodata->db_port.' ' : ' ' ); + $sqlcmd = $pgm.' -h'.$vchamilodata->db_host.(isset($vchamilodata->db_port) ? ' -P'.$vchamilodata->db_port.' ' : ' ' ); $sqlcmd .= '-u'.$vchamilodata->db_user.' '.$vchamilodata->db_password; $sqlcmd .= '%DATABASE% < '; return $sqlcmd; } -function vchamilo_load_db_template($vchamilo, $dbtemplate, $template){ +function vchamilo_load_db_template($vchamilo, $template) { global $_configuration; // Make template directory (files and SQL). - $separator = DIRECTORY_SEPARATOR; - $templatefoldername = 'plugin'.$separator.'vchamilo'.$separator.'templates'; - $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'; + $separator = DIRECTORY_SEPARATOR; + $templatefoldername = 'plugin'.$separator.'vchamilo'.$separator.'templates'; + $absolute_datadir = $_configuration['root_sys'].$templatefoldername.$separator.$template.$separator.'dump.sql'; - if (!$sqlcmd = vchamilo_get_database_dump_cmd($vchamilo)){ + if (!$sqlcmd = vchamilo_get_database_dump_cmd($vchamilo)) { return false; } - $sqlcmd = str_replace('%DATABASE%', $vchamilo->$dbtemplate, $sqlcmd); + $sqlcmd = str_replace('%DATABASE%', $vchamilo->main_database, $sqlcmd); // Make final commands to execute, depending on the database type. - $import = $sqlcmd.$absolute_datadir.'/'.$sqlfile; + $import = $sqlcmd.$absolute_datadir; // Execute the command. Display::addFlash(Display::return_message("load_database_from_dump : executing feeding sql as \n $import ")); - if (!defined('CLI_SCRIPT')){ + if (!defined('CLI_SCRIPT')) { putenv('LANG=en_US.utf-8'); } // ensure utf8 is correctly handled by php exec() @@ -339,13 +330,13 @@ function vchamilo_load_db_template($vchamilo, $dbtemplate, $template){ * @param handle $cnx * @param array $vars an array of vars to inject in the bulk file before processing */ -function vchamilo_execute_db_sql(&$vchamilo, $bulkfile, $cnx = null, $vars=null, $filter=null){ - global $_configuration; - - if (file_exists($bulkfile)){ - $erroritem = new StdClass(); +function vchamilo_execute_db_sql(&$vchamilo, $bulkfile, $cnx = null, $vars = null, $filter = null) +{ + if (file_exists($bulkfile)) { + $erroritem = new stdClass(); $erroritem->message = "vchamilo_load_db_template : Bulk file $bulkfile not found"; $erroritems[] = $erroritem; + return $erroritem; } @@ -391,7 +382,7 @@ function vchamilo_execute_db_sql(&$vchamilo, $bulkfile, $cnx = null, $vars=null, if ($query == '') continue; // avoid empty queries $query = mb_convert_encoding($query, 'iso-8859-1', 'auto'); if (!$res = vchamilo_execute_query($vchamilo, $query, $cnx)){ - $erroritem = new StdClass(); + $erroritem = new stdClass(); $erroritem->message = "vchamilo_load_db_template : Load error on query $l"; $erroritem->content = $query; $erroritems[] = $erroritem; @@ -459,7 +450,7 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad) $pgm = !empty($mysqldumpcmd) ? stripslashes($mysqldumpcmd) : false ; if (!$pgm) { - $erroritem = new StdClass(); + $erroritem = new stdClass(); $erroritem->message = "Database dump command not available check here: "; $url = api_get_path(WEB_CODE_PATH).'admin/configure_plugin.php?name=vchamilo'; $erroritem->message .= Display::url($url, $url); @@ -470,7 +461,7 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad) $pgm = str_replace('/', DIRECTORY_SEPARATOR, $pgm); if (!is_executable($phppgm)){ - $erroritem = new StdClass(); + $erroritem = new stdClass(); $erroritem->message = "Database dump command $phppgm does not match any executable"; return array($erroritem); } @@ -501,15 +492,23 @@ function vchamilo_dump_databases($vchamilo, $outputfilerad) /** * read manifest values in vchamilo template. -* @uses $CFG */ function vchamilo_get_vmanifest($version) { - include(api_get_path(SYS_PATH, SYS_PATH).'/plugin/vchamilo/templates/'.$version.'_sql/manifest.php'); - $manifest->templatewwwroot = $templatewwwroot; - $manifest->templatevdbprefix = $templatevdbprefix; - $manifest->coursefolder = $coursefolder; - return $manifest; + $file = api_get_path(SYS_PATH).'/plugin/vchamilo/templates/'.$version.'/manifest.php'; + if (file_exists($file)) { + + include($file); + + $manifest = new stdClass(); + $manifest->templatewwwroot = $templatewwwroot; + // $manifest->templatevdbprefix = $templatevdbprefix; + // $manifest->coursefolder = $coursefolder; + + return $manifest; + } + + return false; } /** @@ -544,19 +543,21 @@ function vchamilo_get_available_templates() $absolute_templatesdir = $_configuration['root_sys'].$templatefoldername; // Scans the templates. - if (!is_dir($absolute_templatesdir)){ + if (!is_dir($absolute_templatesdir)) { mkdir($absolute_templatesdir, 0777, true); } - $dirs = glob($absolute_templatesdir.'/*'); - $vtemplates = preg_grep("/[^\/](.*)_vchamilodata$/", $dirs); + + $finder = new \Symfony\Component\Finder\Finder(); + $dirs = $finder->in($absolute_templatesdir)->depth('== 0'); // Retrieves template(s) name(s). Should be hostnames. $templatesarray = array('' => $plugininstance->get_lang('emptysite')); - if ($vtemplates){ - foreach($vtemplates as $vtemplatedir){ - preg_match("/([^\/]*)_vchamilodata/", $vtemplatedir, $matches); - $templatesarray[$matches[1]] = $matches[1]; - if (!isset($first)) $first = $matches[1]; + if ($dirs) { + /** @var Symfony\Component\Finder\SplFileInfo $dir */ + foreach ($dirs as $dir) { + if (is_dir($dir->getPathname())) { + $templatesarray[$dir->getRelativePathname()] = $dir->getRelativePathname(); + } } } @@ -607,12 +608,8 @@ function vchamilo_load_files_from_template($vchamilo, $template) global $_configuration; // Make template directory (files and SQL). - $separator = DIRECTORY_SEPARATOR; - $templatefoldername = 'plugin'.$separator.'vchamilo'.$separator.'templates'; - $relative_template_datadir = $templatefoldername.$separator.$template.'_vchamilodata'; - - $absolute_templatesdir = $_configuration['root_sys'].$templatefoldername; - $absolute_template_datadir = $_configuration['root_sys'].$relative_template_datadir; + $separator = DIRECTORY_SEPARATOR; + $absolute_template_datadir = $_configuration['root_sys'].'plugin'.$separator.'vchamilo'.$separator.'templates'.$separator.$template; $vchamilo->virtual = true; @@ -621,22 +618,39 @@ function vchamilo_load_files_from_template($vchamilo, $template) $vhomepath = api_get_path(SYS_HOME_PATH, (array)$vchamilo); $varchivepath = api_get_path(SYS_ARCHIVE_PATH, (array)$vchamilo); - echo "archiveapth : $varchivepath"; + Display::addFlash(Display::return_message("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); - - Display::addFlash(Display::return_message("Copying {$absolute_template_datadir}/{$manifest->coursefolder} => $vcoursepath")); - Display::addFlash(Display::return_message("Copying {$absolute_template_datadir}/archive/{$originarchivedir} => $varchivepath")); - Display::addFlash(Display::return_message("Copying {$absolute_template_datadir}/home/{$originhomedir} => $vhomepath")); - - 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); + if ($manifest) { + + // get the protocol free hostname + Display::addFlash( + Display::return_message("Copying {$absolute_template_datadir}/data/courses => $vcoursepath") + ); + Display::addFlash( + Display::return_message("Copying {$absolute_template_datadir}/data/archive => $varchivepath") + ); + Display::addFlash( + Display::return_message("Copying {$absolute_template_datadir}/data/home => $vhomepath") + ); + + copyDirTo( + chop_last_slash($absolute_template_datadir.'/data/courses'), + chop_last_slash($vcoursepath), + false + ); + copyDirTo( + chop_last_slash($absolute_template_datadir.'/data/archive'), + chop_last_slash($varchivepath), + false + ); + copyDirTo( + chop_last_slash($absolute_template_datadir.'/data/home'), + chop_last_slash($vhomepath), + false + ); + } } function chop_last_slash($path) @@ -644,54 +658,6 @@ function chop_last_slash($path) return preg_replace('/\/$/', '', $path); } -/** - * Moves a directory and its content to an other area - * - * @author - Hugues Peeters - * @param - $orig_dir_path (string) - the path of the directory to move - * @param - $destination (string) - the path of the new area - * @return - no return - */ -function copyDirContentTo($source, $destination, $move = true) { - - // Extract directory name - create it at destination - update destination trail - if (!is_dir($source)) { - return; - } - - if (!is_dir($destination)) { - mkdir($destination, api_get_permissions_for_new_directories()); - } - - $DIR = opendir($source); - - while ($element = readdir($DIR)) { - if ($element == '.' || $element == '..') { - continue; // Skip the current and parent directories - } elseif (is_file($source.'/'.$element)) { - copy($source.'/'.$element, $destination.'/'.$element); - - if ($move) { - unlink($source.'/'.$element) ; - } - } elseif (is_dir($source.'/'.$element)) { - $dirs_to_copy[] = $element; - } - } - - closedir($DIR) ; - - if (sizeof($dirs_to_copy) > 0) { - foreach ($dirs_to_copy as $dir) { - copyDirContentTo($source.'/'.$dir, $destination.'/'.$dir, $move); // Recursivity - } - } - - if ($move) { - rmdir($source) ; - } -} - // from moot define('PARAM_BOOL', 1); define('PARAM_INT', 2); @@ -752,8 +718,8 @@ function get_config($module, $key = false, $isplugin = true) { } } -function set_config($key, $value, $module, $isplugin = false) { - +function set_config($key, $value, $module, $isplugin = false) +{ if ($isplugin) { $key = $module.'_'.$key; } @@ -770,7 +736,7 @@ function set_config($key, $value, $module, $isplugin = false) { * gets a string from a component * */ -function get_string($key, $component = 'local_ent_installer', $a = ''){ +function get_string($key, $component = 'local_ent_installer', $a = '') { global $_configuration; static $strings; static $fallbackstrings; @@ -906,7 +872,19 @@ function ctrace($str) { * @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) { +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)) { @@ -1012,6 +990,7 @@ function api_update_setting($val, $var, $sk = null, $type = 'textfield', $c = nu */ function make_tms($time) { $tms = date('Y-m-d H:i:s', $time); + return $tms; } diff --git a/plugin/vchamilo/views/editinstance.controller.php b/plugin/vchamilo/views/editinstance.controller.php index add323ed95..9a7f49d13e 100644 --- a/plugin/vchamilo/views/editinstance.controller.php +++ b/plugin/vchamilo/views/editinstance.controller.php @@ -31,7 +31,7 @@ if ($data->what == 'addinstance' || $data->what == 'registerinstance') { return ; } - ctrace("Registering VChamilo"); + ctrace("Registering: ".$data->root_web); $tablename = Database::get_main_table('vchamilo'); $sql = "SELECT * FROM $tablename WHERE root_web = '".Database::escape_string($data->root_web)."'"; @@ -114,8 +114,6 @@ if ($data->what == 'addinstance' || $data->what == 'registerinstance') { } } - ctrace("Checking direct home dir "); - // if real homedir IS NOT under chamilo install, link to it // Seems not be necessary as we can globally link the whole Home container /* @@ -141,8 +139,6 @@ if ($data->what == 'addinstance' || $data->what == 'registerinstance') { } } - ctrace("Checking direct archive dir "); - // if real archivedir IS NOT under chamilo install, link to it // Seems not be necessary as we can globally link the whole Home container /* @@ -164,7 +160,7 @@ if ($data->what == 'addinstance' || $data->what == 'registerinstance') { ctrace("Creating databases from template $template "); vchamilo_create_databases($data); ctrace("Loading data template $template "); - vchamilo_load_db_template($data, 'main_database', $template); + vchamilo_load_db_template($data, $template); ctrace("Coying files from template $template "); vchamilo_load_files_from_template($data, $template); } diff --git a/plugin/vchamilo/views/syncparams.controller.php b/plugin/vchamilo/views/syncparams.controller.php index bd9b8c1c8d..7edf8dad6e 100644 --- a/plugin/vchamilo/views/syncparams.controller.php +++ b/plugin/vchamilo/views/syncparams.controller.php @@ -63,6 +63,8 @@ if ($action == 'syncthis') { 'variable' => $setting['variable'], 'subkey' => $setting['subkey'], 'category' => $setting['category'], + 'type' => $setting['type'], + 'comment' => $setting['comment'], 'access_url' => $setting['access_url'], ); @@ -71,10 +73,10 @@ if ($action == 'syncthis') { $table = $chm['main_database'].".settings_current"; if ($delifempty && empty($value)) { $sql = "DELETE FROM $table WHERE - selected_value = '$value' AND - variable = '{{$setting['variable']}}' AND - access_url = '{$setting['access_url']}' - "; + selected_value = '$value' AND + variable = '{{$setting['variable']}}' AND + access_url = '{$setting['access_url']}' + "; Database::query($sql); //$res = $DB->delete_records('settings_current', $params, $chm->main_database); @@ -82,10 +84,10 @@ if ($action == 'syncthis') { } else { $sql = " SELECT * FROM $table - WHERE - variable = '{{$setting['variable']}}' AND - subkey = '{$setting['subkey']}' - "; + WHERE + variable = '".$setting['variable']."' AND + access_url = '{$setting['access_url']}' + "; $result = Database::query($sql); if (Database::num_rows($result)) { @@ -94,7 +96,7 @@ if ($action == 'syncthis') { WHERE id = $settingId"; Database::query($sql); } else { - Database::insert($table, $params); + Database::insert($table, $params, true); } } }