I can not manually enroll students with a Moodle Script

4

I am trying to enroll students manually in a Moodle course using a Script but I can not. I am using the function role_assign of Moodle but it does not work for me.

The code I am using is the following:

//obtiene el id del rol "member" que ha sido creado anteriormente
$rolMember = obtenerIdRol ("member");
$rolManager = obtenerIdRol ("manager" );

$contexto = context_course::instance($comunidad_moodle);

foreach ($usuariosUVDotlrn as $usu) {   
    $userid = null;
    $usernameDotln = $usu["username"];
    $rolDotln = $usu["rol"];

    if($rolDotln == "dotlrn_admin_rel"){
        $rolid = $rolManager;
    }else if($rolDotln == "dotlrn_member_rel"){
        $rolid = $rolMember;
    }else{
        $rolid = -1;
    }

    //obtenemos el id del usuario en Moodle
    $sql = "SELECT id FROM mdl_user WHERE username = ?";
    $resUsu = $DB->get_records_sql($sql, array($usernameDotln));

    foreach ( $resUsu as $n ) {                         
        $userid = $n->id;
    }                           

    //Comprobamos que el usuario existe en moodle.
    if( is_null($userid)){
        m("- El usuario: $usernameDotln no existe en la Base de Datos de Moodle");

    }else{                                                                                      
        //Comprobamos si el usuario pertenece al curso
        $enrolled = is_enrolled($contexto, $userid, '', true);

        if( !$enrolled){                                                
            if($rolid != -1){                                                                                               
                $idroleassign = role_assign($rolid , $userid, $contexto);

                m("- El usuario: $usernameDotln con id: $userid y rol: $rolid insertado en el curso: $comunidad_moodle");
            }else{                                                  
                m("- El usuario: $usernameDotln con id: $userid y rol: $rolid no esta en el curso: $comunidad_moodle. No se ha encontrado el rol.");
            }                                               
        }else{                              
            m("- El usuario: $usernameDotln con id: $userid ya pertenece al curso: $comunidad_moodle");
        }
    }                               
}

Note: the function m ("") is responsible for displaying the text in the console

Note2: the obtenerIdRol function is as follows:

/**
 * Devuelve el id del rol pasado.
 *
 * @param $rol nombre del rol.
 *
 * @return id del rol 
 */
function obtenerIdRol ($rol ){

    global $DB;
    $id = null;

    //obtenemos el id del rol en Moodle
    $sqlrol = "SELECT id FROM mdl_role WHERE shortname = ?";
    $roles = $DB->get_records_sql($sqlrol, array($rol));

    foreach ( $roles as $r ) {                      
        $id = $r->id;
    }

    if(is_null($id))
        return -1;
    else
        return $id;
}

If someone knows how to do it or has an example or documentation that can help me, it will be a great help for me.

    
asked by Joacer 29.09.2016 в 10:13
source

3 answers

3

After searching and trying some things, I found a solution that works, and consists of instantiating the plugin of manual type so that the assignment of students is done through the plugin.

The code would look like this:

//obtiene el id del rol "member" que ha sido creado anteriormente
$rolMember = obtenerIdRol ("member");
$rolManager = obtenerIdRol ("manager" );

$contexto = context_course::instance($comunidad_moodle);

// Recuperamos el plugin de enrol manual.
$enrol = enrol_get_plugin('manual');

// Comprobar si la instancia del plugin de enrolment manual está habilitada/existe.
$instance = null;
$enrolinstances = enrol_get_instances($comunidad_moodle, true);
foreach ($enrolinstances as $courseenrolinstance) {
    if ($courseenrolinstance->enrol == "manual") {
        $instance = $courseenrolinstance;
        break;
    }
}

