quinta-feira, 15 de dezembro de 2011

Listar cursos em que o aluno está inscrito com comando SQL

Para extrair a relação dos cursos em que um determinado aluno está inscrito diretamente da base de dados, é necessário recorrer ao comando SQL.

Segue o comando SQL que filtra a relação dos cursos em que um determinado aluno está matriculado:

SELECT c.id,c.fullname     FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id  INNER JOIN  mdl_course c ON c.id = e.instanceid WHERE e.contextlevel=50 AND rs.roleid=5 AND rs.userid=?
 

Esse comando extrai  o id e o nome do curso. É necessário passar o parâmetro do usuário em rs.userid=?. Substitua a interrogação pelo id do usuário.  O camando rs.roleid=5 já define que se trata de um aluno, ou seja, filtre pelo perfil do aluno. Caso queira pesquisar o curso no perfil do  tutor, altere o valor do parâmetro roleid para 3. A alteração ficará assim: rs.roleid=3.
   

Esse comando não lista os cursos cuja inscrição foi feita no contexto do sistema ou da categoria de curso. Esse comando não é válido para as versões do Moodle inferiores à 1.7.

Caso queira listar a relação dos cursos do aluno no ambiente do Moodle, basta criar uma página PHP. Execute o comando SQL,  passe o id do usuário do logado em rs.userid=?. Isso é tudo que você precisa para mostrar ao aluno a relação dos cursos em que ele está inscrito.

