libdir.'/authlib.php'); require_once($CFG->dirroot.'/auth/manual/auth.php'); require_once($CFG->dirroot.'/search/lib.php'); require_once($CFG->dirroot.'/calendar/lib.php'); require_once($CFG->dirroot.'/mod/forum/lib.php'); require_once($CFG->dirroot.'/lib/datalib.php'); require_once($CFG->dirroot.'/lib/gdlib.php'); require_once($CFG->dirroot.'/lib/grade/grade_grade.php'); require_once($CFG->dirroot.'/lib/grade/grade_item.php'); require_once($CFG->dirroot.'/lib/gradelib.php'); require_once("$CFG->dirroot/enrol/locallib.php"); /** * Joomdle authentication plugin. */ class auth_plugin_joomdle extends auth_plugin_manual { /** * Constructor. */ function auth_plugin_joomdle() { $this->authtype = 'joomdle'; $this->config = get_config('', 'joomla_url'); $this->config = get_config('auth/joomdle'); //XXX if (empty($this->config->extencoding)) { $this->config->extencoding = 'utf-8'; } } function can_signup() { return true; } function user_signup($user, $notify=true) { global $CFG, $DB; require_once($CFG->dirroot.'/user/profile/lib.php'); $password_clear = $user->password; $user->password = hash_internal_user_password($user->password); if (! ($user->id = $DB->insert_record('user', $user)) ) { print_error('auth_emailnoinsert','auth'); } /// Save any custom profile field information profile_save_data($user); $conditions = array ('id' => $user->id); $user = $DB->get_record('user', $conditions); /* Create user in Joomla */ $userinfo['username'] = $user->username; $userinfo['password'] = $password_clear; $userinfo['password2'] = $password_clear; $userinfo['name'] = $user->firstname. " " . $user->lastname; $userinfo['email'] = $user->email; $userinfo['block'] = 1; $this->call_method ("createUser", $userinfo); events_trigger('user_created', $user); if (! send_confirmation_email($user)) { print_error('auth_emailnoemail','auth'); } if ($notify) { global $CFG; $emailconfirm = get_string('emailconfirm'); $navlinks = array(); $navlinks[] = array('name' => $emailconfirm, 'link' => null, 'type' => 'misc'); $navigation = build_navigation($navlinks); print_header($emailconfirm, $emailconfirm, $navigation); notice(get_string('emailconfirmsent', '', $user->email), "$CFG->wwwroot/index.php"); } else { return true; } } function can_confirm() { return true; } function user_confirm($username, $confirmsecret) { global $DB; $user = get_complete_user_data('username', $username); if (!empty($user)) { if ($user->confirmed) { return AUTH_CONFIRM_ALREADY; } else if ($user->auth != 'joomdle') { return AUTH_CONFIRM_ERROR; } else if ($user->secret == stripslashes($confirmsecret)) { // They have provided the secret key to get in $conditions = array ('id' => $user->id); if (!$DB->set_field("user", "confirmed", 1, $conditions)) { return AUTH_CONFIRM_FAIL; } if (!$DB->set_field("user", "firstaccess", time(), $conditions)) { return AUTH_CONFIRM_FAIL; } /* Enable de user in Joomla */ $this->call_method ("activateUser", $username); return AUTH_CONFIRM_OK; } } else { return AUTH_CONFIRM_ERROR; } } /** * Returns true if the username and password work and false if they are * wrong or don't exist. * * @param string $username The username (with system magic quotes) * @param string $password The password (with system magic quotes) * * @return bool Authentication success or failure. */ function user_login($username, $password) { if (!$password) return false; $user = get_complete_user_data ('username', $username); if (!$user) return false; $logged = $this->call_method ("login", $username, $password); return $logged; } function can_change_password() { return true; } function user_update_password ($user, $password) { $return = $this->call_method ("changePassword", $user->username, $password); return true; // return $return; } /** * Prints a form for configuring this authentication plugin. * * This function is called from admin/auth.php, and outputs a full page with * a form for configuring this plugin. * * @param array $page An object containing all the data for this page. */ function config_form($config, $err, $user_fields) { $this->config = get_config('', 'joomla_url'); include "config.html"; } function process_config($config) { global $DB; if (!isset($config->joomla_url)) { $config->joomla_url = 'http://localhost/joomla'; } set_config('joomla_url', $config->joomla_url); if (!isset($config->joomla_version)) { $config->joomla_version = 'j15'; } set_config('joomla_version', $config->joomla_version, 'auth/joomdle'); if (!isset($config->connection_method)) { $config->connection_method = 'fgc'; } set_config('connection_method', $config->connection_method, 'auth/joomdle'); if (!isset($config->sync_to_joomla)) { $config->sync_to_joomla = 0; } set_config('sync_to_joomla', $config->sync_to_joomla, 'auth/joomdle'); /* if (!isset($config->jomsocial_integration)) { $config->jomsocial_integration = 0; } set_config('jomsocial_integration', $config->jomsocial_integration, 'auth/joomdle'); */ if (!isset($config->jomsocial_activities)) { $config->jomsocial_activities = 0; } set_config('jomsocial_activities', $config->jomsocial_activities, 'auth/joomdle'); if (!isset($config->jomsocial_groups)) { $config->jomsocial_groups = 0; } set_config('jomsocial_groups', $config->jomsocial_groups, 'auth/joomdle'); if (!isset($config->jomsocial_groups_delete)) { $config->jomsocial_groups_delete = 0; } set_config('jomsocial_groups_delete', $config->jomsocial_groups_delete, 'auth/joomdle'); if (!isset($config->auto_sell)) { $config->auto_sell = 0; } set_config('auto_sell', $config->auto_sell, 'auth/joomdle'); if (!isset($config->enrol_parents)) { $config->enrol_parents = 0; } set_config('enrol_parents', $config->enrol_parents, 'auth/joomdle'); if (!isset($config->parent_role_id)) { $config->parent_role_id = ''; } set_config('parent_role_id', $config->parent_role_id, 'auth/joomdle'); if (($config->jomsocial_activities) || ($config->jomsocial_groups) || ($config->enrol_parents) || ($config->auto_sell)) { /* Insert the event handlers */ $conditions = array ('eventname' => 'course_created', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'course_created'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } $conditions = array ('eventname' => 'course_deleted', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'course_deleted'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } $conditions = array ('eventname' => 'role_assigned', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'role_assigned'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } $conditions = array ('eventname' => 'role_unassigned', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'role_unassigned'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } $conditions = array ('eventname' => 'course_updated', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'course_updated'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } } else { /* Delete the event handlers */ $conditions = array ('eventname' => 'course_created', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); $conditions = array ('eventname' => 'course_deleted', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); $conditions = array ('eventname' => 'role_assigned', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); $conditions = array ('eventname' => 'role_unassigned', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); $conditions = array ('eventname' => 'course_updated', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); } if ($config->sync_to_joomla) { /* Insert the event handlers */ $conditions = array ('eventname' => 'user_created', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'user_created'; $handler->eventname = $event; $handler->component = 'joomdle'; $handler->handlerfile = '/auth/joomdle/auth.php'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } $conditions = array ('eventname' => 'user_updated', 'component' => 'joomdle'); if (!$DB->record_exists ('events_handlers', $conditions)) { $event = 'user_updated'; $handler->eventname = $event; $handler->handlermodule = 'auth/joomdle'; $handler->component = 'joomdle'; $handler->handlerfunction = serialize ('joomdle_'.$event); $handler->schedule = 'instant'; $handler->status = 0; $DB->insert_record ('events_handlers', $handler); } } else { /* Delete the event handlers */ $conditions = array ('eventname' => 'user_created', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); $conditions = array ('eventname' => 'user_updated', 'component' => 'joomdle'); $DB->delete_records ('events_handlers', $conditions); } return true; } function _get_xmlrpc_url () { $joomla_version = get_config('auth/joomdle', 'joomla_version'); switch ($joomla_version) { case "j15": $joomla_xmlrpc_server_url = get_config (NULL, 'joomla_url').'/xmlrpc/index.php'; break; case "j16": $joomla_xmlrpc_server_url = get_config (NULL, 'joomla_url').'/index.php?option=com_joomdle&task=ws.server&format=xmlrpc'; } return $joomla_xmlrpc_server_url; } function call_method ($method, $params = '', $params2 = '', $params3 = '' , $params4 = '', $params5 = '') { $connection_method = get_config('auth/joomdle', 'connection_method'); if ($connection_method == 'fgc') $response = auth_plugin_joomdle::call_method_fgc ($method, $params, $params2, $params3, $params4, $params5); else $response = auth_plugin_joomdle::call_method_curl ($method, $params, $params2, $params3, $params4, $params5); return $response; } function call_method_fgc ($method, $params = '', $params2 = '', $params3 = '' , $params4 = '', $params5 = '') { // $joomla_xmlrpc_url = get_config (NULL, 'joomla_url').'/xmlrpc/index.php'; $joomla_xmlrpc_url = auth_plugin_joomdle::_get_xmlrpc_url (); if ($params == '') $request = xmlrpc_encode_request("joomdle.".$method, array (), array ('encoding' => 'utf8')); else if ($params2 == '') $request = xmlrpc_encode_request("joomdle.".$method, array ($params), array ('encoding' => 'utf8')); else if ($params3 == '') $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2), array ('encoding' => 'utf8')); else if ($params4 == '') $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3), array ('encoding' => 'utf8')); else if ($params5 == '') $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3, $params4), array ('encoding' => 'utf8')); else $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3, $params4, $params5), array ('encoding' => 'utf8')); $context = stream_context_create(array('http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml ", 'content' => $request ))); $response = file_get_contents($joomla_xmlrpc_url, false, $context); $data = xmlrpc_decode($response, 'utf8'); if (is_array ($data)) if (xmlrpc_is_fault ($data)) { return "XML-RPC Error (".$data['faultCode']."): ".$data['faultString']; } return $data; } function call_method_curl ($method, $params = '', $params2 = '', $params3 = '' , $params4 = '', $params5 = '') { //$joomla_xmlrpc_url = get_config (NULL, 'joomla_url').'/xmlrpc/index.php'; $joomla_xmlrpc_url = auth_plugin_joomdle::_get_xmlrpc_url (); if (!$params) $request = xmlrpc_encode_request("joomdle.".$method, array (), array ('encoding' => 'utf8')); else if (!$params2) $request = xmlrpc_encode_request("joomdle.".$method, array ($params), array ('encoding' => 'utf8')); else if (!$params3) $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2), array ('encoding' => 'utf8')); else if (!$params4) $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3), array ('encoding' => 'utf8')); else if (!$params5) $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3, $params4), array ('encoding' => 'utf8')); else $request = xmlrpc_encode_request("joomdle.".$method, array ($params, $params2, $params3, $params4, $params5), array ('encoding' => 'utf8')); $headers = array(); array_push($headers,"Content-Type: text/xml"); array_push($headers,"Content-Length: ".strlen($request)); array_push($headers,"\r\n"); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $joomla_xmlrpc_url); # URL to post to curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); # custom headers, see above curl_setopt( $ch, CURLOPT_POSTFIELDS, $request ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'POST' ); # This POST is special, and uses its specified Content-type $response = curl_exec( $ch ); # run! curl_close($ch); $response = xmlrpc_decode($response, 'utf8'); if (is_array ($response)) if (xmlrpc_is_fault ($response)) { return "XML-RPC Error (".$response['faultCode']."): ".$response['faultString']; } return $response; } function get_file ($file) { $connection_method = get_config('auth/joomdle', 'connection_method'); if ($connection_method == 'fgc') $response = file_get_contents ($file, FALSE, NULL); else $response = auth_plugin_joomdle::get_file_curl ($file); return $response; } function get_file_curl ($file) { $ch = curl_init(); // set url curl_setopt($ch, CURLOPT_URL, $file); //return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); return $output; } function test () { return "Moodle web services are working!"; } function system_check () { $system['joomdle_auth'] = is_enabled_auth('joomdle'); // $system['mnet_auth'] = is_enabled_auth('mnet'); $system['mnet_auth'] = 1; // Left this way so we can have the same system check code for 19 and 20 /* Web services and XMLRPC enabled */ // $system['enablewebservices'] = get_config (NULL, 'enablewebservices'); $joomla_url = get_config (NULL, 'joomla_url'); if ($joomla_url == '') { $system['joomdle_configured'] = 0; } else { $system['joomdle_configured'] = 1; $data = $this->call_method ("test"); $system['test_data'] = $data; } return $system; } function get_paypal_config () { global $CFG; $paypal_config = array (); $paypal_config['paypalurl'] = empty($CFG->usepaypalsandbox) ? 'https://www.paypal.com/cgi-bin/webscr' : 'https://www.sandbox.paypal.com/cgi-bin/webscr'; $plugin = enrol_get_plugin('paypal'); $paypal_config['paypalbusiness'] = $plugin->get_config('paypalbusiness'); return $paypal_config; } function my_courses ($username) { global $CFG; $username = utf8_decode ($username); $user = get_complete_user_data ('username', $username); $c = enrol_get_users_courses ($user->id); $courses = array (); $i = 0; foreach ($c as $course) { $record = array (); $record['id'] = $course->id; $record['fullname'] = $course->fullname; $courses[$i] = $record; $i++; } return $courses; } /** * Returns course list * * @param int $available If true, return only enrollable courses */ function list_courses ($available = 0, $sortby = 'created', $guest = 0) { global $CFG, $DB; $where = ''; // XXX This has changed in Moodle 2.0. /* if ($available) $where = " AND co.enrollable = '1'"; REMOVED FROM OPTIONS if ($guest) $where = " AND co.guest = '1'"; DONE */ $query = "SELECT co.id AS remoteid, ca.id AS cat_id, co.sortorder, co.fullname, co.shortname, co.idnumber, co.summary, co.startdate, co.timecreated as created, co.timemodified as modified, ca.name AS cat_name, ca.description AS cat_description FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' $where ORDER BY $sortby "; $records = $DB->get_records_sql($query); $i = 0; $cursos = array (); foreach ($records as $curso) { $enrol_methods = enrol_get_instances($curso->remoteid, true); if ($guest) // if only courses for guests { $guest_ok = false; foreach ($enrol_methods as $method) { if ($method->enrol == 'guest') { $guest_ok = true; break; } } if (!$guest_ok) continue; } // $curso->fullname = utf8_encode ($curso->fullname); $c = get_object_vars ($curso); $context = get_context_instance(CONTEXT_COURSE, $curso->remoteid); $c['summary'] = file_rewrite_pluginfile_urls ($c['summary'], 'pluginfile.php', $context->id, 'course', 'summary', NULL); $c['summary'] = str_replace ('pluginfile.php', '/auth/joomdle/pluginfile_joomdle.php', $c['summary']); $cursos[$i] = $c; $i++; } return ($cursos); } /** * Returns course list * * @param start_chars: return courses that starts with these chars */ function courses_abc ($start_chars) { global $CFG, $DB; $where = '('; $array = str_split ($start_chars); foreach ($array as $c) { $conds[] = " (fullname like '$c%')"; } $where .= implode (' OR ', $conds); $where .= ')'; $query = "SELECT co.id AS remoteid, ca.id AS cat_id, co.sortorder, co.fullname, co.shortname, co.idnumber, co.summary, co.startdate, co.timecreated as created, co.timemodified as modified, ca.name AS cat_name, ca.description AS cat_description FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' AND $where ORDER BY fullname "; $records = $DB->get_records_sql($query); $cursos = array (); foreach ($records as $curso) { // $curso->fullname = utf8_encode ($curso->fullname); $c = get_object_vars ($curso); $cursos[] = $c; } return ($cursos); } /** * Returns course category list * * @param int $cat Parent category */ function get_course_categories ($cat = 0) { global $CFG, $DB; $cat = addslashes ($cat); $query = "SELECT id, name, description FROM {$CFG->prefix}course_categories WHERE visible = '1' AND parent = ? ORDER BY sortorder ASC "; $params = array ($cat); $records = $DB->get_records_sql($query, $params); $cats = array (); foreach ($records as $cat) { $c = get_object_vars ($cat); $cats[] = $c; } return ($cats); } /** * Returns courses from a specific category * * @param string $category Category ID * @param int $available If true, return only enrollable courses */ function courses_by_category ($category, $available = 0) { global $CFG, $DB; $where = ''; if ($available) $where = " AND co.enrollable = '1'"; $query = "SELECT co.id AS remoteid, ca.id AS cat_id, ca.name AS cat_name, ca.description AS cat_description, co.sortorder, co.fullname, co.summary FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' AND ca.id = ? $where ORDER BY sortorder ASC "; $params = array ($category); $records = $DB->get_records_sql($query,$params); $cursos = array (); foreach ($records as $curso) { $c = get_object_vars ($curso); $context = get_context_instance(CONTEXT_COURSE, $curso->remoteid); $c['summary'] = file_rewrite_pluginfile_urls ($c['summary'], 'pluginfile.php', $context->id, 'course', 'summary', NULL); $c['summary'] = str_replace ('pluginfile.php', '/auth/joomdle/pluginfile_joomdle.php', $c['summary']); $cursos[] = $c; } return ($cursos); } /** * Returns courses that have their enrolment period between two dates * * @param int $start_date Interval start, Unix Timestamp format * @param int $end_date Interval end, Unix Timestamp format /XXX not used */ function courses_by_date ($start_date, $end_date) { global $CFG; $start_date = addslashes ($start_date); $end_date = addslashes ($end_date); $query = "SELECT co.id AS remoteid, ca.id AS cat_id, ca.name AS cat_name, ca.description AS cat_description, co.sortorder, co.fullname, co.shortname, co.idnumber, co.summary, co.startdate, co.cost, co.currency, co.defaultrole AS defaultroleid, r.name AS defaultrolename FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category LEFT JOIN {$CFG->prefix}role r ON r.id = co.defaultrole WHERE co.visible = '1' AND co.enrollable = '2' AND enrolstartdate >= '$start_date' AND enrolenddate <= '$end_date' ORDER BY sortorder ASC "; return get_records_sql($query); } /** * Returns detailed info aboout a course * * @param int $id Course identifier */ function get_course_info ($id) { global $CFG, $DB; $query = "SELECT co.id AS remoteid, ca.id AS cat_id, ca.name AS cat_name, ca.description AS cat_description, co.sortorder, co.fullname, co.shortname, co.idnumber, co.summary, co.startdate, co.numsections, co.lang FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.id = ? ORDER BY sortorder ASC"; $params = array ($id); $record = $DB->get_record_sql($query, $params); $course_info = get_object_vars ($record); $context = get_context_instance(CONTEXT_COURSE, $record->remoteid); $course_info['summary'] = file_rewrite_pluginfile_urls ($course_info['summary'], 'pluginfile.php', $context->id, 'course', 'summary', NULL); $course_info['summary'] = str_replace ('pluginfile.php', '/auth/joomdle/pluginfile_joomdle.php', $course_info['summary']); /* Get course cost if any */ $instances = enrol_get_instances($id, false); foreach ($instances as $instance) { if (($instance->enrol == 'paypal') || ($instance->enrol == 'joomdle')) { $enrol = $instance->enrol; $query = "SELECT cost, currency FROM {$CFG->prefix}enrol where courseid = ? and enrol = ?"; $params = array ($id, $enrol); $record = $DB->get_record_sql($query, $params); $course_info['cost'] = $record->cost; $course_info['currency'] = $record->currency; } /* Get enrolment dates. We get the last one, as good/bad as any other XXX */ if ($instance->enrolstartdate) $course_info['enrolstartdate'] = $instance->enrolstartdate; if ($instance->enrolenddate) $course_info['enrolenddate'] = $instance->enrolenddate; } return $course_info; } /** * Returns course topics * * @param int $id Course identifier */ function get_course_contents ($id) { global $CFG, $DB; $query = "SELECT cs.id, cs.section, cs.summary FROM {$CFG->prefix}course_sections cs WHERE cs.course = ? and cs.visible = 1 "; $params = array ($id); $records = $DB->get_records_sql($query, $params); $context = get_context_instance(CONTEXT_COURSE, $id); $data = array (); foreach ($records as $r) { $e['section'] = $r->section; $e['summary'] = $r->summary; $e['summary'] = file_rewrite_pluginfile_urls ($r->summary, 'pluginfile.php', $context->id, 'course', 'section', $r->id); $e['summary'] = str_replace ('pluginfile.php', '/auth/joomdle/pluginfile_joomdle.php', $e['summary']); $data[$i] = $e; $i++; } return $data; } /** * Returns editing teachers * * @param int $id Course identifier */ function get_course_editing_teachers ($id) { global $CFG; $id = addslashes ($id); $context = get_context_instance(CONTEXT_COURSE, $id); /* 3 indica profesores editores (table mdl_role) */ $profs = get_role_users(3 , $context); $data = array (); foreach ($profs as $p) { $e['firstname'] = $p->firstname; $e['lastname'] = $p->lastname; $data[$i] = $e; $i++; } return $data; } function teachers_abc ($start_chars) { global $CFG, $DB; $where = '('; $array = str_split ($start_chars); foreach ($array as $c) { $conds[] = " (u.lastname like '$c%')"; } $where .= implode (' OR ', $conds); $where .= ')'; $query = "SELECT distinct (u.id), u.username, u.firstname, u.lastname FROM {$CFG->prefix}course as c, {$CFG->prefix}role_assignments AS ra, {$CFG->prefix}user AS u, {$CFG->prefix}context AS ct WHERE c.id = ct.instanceid AND ra.roleid =3 AND ra.userid = u.id AND ct.id = ra.contextid AND $where"; $records = $DB->get_records_sql($query); $data = array (); foreach ($records as $p) { $e['firstname'] = $p->firstname; $e['lastname'] = $p->lastname; $e['username'] = $p->username; $data[$i] = $e; $i++; } return $data; } function teacher_courses ($username) { global $CFG, $DB; $username = utf8_decode ($username); $query = " SELECT distinct c.id as remoteid, c.fullname, ca.name as cat_name, ca.id as cat_id FROM {$CFG->prefix}course as c, {$CFG->prefix}role_assignments AS ra, {$CFG->prefix}user AS u, {$CFG->prefix}context AS ct, {$CFG->prefix}course_categories ca WHERE c.id = ct.instanceid AND ra.roleid =3 AND ra.userid = u.id AND ct.id = ra.contextid AND ca.id = c.category and u.username= ?"; $params = array ($username); $records = $DB->get_records_sql($query, $params); $data = array (); foreach ($records as $p) { $e['remoteid'] = $p->remoteid; $e['fullname'] = $p->fullname; $e['cat_id'] = $p->cat_id; $e['cat_name'] = $p->cat_name; $data[$i] = $e; $i++; } return $data; } /** * Returns non-editing teachers * * @param int $id Course identifier XXX Not passed to Moodle 2.0, as is not really used */ function get_course_non_editing_teachers ($id) { global $CFG; $id = addslashes ($id); $context = get_context_instance(CONTEXT_COURSE, $id); /* 4 indica profesores no editores (table mdl_role) */ $profs = get_role_users(4 , $context); return $profs; } /** * Returns number of visible courses * */ function get_course_no () { global $CFG, $DB; $query = "SELECT count(*) FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' "; return $DB->count_records_sql($query); } /** * Returns number of visible and enrollable courses XXX NOT WORKING IN 2.0 now * */ function get_enrollable_course_no () { global $CFG, $DB; $query = "SELECT count(*) FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' "; return $DB->count_records_sql($query); } /** * Returns student number * */ function get_student_no () { global $CFG, $DB; $query = "select count(distinct (userid)) from {$CFG->prefix}role_assignments where roleid=5; "; return $DB->count_records_sql($query); } /** * Returns number of submitted assignments in each task of the course * * @param int $id Course identifier * */ function get_assignment_submissions ($id) { global $CFG, $DB; /* Obtenemos todas las tareas del curso */ $query = "select id,name from {$CFG->prefix}assignment where course= ?; "; /* Para cada una, obtenemos el numero de trabajos entregados */ $params = array ($id); $tareas = $DB->get_records_sql($query, $params); $i = 0; $rdo = array (); foreach ($tareas as $tarea) { $ass_id = $tarea->id; $query = "select count(*) from {$CFG->prefix}assignment_submissions where assignment= ?; "; $params = array ($ass_id); $n = $DB->count_records_sql($query, $params); $rdo[$i]['id'] = $tarea->id; $rdo[$i]['tarea'] = $tarea->name; $rdo[$i]['entregados'] = $n; $i++; } return $rdo; } /** * Returns total number of submitted assignments * */ function get_total_assignment_submissions () { global $CFG, $DB; $query = "select count(*) from {$CFG->prefix}assignment_submissions; "; $n = $DB->count_records_sql($query); return $n; } /** * Returns average grade for a task * * @param int $id Course identifier */ function get_assignment_grades ($id) { global $CFG, $DB; $SQL = "SELECT g.itemid, gi.itemname as iname,SUM(g.finalgrade) AS sum FROM {$CFG->prefix}grade_items gi JOIN {$CFG->prefix}grade_grades g ON g.itemid = gi.id WHERE gi.courseid = ? AND g.finalgrade IS NOT NULL GROUP BY g.itemid"; $sum_array = array(); $params = array ($id); if ($sums = $DB->get_records_sql($SQL, $params)) { foreach ($sums as $itemid => $csum) { $sql = " select count(*) from {$CFG->prefix}grade_grades where itemid= ?;"; $params = array ($itemid); $n = $DB->count_records_sql($sql, $params); $nota['tarea'] = $csum->iname; $nota['media'] = $csum->sum / $n; $sum_array[] = $nota; } } return $sum_array; } function get_average_grade ($itemid) { global $CFG, $DB; $id = addslashes ($itemid); $avg = 0; $SQL = "SELECT g.itemid, gi.itemname as iname,SUM(g.finalgrade) AS sum FROM {$CFG->prefix}grade_items gi JOIN {$CFG->prefix}grade_grades g ON g.itemid = gi.id WHERE gi.id = ? AND g.finalgrade IS NOT NULL GROUP BY g.itemid"; $sum_array = array(); $params = array ($itemid); if ($sums = $DB->get_record_sql($SQL, $params)) { $sql = " select count(*) from {$CFG->prefix}grade_grades where itemid=?;"; $n = $DB->count_records_sql($sql, $params); $avg = $sums->sum / $n; } return $avg; } /** * Returns stats about student grades * FIXME doc return type * //XXX creo que no la usamos * @param int $id Course identifier */ function get_assignments_grades ($id) { global $CFG, $DB; /* Obtenemos todas las tareas del curso */ $query = "select id,name from {$CFG->prefix}assignment where course=?; "; /* Para cada una, obtenemos la nota media */ $params = array ($id); $tareas = $DB->get_records_sql($query, $params); $i = 0; foreach ($tareas as $tarea) { $ass_id = $tarea->id; $query = "select itemid,avg(finalgrade) as media from {$CFG->prefix}grade_grades where itemid= ? and finalgrade is not NULL GROUP BY itemid; "; $params = array ($ass_id); $n = $DB->get_records_sql($query, $params); $rdo[$i]['tarea'] = $tarea->name; foreach ($n as $nn) $rdo[$i]['media'] = $nn; $i++; } return $rdo; } /** * Returns grades of a student for each task in a course * * @param string $user Username * @param int $cid Course identifier */ function get_user_grades ($user,$cid) { global $CFG, $DB; $user = utf8_decode ($user); $user = get_complete_user_data ('username', $user); $uid = $user->id; $SQL = "SELECT g.itemid, g.finalgrade,gi.courseid,gi.itemname,gi.id, g.timemodified FROM {$CFG->prefix}grade_items gi JOIN {$CFG->prefix}grade_grades g ON g.itemid = gi.id JOIN {$CFG->prefix}user u ON u.id = g.userid JOIN {$CFG->prefix}role_assignments ra ON ra.userid = u.id WHERE g.finalgrade IS NOT NULL AND u.id = ? AND gi.courseid = ? GROUP BY g.itemid"; $sum_array = array(); $params = array ($uid, $cid); if ($sums = $DB->get_records_sql($SQL, $params)) { $i = 0; $rdo = array (); foreach ($sums as $sum) { if (! $grade_grade = grade_grade::fetch(array('itemid'=>$sum->id,'userid'=>$uid))) { $grade_grade = new grade_grade(); $grade_grade->userid = $this->user->id; $grade_grade->itemid = $grade_object->id; } $grade_item = $grade_grade->load_grade_item(); $sums2[$i] = $sum; $scale = $grade_item->load_scale(); $formatted_grade = grade_format_gradevalue($sums2[$i]->finalgrade, &$grade_item, true, GRADE_DISPLAY_TYPE_REAL); $sums2[$i]->finalgrade = $formatted_grade; $rdo[$i]['itemname'] = $sum->itemname; $rdo[$i]['finalgrade'] = $formatted_grade; $i++; } return $rdo; return $sums2; } return array(); } /** * Returns latest grades * * @param string $user Username * @param int $cid Course identifier */ function get_last_user_grades ($user, $limit) { global $CFG, $DB; $user = utf8_decode ($user); $user = get_complete_user_data ('username', $user); $uid = $user->id; if (!$limit) $limit = 1000; $SQL = "SELECT distinct(g.itemid), g.finalgrade,gi.courseid,gi.itemname,gi.id, g.timemodified as tm FROM {$CFG->prefix}grade_items gi JOIN {$CFG->prefix}grade_grades g ON g.itemid = gi.id JOIN {$CFG->prefix}user u ON u.id = g.userid JOIN {$CFG->prefix}role_assignments ra ON ra.userid = u.id WHERE g.finalgrade IS NOT NULL and gi.itemname IS NOT NULL AND u.id = ? ORDER BY tm LIMIT $limit"; $sum_array = array(); $params = array ($uid); if ($sums = $DB->get_records_sql($SQL, $params)) { $i = 0; foreach ($sums as $sum) { if (! $grade_grade = grade_grade::fetch(array('itemid'=>$sum->id,'userid'=>$uid))) { $grade_grade = new grade_grade(); $grade_grade->userid = $this->user->id; $grade_grade->itemid = $grade_object->id; } $grade_item = $grade_grade->load_grade_item(); $scale = $grade_item->load_scale(); $formatted_grade = grade_format_gradevalue($sum->finalgrade, &$grade_item, true, GRADE_DISPLAY_TYPE_REAL); $t['itemname']= $sum->itemname; $t['finalgrade']= $formatted_grade; $t['average']= $this->get_average_grade ($grade_grade->itemid); $tareas[] = $t; $i++; } return $tareas; } return array(); } /** * Retursn number of enrolled students in a course * * @param int $id Course identifier */ function get_course_students_no($id) { global $CFG; $context = get_context_instance(CONTEXT_COURSE, $id); /* 5 indica estudiantes (table mdl_role) */ $alumnos = get_role_users(5 , $context); return count($alumnos); } /** * Returns upcoming events for a course * * @param int $id Course identifier */ function get_upcoming_events ($id) { $id = addslashes ($id); $courseshown = $id; $filtercourse = array($courseshown => $id); $groupeventsfrom = array($courseshown => 1); calendar_set_filters($courses, $group, $user, $filtercourse, $groupeventsfrom, true); $events = calendar_get_upcoming($courses, $group, $user, get_user_preferences('calendar_lookahead', CALENDAR_UPCOMING_DAYS), get_user_preferences('calendar_maxevents', CALENDAR_UPCOMING_MAXEVENTS)); $data = array (); foreach ($events as $r) { $e['name'] = $r->name; $e['timestart'] = $r->timestart; $e['courseid'] = $r->courseid; $data[$i] = $e; $i++; } return $data; } /** * Returns last news for a course * * @param int $id Course identifier */ function get_news_items ($id) { global $CFG, $DB; $conditions = array ('id' => $id); $COURSE = $DB->get_record('course', $conditions); if (!$forum = forum_get_course_forum($COURSE->id, 'news')) { return array (); } $modinfo = get_fast_modinfo($COURSE); if (empty($modinfo->instances['forum'][$forum->id])) { return array (); } $cm = $modinfo->instances['forum'][$forum->id]; /// Get all the recent discussions we're allowed to see if (! $discussions = forum_get_discussions($cm, 'p.modified DESC', false, $currentgroup, $COURSE->newsitems) ) { $text .= '('.get_string('nonews', 'forum').')'; return array (); } $data = array (); foreach ($discussions as $r) { $e['discussion'] = $r->discussion; $e['subject'] = $r->subject; $e['timemodified'] = $r->timemodified; $data[$i] = $e; $i++; } return $data; } /** * Returns daily stats for a course * * @param int $id Course identifier */ function get_course_daily_stats ($id) { global $CFG, $DB; $id = addslashes ($id); $query = "select * from {$CFG->prefix}stats_daily where courseid='$id' and roleid='5' and stattype='activity'; "; $stats = $DB->get_records_sql($query); $data = array (); if ($stats) { foreach ($stats as $r) { $e['stat1'] = $r->stat1; $e['stat2'] = $r->stat2; $e['timeend'] = $r->timeend; $data[$i] = $e; $i++; } } else { $e['stat1'] = 0; $e['stat2'] = 0; $e['timeend'] = 0; $data[$i] = $e; } return $data; } /** * Return access daily stats * */ function get_site_last_week_stats () { global $CFG, $DB; $query = "select * from {$CFG->prefix}stats_weekly where stattype='logins' order by timeend DESC LIMIT 1; "; $stats = $DB->get_records_sql($query); $data = array (); if ($stats) { foreach ($stats as $r) { $e['stat1'] = $r->stat1; $e['stat2'] = $r->stat2; $data[$i] = $e; $i++; } } else { $e['stat1'] = 0; $e['stat2'] = 0; $data[$i] = $e; } return $data; } /** * Returns grading system for a course * * @param int $id Course identifier */ function get_course_grade_categories ($id) { global $CFG, $DB; $query = "select {$CFG->prefix}grade_categories.fullname, {$CFG->prefix}grade_items.grademin, {$CFG->prefix}grade_items.grademax from {$CFG->prefix}grade_categories, {$CFG->prefix}grade_items where {$CFG->prefix}grade_categories.id = {$CFG->prefix}grade_items.iteminstance and {$CFG->prefix}grade_items.courseid='$id' and itemtype='category'; "; $cats = $DB->get_records_sql($query); $data = array (); foreach ($cats as $r) { $e['fullname'] = $r->fullname; $e['grademax'] = $r->grademax; $data[$i] = $e; $i++; } return $data; } function user_exists ($username) { global $CFG, $DB; $username = utf8_decode ($username); $conditions = array ('username' => $username); $user = $DB->get_record('user',$conditions); if ($user) return 1; return 0; } /** * Creates a new Joomdle user * XXX Also used to update user profile if the user already exists * * @param string $username Joomla username */ function create_joomdle_user ($username) { global $CFG, $DB; $username = utf8_decode ($username); /* Creamos el nuevo usuario de Moodle si no está creado */ $conditions = array ('username' => $username); $user = $DB->get_record('user',$conditions); if (!$user) $user = create_user_record($username, "", "joomdle"); /* Obtenemos la información del usuario en Joomla */ $juser_info = $this->call_method ("getUserInfo", $username); $email = $juser_info['email']; $firstname = $juser_info['firstname']; $lastname = $juser_info['lastname']; $city = $juser_info['city']; $country = $juser_info['country']; $lang = $juser_info['lang']; $timezone = $juser_info['timezone']; $phone1 = $juser_info['phone1']; $phone2 = $juser_info['phone2']; $address = $juser_info['address']; $description = $juser_info['description']; $institution = $juser_info['institution']; $url = $juser_info['url']; $icq = $juser_info['icq']; $skype = $juser_info['skype']; $aim = $juser_info['aim']; $yahoo = $juser_info['yahoo']; $msn = $juser_info['msn']; $idnumber = $juser_info['idnumber']; $department = $juser_info['department']; //XXX Maybe this can be optimized for a single DB call...$bool = update_record('user', addslashes_recursive($localuser)); en ment/aut.php if (!xmlrpc_is_fault($response)) { /* Actualizamos la informacion del usuario recien creado con los datos de Joomla */ $conditions = array ('id' => $user->id); if ($firstname) $DB->set_field('user', 'firstname', $firstname, $conditions); if ($lastname) $DB->set_field('user', 'lastname', $lastname, $conditions); if ($email) $DB->set_field('user', 'email', $email, $conditions); /* Set first access as now */ $DB->set_field('user', 'firstaccess', time (), $conditions); /* Optional data in Joomla, only fill if has a value */ if ($city) $DB->set_field('user', 'city', ($city), $conditions); if ($country) $DB->set_field('user', 'country', substr ($country, 0, 2), $conditions); // $DB->set_field('user', 'country', $country, $conditions); if ($lang) $DB->set_field('user', 'lang', $lang, $conditions); if ($timezone) $DB->set_field('user', 'timezone', $timezone, $conditions); if ($phone1) $DB->set_field('user', 'phone1', ($phone1), $conditions); if ($phone2) $DB->set_field('user', 'phone2', ($phone2), $conditions); if ($address) $DB->set_field('user', 'address', ($address), $conditions); if ($description) $DB->set_field('user', 'description', ($description), $conditions); if ($institution) $DB->set_field('user', 'institution', ($institution), $conditions); if ($url) $DB->set_field('user', 'url', $url, $conditions); if ($icq) $DB->set_field('user', 'icq', $icq, $conditions); if ($skype) $DB->set_field('user', 'skype', $skype, $conditions); if ($aim) $DB->set_field('user', 'aim', $aim, $conditions); if ($yahoo) $DB->set_field('user', 'yahoo', $yahoo, $conditions); if ($msn) $DB->set_field('user', 'msn', $msn, $conditions); if ($idnumber) $DB->set_field('user', 'idnumber', $idnumber, $conditions); if ($department) $DB->set_field('user', 'department', $department, $conditions); } /* Get user pic */ if ($juser_info['pic_url']) { $joomla_url = get_config (NULL, 'joomla_url'); $pic_url = $joomla_url.'/'.$juser_info['pic_url']; //$pic = @file_get_contents ($pic_url, false, NULL); $pic = auth_plugin_joomdle::get_file ($pic_url); if ($pic) { //$pic = file_get_contents ($pic_url, false, NULL); $pic = auth_plugin_joomdle::get_file_curl ($pic_url); $tmp_file = $CFG->dataroot.'/temp/'.'tmp_pic'; file_put_contents ($tmp_file, $pic); $context = get_context_instance(CONTEXT_USER, $user->id); process_new_icon($context, 'user', 'icon', 0, $tmp_file); $conditions = array ('id' => $user->id); $DB->set_field('user', 'picture', 1, $conditions); } } /* Custom fields */ if ($fields = $DB->get_records('user_info_field')) { foreach ($fields as $field) { if ($juser_info['cf_'.$field->id]) { $data = new stdClass(); $data->fieldid = $field->id; $data->data = $juser_info['cf_'.$field->id]; $data->userid = $user->id; /* update custom field */ if ($dataid = $DB->get_field('user_info_data', 'id', array('userid'=>$user->id, 'fieldid'=>$data->fieldid))) { $data->id = $dataid; $DB->update_record('user_info_data', $data); } else { $DB->insert_record('user_info_data', $data); } } } } return 1; } function search_courses ($text, $phrase, $ordering, $limit) { global $CFG, $DB; $text = utf8_decode ($text); $wheres = array(); switch ($phrase) { case 'exact': $text = '\'%'.$text.'%\''; $wheres2 = array(); $wheres2[] = 'co.fullname LIKE '.$text; $wheres2[] = 'co.shortname LIKE '.$text; $wheres2[] = 'co.summary LIKE '.$text; $where = '(' . implode( ') OR (', $wheres2 ) . ')'; break; case 'all': case 'any': default: $words = explode( ' ', $text ); $wheres = array(); foreach ($words as $word) { // $word = '\'%'.$DB->search_escape_string( $word).'%\''; $word = '\'%'.$word.'%\''; $wheres2 = array(); $wheres2[] = 'co.fullname LIKE '.$word; $wheres2[] = 'co.shortname LIKE '.$word; $wheres2[] = 'co.summary LIKE '.$word; $wheres[] = implode( ' OR ', $wheres2 ); } $where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('), $wheres ) . ')'; break; } switch ( $ordering ) { case 'alpha': $order = 'co.fullname ASC'; break; case 'category': $order = 'ca.name ASC, co.fullname ASC'; break; case 'newest': $order = 'co.startdate DESC'; break; case 'oldest': $order = 'co.startdate ASC'; break; case 'popular': default: $order = 'co.fullname DESC'; } $query = "SELECT co.id AS remoteid, ca.id AS cat_id, ca.name AS cat_name, ca.description AS cat_description, co.sortorder, co.fullname, co.shortname, co.idnumber, co.summary, co.startdate FROM {$CFG->prefix}course_categories ca JOIN {$CFG->prefix}course co ON ca.id = co.category WHERE co.visible = '1' AND $where ORDER BY $order LIMIT $limit "; $results = $DB->get_records_sql($query); $data = array (); foreach ($results as $r) { $c = get_object_vars ($r); $data[$i] = $c; $i++; } return $data; } function search_categories ($text, $phrase, $ordering, $limit) { global $CFG, $DB; $wheres = array(); switch ($phrase) { case 'exact': $text = '\'%'.$text.'%\''; $wheres2 = array(); $wheres2[] = 'ca.name LIKE '.$text; $wheres2[] = 'ca.description LIKE '.$text; $where = '(' . implode( ') OR (', $wheres2 ) . ')'; break; case 'all': case 'any': default: $words = explode( ' ', $text ); $wheres = array(); foreach ($words as $word) { $word = '\'%'.$word.'%\''; $wheres2 = array(); $wheres2[] = 'ca.name LIKE '.$word; $wheres2[] = 'ca.description LIKE '.$word; $wheres[] = implode( ' OR ', $wheres2 ); } $where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('), $wheres ) . ')'; break; } switch ( $ordering ) { case 'alpha': case 'category': $order = 'ca.name ASC'; break; case 'newest': case 'oldest': case 'popular': default: $order = 'ca.name DESC'; } $query = "SELECT ca.id AS cat_id, ca.name AS cat_name, ca.description AS cat_description FROM {$CFG->prefix}course_categories ca WHERE $where ORDER BY $order LIMIT $limit "; $results = $DB->get_records_sql($query); $data = array (); foreach ($results as $r) { $c = get_object_vars ($r); $data[$i] = $c; $i++; } return $data; } function search_topics ($text, $phrase, $ordering, $limit = 50) { global $CFG, $DB; $wheres = array(); switch ($phrase) { case 'exact': $text = '\'%'.$text.'%\''; $where = 'cs.summary LIKE '.$text; break; case 'all': case 'any': default: // $words = '\'%'.$words.'%\''; $words = explode( ' ', $text ); $wheres = array(); foreach ($words as $word) { $word = '\'%'.$word.'%\''; $wheres[] = 'cs.summary LIKE '.$word; } $where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('), $wheres ) . ')'; break; } $where .= " and cs.visible = 1"; switch ( $ordering ) { case 'alpha': $order = 'cs.summary ASC'; break; case 'category': $order = 'co.id ASC'; break; case 'newest': $order = 'co.id ASC, cs.section DESC'; break; case 'oldest': $order = 'co.id ASC, cs.section ASC'; break; case 'popular': default: $order = 'cs.summary DESC'; } /* REMEMBER: For get_records_sql First field in query must be UNIQUE!!!!! */ $query = "SELECT cs.id, co.id AS remoteid, co.fullname, cs.course, cs.section, cs.summary, ca.id as cat_id, ca.name as cat_name FROM {$CFG->prefix}course_sections cs JOIN {$CFG->prefix}course co ON co.id = cs.course LEFT JOIN {$CFG->prefix}course_categories ca ON ca.id = co.category WHERE $where ORDER BY $order LIMIT $limit "; $results = $DB->get_records_sql($query); $data = array (); foreach ($results as $r) { $c = get_object_vars ($r); $data[$i] = $c; $i++; } return $data; } function enrol_user ($username, $course_id, $roleid = 5) { global $CFG, $DB; $username = utf8_decode ($username); /* Create the user before if it is not created yet */ $conditions = array ('username' => $username); $user = $DB->get_record('user',$conditions); if (!$user) $this->create_joomdle_user ($username); $user = $DB->get_record('user',$conditions); $conditions = array ('id' => $course_id); $course = $DB->get_record('course', $conditions); $manager = new course_enrolment_manager($course); $instances = $manager->get_enrolment_instances(); $plugins = $manager->get_enrolment_plugins(); $enrolid = 1; //manual // $roleid = 5; //student $today = time(); $today = make_timestamp(date('Y', $today), date('m', $today), date('d', $today), 0, 0, 0); $timestart = $today; $timeend = 0; $instance = $instances[$enrolid]; foreach ($instances as $instance) { if ($instance->enrol == 'manual') break; } // return $instance->enrol; // $plugin = $plugins[$instance->enrol]; $plugin = $plugins['manual']; $plugin->enrol_user($instance, $user->id, $roleid, $timestart, $timeend); return 1; } function get_cat_name ($cat_id) { global $CFG, $DB; $cat_id = addslashes ($cat_id); $query = "SELECT name FROM {$CFG->prefix}course_categories WHERE id = '$cat_id';"; $rdo = $DB->get_records_sql($query); $row = (reset ($rdo)); return $row->name; } function get_my_courses_grades ($username) { $i = 0; $rdo = array (); $username = utf8_decode ($username); $user = get_complete_user_data ('username', $username); $cursos = enrol_get_users_courses ($user->id); foreach ($cursos as $curso) { $tareas = $this->get_user_grades ($username, $curso->id); $sum = 0; $n = count ($tareas); $rdo[$i]['id'] = $curso->id; $rdo[$i]['fullname'] = $curso->fullname; $rdo[$i]['cat_id'] = $curso->category; $rdo[$i]['cat_name'] = $this->get_cat_name ($curso->category); if ($n) { foreach ($tareas as $tarea) $sum += $tarea['finalgrade']; $rdo[$i]['avg'] = $sum/$n; } else $rdo[$i]['avg'] = 0; $i++; } return $rdo; } function get_moodle_users ($limitstart, $limit, $order, $order_dir, $search ) { global $CFG, $DB; /* Don't show admins and guests */ $admins = get_admins(); foreach ($admins as $admin) { $a[] = $admin->id; } $a[] = 1; //Guest user $userlist = "'".implode("','", $a)."'"; if ($limit) $limit_c = "LIMIT $limitstart, $limit"; if ($order != "") $order_c = " ORDER BY $order $order_dir"; else $order_c = ""; if ($search) $users = $DB->get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name ,auth FROM {$CFG->prefix}user WHERE deleted = 0 AND((username like '%$search%') OR (email like '%$search%') OR (firstname like '%$search%') OR (lastname like '%$search%')) $order_c $limit_c"); else $users = $DB->get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name,auth FROM {$CFG->prefix}user WHERE deleted = 0 $order_c $limit_c"); $i = 0; foreach ($users as $user) { $u[$i] = get_object_vars ($user); if (in_array ($user->id, $a)) $u[$i]['admin'] = '1'; else $u[$i]['admin'] = '0'; $i++; } return $u; //return $users; } function xget_moodle_users ($limitstart, $limit, $order, $order_dir, $search = "") { global $CFG; /* Don't show admins and guets */ $admins = get_admins(); foreach ($admins as $admin) { $a[] = $admin->id; } $a[] = 1; //Guest user $userlist = "'".implode("','", $a)."'"; if ($limit) $limit_c = "LIMIT $limitstart, $limit"; if ($order != "") $order_c = " ORDER BY $order $order_dir"; else $order_c = ""; if ($search) $users = get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name ,auth FROM {$CFG->prefix}user WHERE deleted = 0 AND((username like $search) OR (email like $search) OR (firstname like $search) OR (lastname like $search)) AND id not in ($userlist) $order_c $limit_c"); else $users = get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name,auth FROM {$CFG->prefix}user WHERE deleted = 0 AND id not in ($userlist) $order_c $limit_c"); return $users; } function get_moodle_users_number ($search = "") { global $CFG, $DB; $search = addslashes ($search); /* Don't show admins and guets */ $admins = get_admins(); foreach ($admins as $admin) { $a[] = $admin->id; } $a[] = 1; //Guest user $userlist = "'".implode("','", $a)."'"; if ($search) $users = $DB->count_records_sql("SELECT count(id) as n FROM {$CFG->prefix}user WHERE deleted = 0 AND id not in ($userlist) AND((username like $search) OR (email like $search) OR (firstname like $search) OR (lastname like $search))"); else $users = $DB->count_records_sql("SELECT count(id) as n FROM {$CFG->prefix}user WHERE deleted = 0 AND id not in ($userlist)"); return $users; } function check_moodle_users ($users) { global $CFG, $DB; $admins = get_admins(); foreach ($admins as $admin) { $a[] = $admin->id; } $a[] = 1; //Guest user $i = 0; foreach ($users as $user) { $username = utf8_decode ($user['username']); $conditions = array ('username' => $username); $user = $DB->get_record('user', $conditions); if ($user) { $users[$i]['m_account'] = 1; $users[$i]['auth'] = $user->auth; if (in_array ($user->id, $a)) $users[$i]['admin'] = 1; else $users[$i]['admin'] = 0; } else { $users[$i]['m_account'] = 0; $users[$i]['admin'] = 0; $users[$i]['auth'] = ''; } $i++; } return $users; } function get_moodle_only_users ($users, $search) { global $CFG, $DB; // $search = addslashes ($search); /* Don't show admins and guets */ $admins = get_admins(); foreach ($admins as $admin) { $a[] = $admin->id; } $a[] = 1; //Guest user $adminlist = "'".implode("','", $a)."'"; $usernames = array (); foreach ($users as $user) { $username = utf8_decode ($user['username']); $usernames[] = $username; } $userlist = "'".implode("','", $usernames)."'"; $users = array(); if ($search) $users = $DB->get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name ,auth FROM {$CFG->prefix}user WHERE deleted = 0 AND auth != 'webservice' AND (username not in ($userlist)) AND ((username like '%$search%') OR (email like '%$search%') OR (firstname like '%$search%') OR (lastname like '%$search%'))"); else $users = $DB->get_records_sql("SELECT id, username, email, concat(firstname, ' ', lastname) as name,auth FROM {$CFG->prefix}user WHERE deleted = 0 AND auth != 'webservice' AND (username not in ($userlist))"); $n = count ($users); //return $n; $i = 0; $u = array (); foreach ($users as $user) { $u[$i] = get_object_vars ($user); if (in_array ($user->id, $a)) $u[$i]['admin'] = '1'; else $u[$i]['admin'] = '0'; $i++; } return $u; } function delete_user ($username) { global $DB; $username = utf8_decode ($username); $conditions = array("username" => $username); $user = $DB->get_record("user", $conditions); if ($user) { delete_user ($user); return 1; } return 0; } function user_id ($username) { global $DB; $username = utf8_decode ($username); $conditions = array("username" => $username); $user = $DB->get_record("user", $conditions); return $user->id; } function user_details ($username) { global $DB, $CFG; $username = utf8_decode ($username); $conditions = array("username" => $username); $user = $DB->get_record("user", $conditions); $u['username'] = $user->username; $u['firstname'] = $user->firstname; $u['lastname'] = $user->lastname; $u['email'] = $user->email; $u['id'] = $user->id; $u['name'] = $user->firstname. " " . $user->lastname; $u['city'] = $user->city; $u['country'] = $user->country; $u['lang'] = $user->lang; $u['timezone'] = $user->timezone; $u['phone1'] = $user->phone1; $u['phone2'] = $user->phone2; $u['address'] = $user->address; $u['description'] = $user->description; $u['institution'] = $user->institution; $u['url'] = $user->url; $u['icq'] = $user->icq; $u['skype'] = $user->skype; $u['aim'] = $user->aim; $u['yahoo'] = $user->yahoo; $u['msn'] = $user->msn; $u['idnumber'] = $user->idnumber; $u['department'] = $user->department; $u['picture'] = $user->picture; $id = $user->id; $usercontext = get_context_instance(CONTEXT_USER, $id, MUST_EXIST); $context_id = $usercontext->id; if ($user->picture) $u['pic_url'] = $CFG->wwwroot."/pluginfile.php/$context_id/user/icon/f1"; /* Custom fields */ $query = "SELECT f.id, d.data FROM {$CFG->prefix}user_info_field as f, {$CFG->prefix}user_info_data d WHERE f.id=d.fieldid and userid = ?"; $params = array ($id); $records = $DB->get_records_sql($query, $params); $i = 0; $u['custom_fields'] = array (); foreach ($records as $field) { $u['custom_fields'][$i]['id'] = $field->id; $u['custom_fields'][$i]['data'] = $field->data; $i++; } return $u; } function user_custom_fields () { global $DB, $CFG; $query = "SELECT id, name FROM {$CFG->prefix}user_info_field"; $records = $DB->get_records_sql($query); $i = 0; $custom_fields = array (); foreach ($records as $field) { $custom_fields[$i]['id'] = $field->id; $custom_fields[$i]['name'] = $field->name; $i++; } return $custom_fields; } function user_details_by_id ($id) { global $DB; $conditions = array("id" => $id); $user = $DB->get_record("user", $conditions); $u['username'] = $user->username; return $u; } function update_session ($session_id) { global $DB; $conditions = array ('sid' => $session_id); $session = $DB->get_record ('sessions', $conditions); if (!$session) return; $session->timemodified = time (); $DB->update_record ('sessions', $session); return true; } function migrate_to_joomdle ($username) { global $DB; $username = utf8_decode ($username); $conditions = array ('username' => $username); $DB->set_field('user', 'auth', 'joomdle', $conditions); return true; } function my_events ($username, $cursosid) { global $CFG, $DB; $username = utf8_decode ($username); if ($username == 'admin') { $whereclause .= ' (groupid = 0 AND courseid = 1) '; } else { $user = get_complete_user_data ('username', $username); if (!$user) return array (); $g = array (); $i = 0; foreach ($cursosid as $course) { $course_id = $course['id']; $cursos_ids[] = $course_id; $groups = groups_get_user_groups ($course_id, $user->id); if (!count($groups[0])) continue; foreach ($groups[0] as $group) $w[] = " or (courseid = $course_id and groupid = $group)"; } $whereclause = ' (userid = '.$user->id.' AND courseid = 0 AND groupid = 0)'; $whereclause .= ' OR (groupid = 0 AND courseid IN ('.implode(',', $cursos_ids).')) '; foreach ($w as $cond) $whereclause .= $cond; } $whereclause .= ' AND visible = 1'; $events = $DB->get_records_select('event', $whereclause); $data = array (); foreach ($events as $event) { $e['name'] = $event->name; $e['timestart'] = $event->timestart; $e['courseid'] = $event->courseid; $data[] = $e; } return $data; } function add_parent_role ($child, $parent) { $child = utf8_decode ($child); $parent = utf8_decode ($parent); $parent_user = get_complete_user_data ('username', $parent); $child_user = get_complete_user_data ('username', $child); // return $child; //_user->username; $parent_role_id = get_config('auth/joomdle', 'parent_role_id'); $context = get_context_instance(CONTEXT_USER, $child_user->id); role_assign($parent_role_id, $parent_user->id, $context->id ); //, $timestart, 0, $hidden); return true; } function get_mentees ($username) { global $CFG, $DB; $username = utf8_decode ($username); $user = get_complete_user_data ('username', $username); if (!$user) return array (); $usercontexts = $DB->get_records_sql("SELECT c.instanceid, c.instanceid, u.firstname, u.lastname FROM {$CFG->prefix}role_assignments ra, {$CFG->prefix}context c, {$CFG->prefix}user u WHERE ra.userid = $user->id AND ra.contextid = c.id AND c.instanceid = u.id AND c.contextlevel = ".CONTEXT_USER); if (!$usercontexts) return array (); $i = 0; $users = array (); foreach ($usercontexts as $usercontext) { $users[$i]['id'] = $usercontext->instanceid; $child_user = get_complete_user_data ('id', $usercontext->instanceid); $users[$i]['username'] = $child_user->username; $users[$i]['name'] = $child_user->firstname. " " . $child_user->lastname; $i++; } return $users; } function get_roles () { global $CFG, $DB; $roles = $DB->get_records_sql("SELECT id, name FROM {$CFG->prefix}role"); $data = array (); foreach ($roles as $role) { $r['id'] = $role->id; $r['name'] = $role->name; $data[] = $r; } return $data; } function get_parents ($username) { global $CFG, $DB; $parent_role_id = get_config('auth/joomdle', 'parent_role_id'); $username = utf8_decode ($username); $user = get_complete_user_data ('username', $username); /* Get mentors for the student */ $usercontext = get_context_instance(CONTEXT_USER, $user->id); $usercontextid = $usercontext->id; $query = "SELECT r.userid,u.username FROM {$CFG->prefix}role_assignments r, {$CFG->prefix}user u WHERE r.roleid = '$parent_role_id' and r.contextid = '$usercontextid' and r.userid = u.id "; $mentors = $DB->get_records_sql($query); $data = array (); foreach ($mentors as $mentor) { // $r['userid'] = $mentor->userid; $r['username'] = $mentor->username; $data[] = $r; } return $data; } function course_enrol_methods ($course_id) { $instances = enrol_get_instances($course_id, true); $i = 0; foreach ($instances as $method) { $m[$i]['id'] = $method->id; $m[$i]['enrol'] = $method->enrol; $m[$i]['enrolstartdate'] = $method->enrolstartdate; $m[$i]['enrolenddate'] = $method->enrolenddate; $i++; } return $m; } function quiz_get_question ($id) { global $CFG, $DB; $query = "SELECT id,questiontext, qtype FROM {$CFG->prefix}question WHERE id = ?"; $params = array ($id); $record = $DB->get_record_sql($query, $params); $r = get_object_vars ($record); return $r; } function quiz_get_answers ($id) { global $CFG, $DB; $query = "SELECT id, answer FROM {$CFG->prefix}question_answers WHERE question = ?"; $params = array ($id); $records = $DB->get_records_sql($query, $params); foreach ($records as $record) { $r = get_object_vars ($record); $answers[] = $r; } return $answers; } function quiz_get_correct_answer ($id) { global $CFG, $DB; $query = "SELECT id FROM {$CFG->prefix}question_answers WHERE question = ? and fraction = 1"; $params = array ($id); $record = $DB->get_record_sql($query, $params); return $record->id; $r = get_object_vars ($record); return $r; } function mnet_publishes() { $joomla_sp = array(); $joomla_sp['name'] = 'joomla_sp'; // Name & Description go in lang file $joomla_sp['apiversion'] = 1; $joomla_sp['methods'] = array('test', 'my_courses', 'list_courses', 'get_course_info', 'get_course_contents', 'courses_by_category', 'get_course_editing_teachers', 'get_course_non_editing_teachers', 'courses_by_date', 'get_course_no', 'get_enrollable_course_no', 'get_student_no', 'get_assignment_submissions', 'get_course_students_no', 'get_upcoming_events', 'get_news_items', 'get_total_assignment_submissions', 'get_assignment_grades', 'get_assignments_grades', 'get_course_categories', 'get_user_grades', 'get_course_daily_stats', 'get_site_last_week_stats', 'get_course_grade_categories', 'create_joomdle_user', 'search_courses', 'search_categories', 'search_topics', 'enrol_user', 'get_my_courses_grades', 'get_moodle_users', 'check_moodle_users', 'get_moodle_only_users', 'user_exists', 'migrate_to_joomdle', 'user_details', 'user_details_by_id', 'system_check', 'get_moodle_users_number','update_session', 'my_events', 'user_id', 'get_paypal_config', 'delete_user', 'add_parent_role', 'get_mentees', 'get_roles', 'get_last_user_grades', 'get_parents', 'get_cat_name' ); return array($joomla_sp); } function logoutpage_hook() { global $redirect, $USER; if ($USER->auth != 'joomdle') return; $remember_cookie = $this->call_method ("logout", $USER->username); $r = $remember_cookie['0']; // print_r ( $r ); // exit (); setcookie($r, '', time() - 3600, '/','','',0); $redirect = get_config (NULL, 'joomla_url').'/components/com_joomdle/views/wrapper/getout.php'; } /* Logs the user in both Joomla and Moodle once auth is passed */ function user_authenticated_hook ($user, $username, $password) { global $redirect, $USER, $SESSION; if ($user->auth != 'joomdle') return; /* Login from password change, don't log in to Joomla */ //if (($_POST['password']) && ($_POST['newpassword1']) && ($_POST['newpassword2'])) if ( (array_key_exists ('password', $_POST)) && (array_key_exists ('newpassword1', $_POST)) && (array_key_exists ('newpassword2', $_POST)) ) return; complete_user_login ($user); $login_data = base64_encode ($username.':'.$password); //$redirect_url = get_config (NULL, 'joomla_url').'/index.php?option=com_joomdle&view=login&data='.$login_data; //$redirect_url = get_config (NULL, 'joomla_url').'/index.php?option=com_joomdle&task=login&data='.$login_data; $redirect_url = get_config (NULL, 'joomla_url').'/index.php?option=com_joomdle&task=login&data='.$login_data.'&wantsurl='.$SESSION->wantsurl; redirect($redirect_url); } function update_joomla_sessions () { global $CFG, $DB; $cutoff = time() - 300; $query = "SELECT username FROM {$CFG->prefix}user WHERE auth = 'joomdle' and lastaccess > '$cutoff' "; $query = "SELECT username FROM {$CFG->prefix}user WHERE auth = 'joomdle' and lastaccess > '$cutoff';"; ///XXX PREFIX $records = $DB->get_records_sql($query); $usernames = array(); foreach ($records as $record) $usernames[] = $record->username; /* $request = xmlrpc_encode_request("joomdle.updateSessions", array ($usernames)); $context = stream_context_create(array('http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml ", 'content' => $request ))); $joomla_xmlrpc_url = get_config (NULL, 'joomla_url').'/xmlrpc/index.php'; $response = file_get_contents($joomla_xmlrpc_url, false, $context); $updates = xmlrpc_decode($response); */ $updates = $this->call_method ("updateSessions", $usernames); } function cron() { $this->update_joomla_sessions(); } } //class function joomdle_user_updated ($user) { global $CFG, $DB; if ($user->auth != 'joomdle') return true; /* Update user info in Joomla */ $userinfo['username'] = $user->username; // $userinfo['password'] = $password_clear; // $userinfo['password2'] = $password_clear; $userinfo['name'] = $user->firstname. " " . $user->lastname; $userinfo['email'] = $user->email; $userinfo['firstname'] = $user->firstname; $userinfo['lastname'] = $user->lastname; $userinfo['city'] = $user->city; $userinfo['country'] = $user->country; $userinfo['lang'] = $user->lang; $userinfo['timezone'] = $user->timezone; $userinfo['phone1'] = $user->phone1; $userinfo['phone2'] = $user->phone2; $userinfo['address'] = $user->address; $userinfo['description'] = $user->description; $userinfo['institution'] = $user->institution; $userinfo['url'] = $user->url; $userinfo['icq'] = $user->icq; $userinfo['skype'] = $user->skype; $userinfo['aim'] = $user->aim; $userinfo['yahoo'] = $user->yahoo; $userinfo['msn'] = $user->msn; $userinfo['idnumber'] = $user->idnumber; $userinfo['department'] = $user->department; $userinfo['picture'] = $user->picture; $id = $user->id; $usercontext = get_context_instance(CONTEXT_USER, $id, MUST_EXIST); $context_id = $usercontext->id; if ($user->picture) $userinfo['pic_url'] = $CFG->wwwroot."/pluginfile.php/$context_id/user/icon/f1"; $userinfo['block'] = 0; /* Custom fields */ $query = "SELECT f.id, d.data FROM {$CFG->prefix}user_info_field as f, {$CFG->prefix}user_info_data d WHERE f.id=d.fieldid and userid = ?"; $params = array ($id); $records = $DB->get_records_sql($query, $params); $i = 0; $userinfo['custom_fields'] = array (); foreach ($records as $field) { $userinfo['custom_fields'][$i]['id'] = $field->id; $userinfo['custom_fields'][$i]['data'] = $field->data; $i++; } auth_plugin_joomdle::call_method ("updateUser", $userinfo); return true; } /* Creates a new Joomla user */ function joomdle_user_created ($user) { global $CFG, $DB; if ($user->auth != 'joomdle') return true; $password_clear = ($_POST['password']); //Self registration if (!$password_clear) $password_clear = ($_POST['newpassword']); //admin form /* Create user in Joomla */ $userinfo['username'] = $user->username; $userinfo['password'] = $password_clear; $userinfo['password2'] = $password_clear; $userinfo['name'] = $user->firstname. " " . $user->lastname; $userinfo['email'] = $user->email; $userinfo['firstname'] = $user->firstname; $userinfo['lastname'] = $user->lastname; $userinfo['city'] = $user->city; $userinfo['country'] = $user->country; $userinfo['lang'] = $user->lang; $userinfo['timezone'] = $user->timezone; $userinfo['phone1'] = $user->phone1; $userinfo['phone2'] = $user->phone2; $userinfo['address'] = $user->address; $userinfo['description'] = $user->description; $userinfo['institution'] = $user->institution; $userinfo['url'] = $user->url; $userinfo['icq'] = $user->icq; $userinfo['skype'] = $user->skype; $userinfo['aim'] = $user->aim; $userinfo['yahoo'] = $user->yahoo; $userinfo['msn'] = $user->msn; $userinfo['idnumber'] = $user->idnumber; $userinfo['department'] = $user->department; $userinfo['picture'] = $user->picture; $id = $user->id; $usercontext = get_context_instance(CONTEXT_USER, $id, MUST_EXIST); $context_id = $usercontext->id; if ($user->picture) $userinfo['pic_url'] = $CFG->wwwroot."/pluginfile.php/$context_id/user/icon/f1"; $userinfo['block'] = 0; /* Custom fields */ $query = "SELECT f.id, d.data FROM {$CFG->prefix}user_info_field as f, {$CFG->prefix}user_info_data d WHERE f.id=d.fieldid and userid = ?"; $params = array ($id); $records = $DB->get_records_sql($query, $params); $i = 0; $userinfo['custom_fields'] = array (); foreach ($records as $field) { $userinfo['custom_fields'][$i]['id'] = $field->id; $userinfo['custom_fields'][$i]['data'] = $field->data; $i++; } auth_plugin_joomdle::call_method ("createUser", $userinfo); return true; } function joomdle_course_created ($course) { global $DB; $activities = get_config('auth/joomdle', 'jomsocial_activities'); $groups = get_config('auth/joomdle', 'jomsocial_groups'); $autosell = get_config('auth/joomdle', 'auto_sell'); /* kludge for the call_method fn to work */ if (!$course->summary) $course->summary = ' '; $conditions = array ('id' => $course->category); $cat = $DB->get_record('course_categories',$conditions); if ($activities) auth_plugin_joomdle::call_method ('addActivityCourse', (int) $course->id, $course->fullname, $course->summary, (int) $course->category, $cat->name); if ($groups) auth_plugin_joomdle::call_method ('addJSGroup', $course->fullname, 'Group for course '.$course->fullname, (int) $course->id, "x"); // auth_plugin_joomdle::call_method ('addJSGroup', $course->fullname, 'Group for course '.$course->fullname, 1, "x"); if ($autosell) { $cid = array ($course->id); auth_plugin_joomdle::call_method ("sellCourse", array ((int) $course->id)); } return true; } function joomdle_course_deleted ($course) { $groups_delete = get_config('auth/joomdle', 'jomsocial_groups_delete'); $autosell = get_config('auth/joomdle', 'auto_sell'); if ($groups_delete) auth_plugin_joomdle::call_method ('removeJSGroup', $course->fullname); if ($autosell) { $cid = array ($course->id); auth_plugin_joomdle::call_method ("deleteCourseShop", array ((int) $course->id)); } return true; } function joomdle_course_updated ($course) { $groups = get_config('auth/joomdle', 'jomsocial_groups'); $autosell = get_config('auth/joomdle', 'auto_sell'); if ($groups) auth_plugin_joomdle::call_method ('updateJSGroup', $course->fullname, 'Group for course '.$course->fullname, (int) $course->id, "x"); if ($autosell) { $cid = array ($course->id); auth_plugin_joomdle::call_method ("updateCourseShop", array ((int) $course->id)); } return true; } function joomdle_role_assigned ($role) { global $CFG, $DB; $activities = get_config('auth/joomdle', 'jomsocial_activities'); $groups = get_config('auth/joomdle', 'jomsocial_groups'); $enrol_parents = get_config('auth/joomdle', 'enrol_parents'); $parent_role_id = get_config('auth/joomdle', 'parent_role_id'); $context = get_context_instance_by_id ($role->contextid); /* If a course enrolment, publish */ if ($context->contextlevel == CONTEXT_COURSE) { $courseid = $context->instanceid; $conditions = array ('id' => $courseid); $course = $DB->get_record('course', $conditions); $conditions = array ('id' => $course->category); $cat = $DB->get_record('course_categories',$conditions); $conditions = array ('id' => $role->userid); $user = $DB->get_record('user', $conditions); if ($activities) auth_plugin_joomdle::call_method ('addActivityCourseEnrolment', $user->username, (int) $courseid, $course->fullname, (int) $course->category, $cat->name); if ($groups) { /* Join teachers as group admins, and students as regular members */ if ($role->roleid == 3) //XXX not hardcoded value? auth_plugin_joomdle::call_method ('addJSGroupMember', $course->fullname, $user->username, 1); else auth_plugin_joomdle::call_method ('addJSGroupMember', $course->fullname, $user->username, -1); } if (($enrol_parents) && ($parent_role_id)) { if ($role->roleid == 5) //XXX not hardcoded value? { /* Get mentors for the student */ $usercontext = get_context_instance(CONTEXT_USER, $role->userid); $usercontextid = $usercontext->id; $query = "SELECT userid FROM {$CFG->prefix}role_assignments WHERE roleid = ? and contextid = ? "; $params = array ($parent_role_id, $usercontextid); $mentors = $DB->get_records_sql($query, $params); foreach ($mentors as $mentor) { /* Enrol as parent into course*/ //role_assign($parent_role_id, $mentor->userid, $context->id ); $conditions = array ('id' => $mentor->userid); $parent_user = $DB->get_record('user', $conditions); auth_plugin_joomdle::enrol_user ($parent_user->username, $courseid, $parent_role_id); } } } } return true; } function joomdle_role_unassigned ($role) { global $DB; $groups = get_config('auth/joomdle', 'jomsocial_groups'); if (!$groups) return; $context = get_context_instance_by_id ($role->contextid); /* If a course unenrolment, remove from group */ if ($context->contextlevel == CONTEXT_COURSE) { $courseid = $context->instanceid; $conditions = array ('id' => $courseid); $course = $DB->get_record('course', $conditions); $conditions = array ('id' => $course->category); $cat = $DB->get_record('course_categories', $conditions); $conditions = array ('id' => $role->userid); $user = $DB->get_record('user', $conditions); auth_plugin_joomdle::call_method ('removeJSGroupMember', $course->fullname, $user->username); } return true; } ?>