if (!empty($instance)) {

    foreach ($usuariosUVDotlrn as $usu) {   
         $userid = null;
         $usernameDotln = $usu["username"];
         $rolDotln = $usu["rol"];

         if($rolDotln == "dotlrn_admin_rel"){
              $rolid = $rolManager;
         }else if($rolDotln == "dotlrn_member_rel"){
              $rolid = $rolMember;
         }else{
              $rolid = -1;
         }

         //obtenemos el id del usuario en Moodle
         $sql = "SELECT id FROM mdl_user WHERE username = ?";
         $resUsu = $DB->get_records_sql($sql, array($usernameDotln));

         foreach ( $resUsu as $n ) {                         
               $userid = $n->id;
         }                           

         //Comprobamos que el usuario existe en moodle.
         if( is_null($userid)){
               m("- El usuario: $usernameDotln no existe en la Base de Datos de Moodle");

         }else{                                                                                      
              //Comprobamos si el usuario pertenece al curso
              $enrolled = is_enrolled($contexto, $userid, '', true);

              if( !$enrolled){                                                
                   if($rolid != -1){ 
                        $enrol->enrol_user($instance, $userid, $rolid, time(), 0, ENROL_USER_ACTIVE);
                        m("- El usuario: $usernameDotln con id: $userid y rol: $rolid insertado en el curso: $comunidad_moodle");
                   }else{                                                  
                        m("- El usuario: $usernameDotln con id: $userid y rol: $rolid no esta en el curso: $comunidad_moodle. No se ha encontrado el rol.");
                   }                                               
              }else{                              
                   m("- El usuario: $usernameDotln con id: $userid ya pertenece al curso: $comunidad_moodle");
              }
         } 
     }                              
}
    
answered by 30.09.2016 / 12:14
source
1

In my ignorance of both Moodle and PHP I found this way of enrolling a student in a course. I share it because it seems a bit simpler than the accepted answer.

UPDATE : In the platform for which I work, I have been asked that students only have 60 days to complete the courses, so you have to specify the registration time when you register them. I add it to the code, at the end.

//Partimos de que existen las variables $userid, $courseid y $roleid
//$roleid en este caso es 'student'. Se puede consultar en la tabla <prefijo>_role
global $DB;

$user = $DB->get_record('user', array('id' => $userid, 'deleted' => 0), '*', MUST_EXIST);
$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);

$context = context_course::instance($course->id);

if (!is_enrolled($context, $user)) {
    echo "<br> Usuario NO REGISTRADO";
    $enrol = enrol_get_plugin("manual");
    if ($enrol === null) {
        return false;
    }
    $instances = enrol_get_instances($course->id, true);
    $manualinstance = null;
    foreach ($instances as $instance) {
        if ($instance->name == $enrolmethod) {
            $manualinstance = $instance;
            break;
        }
    }
    if ($manualinstance !== null) {
        $instanceid = $enrol->add_default_instance($course);
        if ($instanceid === null) {
            $instanceid = $enrol->add_instance($course);
        }

        $instance = $DB->get_record('enrol', array('id' => $instanceid));
    }

    //Tiempo en formato epoch: segundos desde 1970.
    $enrolstart = time();
    $enrolperiod = 60; //60 dias de duracion de la matricula
    // Multiplicamos los dias de vigencia por el número de segundos que hay en 1 dia=60*60*24
    $enrolend = $enrolstart + ($enrolperiod*86400);
    $enrol->enrol_user($instance, $userid, $roleid, $enrolstart, $enrolend);
    //el periodo de matriculacion es opcional, si no se quiere usar cambiar la anterior linea por la siguiente
    //$enrol->enrol_user($instance, $userid, $roleid);

}
else {
    echo "<br> Usuario registrado";
}
    
answered by 18.05.2018 в 09:14
1
<?php
    $functionname = 'enrol_manual_enrol_users';
    $matricula= new stdClass();
    $matricula->roleid =5; ////estudante -> 5
    $matricula->userid  = 75471;
    $matricula->courseid = 1160;
    $params = array($matricula); 

    $serverurl = 'http://moodle.edu.pe/webservice/soap/server.php?wsdl=1&wstoken=423423432dfsdfsdfsds';

    $client = new SoapClient($serverurl);

    try {
        $resp = $client->__soapCall($functionname, array($params));
    } catch (SoapFault $e) {
        exit($e->faultstring);
    }
?>
    
answered by 12.10.2018 в 16:45