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.

quarta-feira, 1 de dezembro de 2010

Relatório do Período da Validade da Inscrição no Moodle Filtrado por um Determinado Participante (Aluno/Tutor) com Programação PHP

    Este post apresenta a codificação PHP para extrair um relatório sobre o período da validade de inscrição de um determinado participante (aluno, tutor e.t.c) no Moodle. O código PHP usa as bibliotecas de funções do ambiente do Moodle.

    Esse relatório informa a data de expiração da matrícula de um usuário, ou seja, participante em todos os cursos em que está inscrito.

Para entender as regras de funcionamento sobre o tempo de validade de inscrição no ambiente Moodle leia o seguinte post:  http://moodlesql.blogspot.com/2010/11/desmistificando-periodo-de-inscricao-do.html
Então vamos iniciar a programação. Siga os passos a seguir.

1° Passo
Importe a biblioteca de funções do Moodle:

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

2° Passo
Receba o parâmetro do usuário passado pelo método GET:

$user=$_GET['user'];
if(empty($user)){echo "Id do usu&aacute;rio  &eacute; um par&acirc;metro obrigat&oacute;rio";exit;}

 Passe o parâmetro com id do usuário que pretenda extrair o relatório. Caso queira saber como encontrar id do curso consulte o post: http://moodlesql.blogspot.com/2010/10/extrair-id-do-usuario-e-do-curso-no.html

3° Passo
Fazer consulta no banco de dados
 
$sql="SELECT c.id,c.fullname, rs.timestart,rs.timeend FROM {$CFG->prefix}course c INNER JOIN {$CFG->prefix}context e ON c.id=e.instanceid INNER JOIN  {$CFG->prefix}role_assignments rs ON e.id=rs.contextid WHERE e.contextlevel=50 AND rs.userid=$user";

$cursos=get_records_sql($sql);


Essa consulta extrai a informações do banco de dados sobre a data inicial e final da validade da inscrição de todos os cursos que o usuário está inscrito.

4° Passo

Imprimir relatório:
     
<table  border="1">
<tr>
<td><b>Id</b></td>
<td><b>Curso</b></td>
<td><b>Data de Inicio</b></td>
<td><b>Data de Finaliza&ccedil;&atilde;o</b></td>
</tr>
<?    foreach ($cursos as $curso){
    //formatar data
    $dataInicio=$curso->timestart;
    if($dataInicio==0){$dataInicio="--";}
    else {$dataInicio=date("d/m/Y",$curso->timestart);}
   
    $dataFim=$curso->timeend;
    if($dataFim==0){$dataFim="--";}
    else {$dataFim=date("d/m/Y",$curso->timeend);}

 ?>
    <tr>
    <td><?=$curso->id?></td>
    <td><?=$curso->fullname?></td>
    <td><?= $dataInicio?></td>
    <td><?=$dataFim?></td>
   
<?}?>
</table>
 O relatório é organizado em uma tabela que com três colunas:
  • Id – Id do curso
  • Curso - Nome do curso
  • Data de Inicio – Data que a inscrição foi feita
  • Data da Finalização – Data final da validade da inscrição.
    A data final da validade da inscrição é a data da inscrição mais os dias da validade da inscrição que é definido no momento do cadastro.

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
    $user=$_GET['user'];
   
    if(empty($user)){echo "Id do usu&aacute;rio  &eacute; um par&acirc;metro obrigat&oacute;rio";exit;}
    
      $sql="SELECT c.id,c.fullname, rs.timestart,rs.timeend FROM {$CFG->prefix}course c INNER JOIN {$CFG->prefix}context e ON c.id=e.instanceid INNER JOIN  {$CFG->prefix}role_assignments rs ON e.id=rs.contextid WHERE e.contextlevel=50 AND rs.userid=$user";
      $cursos=get_records_sql($sql);
   
      ?>
      <table  border="1">
<tr>
<td><b>Id</b></td>
<td><b>Curso</b></td>
<td><b>Data de Inicio</b></td>
<td><b>Data de Finaliza&ccedil;&atilde;o</b></td>
</tr>
<?    foreach ($cursos as $curso){
   
    //formatar data
    $dataInicio=$curso->timestart;
    if($dataInicio==0){$dataInicio="--";}
    else {$dataInicio=date("d/m/Y",$curso->timestart);}
   
    $dataFim=$curso->timeend;
    if($dataFim==0){$dataFim="--";}
    else {$dataFim=date("d/m/Y",$curso->timeend);}

 ?>
    <tr>
    <td><?=$curso->id?></td>
    <td><?=$curso->fullname?></td>
    <td><?= $dataInicio?></td>
    <td><?=$dataFim?></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 participante_curso_pvalidade_inscricao.php dentro da pasta _extra. Coloque o código php nesse arquivo.

Feito isso, acesse o endereço:
http://[endereço do moodle]/_extra/participante_curso_pvalidade_inscricao.php? user=12
Substitua o parâmetro pelo id do usuário


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 código foi testado na versão 1.9.3 mas pode funcionar em qualquer versão do Moodle que use as funções do PDO para manipular a base de dados. Não funciona na versão 1.6 e 2.0
  

Veja Também:

Desmistificando Período de Inscrição do Curso no Moodle com Comando SQL

Relatório do Período da Validade da Inscrição dos Participantes no Curso do Moodle com Programação PHP

Relatório da Configuração do Período da Validade da Inscrição no Curso do Moodle com Programação PHP