segunda-feira, 13 de dezembro de 2010

Listar Alunos que Ainda não Acessaram o Curso no Moodle num Determinado Período com Programação PHP

    Este post implementa o código PHP para extrair relatório dos alunos que não acessaram o curso em um determinado intervalo de tempo. Trata-se de codificação PHP do post publicado em  Moodle SQL: 
http://moodlesql.blogspot.com/2010/12/listar-alunos-que-ainda-nao-acessaram-o.html

Então vamos iniciar os passos da programação.

1° Passo

Importe a biblioteca de funções do Moodle:

require_once("../config.php");
2° Passo
Receba os parâmetros do curso e quantidade de dias pelo método GET:

$curso=$_GET['curso'];
    $dia=$_GET['dia'];
    if(empty($curso)){echo "Id do curso  é um parâmetro obrigatório";exit;}
    if(empty($dia)){$dia=7;} //Se o parâmetro dia não for definida, será tomado 7 dia por padrão, ou seja, uma semana.

O parâmetro id do curso define em qual curso deve ser extraído o relatório. O parâmetro quantidade de dia serve para definir o intervalo do tempo em que não ocorreu acesso. Caso nenhum valor for passado, será definido por padrão uma semana, ou seja, 7 dias.    

3° Passo
Calcule o período a partir de quantidade de dias.

$data1=$data=time()-($dia*24*60*60); //Calcular data retroativa $data2=$data=time();//Data atual;

A $data1 é a data retroativa, ou seja, a data atual menos a quantidade de dias. A função time() retorna a data atual em segundos. Para saber a data retroativa, basta converter os dias em segundos através do cálculo  $dia*24*60*60 ($dia* 24hora *60 minuto *60 segundos ) e subtrair pela data atual.

4° Passo

Fazer consulta no banco de dados

$sql="SELECT u.id, u.firstname,u.lastname,u.email 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 WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=$curso AND u.id NOT IN (SELECT DISTINCT userid FROM mdl_log WHERE course=$curso AND time >=$data1 AND time <=$data2)";
$usrs=get_records_sql($sql);

Essa consulta retorna a lista dos alunos inscritos no curso que ainda  não acessaram o ambiente do curso no intervalo de tempo definido.

5° Passo
Imprimir relatório:
    
<table  border="1">
<tr>
<td><b>Id</b></td>
<td><b>Nome</b></td>
<td><b>E-mail</b></td>
</tr>
<?    foreach ($usrs as $usr){
 ?>
    <tr>
    <td><?=$usr->id?></td>
    <td><?=$usr->firstname ." ".$usr->lastname ?></td>
    <td><?=$usr->email?></td>
<?}?>
</table>
O relatório é organizado em uma tabela que com três colunas:
  • Id  - Id do aluno na tabela mdl_user
  • Nome – Nome do  aluno
  • E-mail – E-mail do aluno 
   
Código Completo
Até então vimos o código em pedaço. Juntando tudo fica assim:

<?php
require_once("../config.php");
     //receber parármetro
    $curso=$_GET['curso'];
    $dia=$_GET['dia'];
    if(empty($curso)){echo "Id do curso  &eacute; um par&acirc;metro obrigat&oacute;rio";exit;}
    if(empty($dia)){$dia=7;} //Se o parâmetro dia não for definida, será tomado 7 dia por padrão, ou seja, uma semana.
   
    //Definir data em quantidade de segundos
     $data1=$data=time()-($dia*24*60*60); //Calcular data retroativa a partir da quantidade dias passado no parâmetro
     $data2=$data=time();//Data atual;
   
      $sql="SELECT u.id, u.firstname,u.lastname,u.email 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 WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=$curso AND u.id NOT IN (SELECT DISTINCT userid FROM mdl_log WHERE course=$curso AND time >=$data1 AND time <=$data2)";
      $usrs=get_records_sql($sql);
   
      ?>
      <table  border="1">
<tr>
<td><b>Id</b></td>
<td><b>Nome</b></td>
<td><b>E-mail</b></td>
</tr>
<?    foreach ($usrs as $usr){
 ?>
    <tr>
    <td><?=$usr->id?></td>
    <td><?=$usr->firstname ." ".$usr->lastname ?></td>
    <td><?=$usr->email?></td>
<?}?>
</table>
Implementar no Moodle
Para executar esse código no Moodle, crie uma pasta denominado _extra dentro da raiz da instalação do Moodle. Em seguida, crie um arquivo denominado user_curso_sapp.php dentro da pasta _extra. Coloque o código php nesse arquivo.

Feito isso, acesse o endereço:
http://[endereço do moodle]/_extra/user_curso_sapp.php?curso=2&dia=10

Download
Se estiver com preguiça de criar o arquivo e digitar o código, faça download desse exemplo. Descompacte  o arquivo e cole na pasta _extra na raiz do seu Moodle. Caso a pasta _extra não exista ainda, crie-a. Agora faça o teste.

Esse pode funcionar em qualquer versão do Moodle que use as funções do PDO para manipular a base de dados. Não funciona nas versões inferiores a 1.7 pela incompatibilidade da estrutura das tabelas da matrícula.

7 comentários:

  1. O Material é de excelente qualidade.

    Mas um detalhe quanto aos seus códigos, use menos tabela e nunca esqueça da identação!

    Não sei qual é sua base teórica de programação, mas este é um erro de principiamente que ainda pode ser corrigido!

    ResponderExcluir
  2. Uso tabela porque é um recurso mais fácil de escrever o código HTML ainda mais tratando de uma demonstração. Quanto a identação você tem razão. Fica mais fácil visualizar e entender o código, ainda mais quando é um código compartilhado. Isso facilita muito a leitura, principalmente dos comandos SQL. O problema é que o editor do blog é muito ruim. Tenho uma preocupação grande com a funcionalidade do código. Faço teste de todos os comandos SQL em um terminal e depois copio diretamente para o editor. Depois disso, evito dar uma formatação mais legível para evitar erros. As vezes, após a formatação, o código deixa de funcionar por erros acidentais.
    Mas de qualquer forma valeu pela alerta. Vou tentar nos próximos posts formatar melhor a visualização dos códigos.

    ResponderExcluir
  3. A programação não funcionou para o Moodle 2.4, muda algo?

    Obrigado pelo código

    ResponderExcluir
  4. Houve sim a mudança. Chame as funções do banco através do objeto $DB->
    Onde está get_records_sql coloque $DB->get_records_sql

    Dê uma olhada nesse link:
    http://moodlephp.blogspot.com.br/2010/11/cadastrar-usuario-no-moodle-com.html?showComment=1357304694497#c459483231716700038

    ResponderExcluir
  5. Somente uma dúvida o "NOT IN (SELECT DISTINCT userid FROM mdl_log WHERE course=$curso AND time >=$data1 AND time <=$data2)" a clausula NOT IN e para retorna dos dados repetidos?

    ResponderExcluir
  6. Ótimo material, obrigado por compartilhar com a comunidade.

    ResponderExcluir