17 comentários:

  1. Opa! vlw mto pela ajuda.

    mas como seria isso em programação?
    pra abrir em uma pagina php?

    por ex. o usuario faz o login, e aparece uma pagina pra ele msm, somente com os cursos dele matriculado listado. sem template sem bloco sem banner sem nada somente essa lista.

    eu tava mechendo no index.php mais ai taria mudando a estrutura do moodle.

    ResponderExcluir
  2. Bom dia!

    Sabe me dizer o que tem de errado nesse código?

    php
    require_once("../config.php");


    sql="SELECT c.id,c.fullname FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_course c ON c.id = e.instanceid WHERE e.contextlevel=50 AND rs.roleid=5 AND rs.userid=4";
    usr=$DB->get_record_sql($sql);


    foreach ($usr as $user){
    echo $usr->fullname."
    ";
    }
    ?>

    ele lista os cursos mas é repetidos.

    por ex o usuario ta inscrito em dois cursos.

    curso teste 1 e curso teste 2

    esse codigo mostra Curso teste 1, duas vezes.

    ResponderExcluir
  3. O código estava com erro de sintaxe em:
    sql=”..” deve ser $sql="..”
    usr=$DB-> deve ser $ usr=$DB->
    echo $usr-> de ser $user->

    Corrigi o seu código e testei no Moodle 2.0. Agora está funcionando. Veja o código completo corrigido.
    ------------------------------------------------
    require_once("../config.php");

    $sql="SELECT c.id,c.fullname FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_course c ON c.id = e.instanceid WHERE e.contextlevel=50 AND rs.roleid=5 AND rs.userid=4";

    $usr=$DB->get_records_sql($sql);
    foreach ($usr as $user){
    echo $user->fullname. "
    ";
    }

    ------------------------------------------------
    Ao rodar o código, se der erro, ative o erro do Moodle para ver o que está acontecendo. Veja como fazer isso no link:
    http://moodlephp.blogspot.com/2011/03/ativar-exibicao-do-erro-no-moodle.html

    ResponderExcluir
  4. Deu tudo certo!
    vlw muito pela ajuda.
    me ajudou bastante!

    ResponderExcluir
  5. Para mim teria que ser o oposto, eu queria listar professor(es) que estejam num curso, para fazer um certificado digital, eu teria que saber qual professor está cadastrado em tal disciplina.

    ResponderExcluir
    Respostas
    1. Daniel,
      Para mapear a relação dos tutores inscritos nos curso, execute o comando SQL abaixo. Esse comando retorna uma tabela com nome do tutor e curso que ele está inscrito. Caso queira extrair a mesma tabela para aluno, altere a parte do comendo rs.roleid=3 para rs.roleid=5

      SELECT u.id, u.firstname,u.lastname,u.email,c.id AS courseid,c.fullname FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_course c ON c.id = e.instanceid INNER JOIN mdl_user u ON u.id=rs.userid WHERE e.contextlevel=50 AND rs.roleid=3

      Esse comando funciona nas seguintes versões do Moodle: 1.8.x, 1.9.x e 2.x

      Excluir
  6. Como posso interligar os professores de acordo com o curso?
    Por exemplo, preciso fazer a verificação de data limite para o usuário ter acesso (nisso exibe a mensagem de tempo limite), enquanto ainda haver dias para usar têm que aparecer o professor do curso(com um link para os dados dele) e embaixo a imagem do curso(linkado com o curso em si);

    ResponderExcluir
    Respostas
    1. Dhara Fernanda,

      Veja se entendi, você quer que o aluno veja o link do perfil do professor enquanto a sua matrícula estiver dentro da data de validade?

      O professor é vinculado no curso na base de dados da mesma forma que o aluno por meio da tabela mdl_role_assignments
      A diferença está no campo roleid que é uma chave estranjeira da tabela mdl_role. Por padrão roleid do aluno é 5 e do professor é 3

      Excluir
  7. tem como add o campo data em que ele foi matriculado no curso nesta consulta?

    ResponderExcluir
  8. Olá, preciso saber quando o aluno concluiu cada curso. Isso é possível?

    ResponderExcluir
  9. Boa tarde!

    Como faço para listar quais disciplinas o usuário está inscrito como Professor, porém, apenas de disciplinas que estão visíveis.

    Desde já, agradeço!

    ResponderExcluir
  10. como consultar os alunos de um curso no moodle.

    ResponderExcluir
  11. Boa tarde, neste caso o roleid do criador de cursos seria qual, seria id 1?

    ResponderExcluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
  13. Bom dia,

    Estou com a seguinte situação:

    Temos vários cursos com data inicial e final, após a conclusão destes cursos o aluno fica com status suspenso, porém para a coordenação de curso fica muito difícil a gestão destes alunos (consultar histórico daquilo que ele já conclui, pois simplesmente não aparece), pois quando você pesquisa um usuário no moodle e clica sobre o mesmo, só aparece na próxima tela os cursos que ele está com inscrição ativa, não trazendo os cursos que ele já concluiu, desta forma a unica opção de alguma consulta mais detalhada de notas é ter que navegar no histórico (log de acesso do aluno) para saber qual curso ele fez e a partir disto acessar o curso x e consultar as informações.

    Não teria alguma forma de trazer nesta tela de cursos inscritos os cursos que o aluno já fez mas mostrando oculto para facilitar o acesso e posterior consulta de notas do mesmo?

    Muito obrigado

    ResponderExcluir
  14. Como faço para adicionar na consulta a nota de todos os cursos que o aluno está matriculado e o nome e data da avaliação?

    ResponderExcluir
  15. boa tarde
    nao consigo achar o erro aqui onde era para listar o aluno curso ultimo acesso etc...
    mas o grupo era p listar o que o aluno esta e nao todos como ta aparecendo. será que pode me ajuadar?


    SELECT u.id, u.firstname AS Primeironome, u.lastname AS Segundonome, u.institution
    AS Instituição, FROM_unixtime(u.firstaccess, '%d/%m/%Y %H:%i:%s') AS
    Ultimoacesso,c.fullname as curso, cc.name as categoria,g.name AS Groupname FROM
    mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN
    mdl_context e ON rs.contextid=e.id inner join mdl_course c on c.id=e.instanceid inner join
    mdl_course_categories cc on cc.id = c.category inner JOIN mdl_groups AS g ON g.courseid
    = c.id WHERE e.contextlevel=50 AND rs.roleid=5 and cc.id in ('ID PASTA')

    ResponderExcluir