segunda-feira, 15 de novembro de 2010

Cadastrar Usuário no Moodle com Programação PHP

Veja versão atualizada desse post na comunidade Badiu - https://comunidade.badiu.com.br/mod/forum/discuss.php?d=604 o código foi atualizado para ficar compatível com a versão 2.x e 3.x do Moodle. 

Para cadastrar usuário no Moodle através código PHP, siga os seguintes passos:

1° Passo

Importe a biblioteca de funções do Moodle:

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

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

    $firstname=$_GET['firstname'];
     $lastname=$_GET['lastname'];
     $username=$_GET['username'];
     $email=$_GET['email'];
     $password=$username;

    if(empty($firstname)){echo "Nome é um parâmetro obrigatório";exit;}
     if(empty($lastname)){echo "Sobrenome é um parâmetro obrigatório";exit;}
     if(empty($username)){echo "Login é um parâmetro obrigatório";exit;}
     if(empty($email)){echo "E-mail é um parâmetro obrigatório";exit;}

Não foi passado o parâmetro senha. Pois a senha é igual ao ligin como monstra o código: $password=$username;

3° Passo
Verificar se não há duplicação de dados de login e e-mail. Esses dados devem ser únicos para cada usuário.
   
    $existLogin=record_exists('user', 'username', $username);
     if($existLogin)echo "Login já existe <br>";
    
      $existEmail=record_exists('user', 'email', $email);
     if($existEmail)echo "E-mail já existe<br>";

4° Passo


Criar uma instância do objeto usuário. A instância reflete um mapeamento da tabela de mdl_user. Cada campo do objeto usuário dever corresponder a um campo da tabela mdl_user.
   
      $newuser=  new object();
        $newuser->id='';
        $newuser->auth='manual';
        $newuser->confirmed=1;
        $newuser->policyagreed=0;
        $newuser->deleted=0;
        $newuser->mnethostid=1;    
        $newuser->username=$username;
        $newuser->password=hash_internal_user_password($password);
        $newuser->idnumber='';
        $newuser->firstname=$firstname;
        $newuser->lastname=$lastname;
        $newuser->email=$email;
        $newuser->emailstop=0;
        $newuser->icq='';
        $newuser->skype='';
        $newuser->yahoo='';
        $newuser->aim='';
        $newuser->msn='';
        $newuser->phone1='';
        $newuser->phone2='';
        $newuser->institution='';
        $newuser->department='';
        $newuser->address='';
        $newuser->city=" ";
        $newuser->country='BR';
        $newuser->lang='pt_br_utf8';
    $newuser->theme='';
        $newuser->timezone=99;
        $newuser->firstaccess=0;
        $newuser->lastaccess=0;
        $newuser->lastlogin=0;
        $newuser->currentlogin='';
        $newuser->lastip='';
        $newuser->secret='';
        $newuser->picture=0;
        $newuser->url='';
        $newuser->description='';
        $newuser->mailformat=1;
        $newuser->maildigest=0;
        $newuser->maildisplay=2;
        $newuser->htmleditor=1;
        $newuser->ajax=1;
        $newuser->autosubscribe=1;
        $newuser->trackforums=0;
        $newuser->timemodified='';
        $newuser->trustbitmask='';
        $newuser->imagealt='';
        $newuser->screenreader=0;


Neste exemplo, a instância do usuário inicializa todos os campos que existem na tabela mdl_user da versão 1.9.3. Isso não é necessário. Mas é indispensável inicializar no objeto todos os campos que são obrigatórios na tabela mdl_user como:
  • firstname
  • lastname
  • e-mail
  • username
  • password

5° Passo
 Efetuar cadastro na base de dados e imprimir na tela o resultado, ou seja, o id do usuário recém cadastrado.


    if(!$existLogin && !$existEmail){
         $newuser->id = insert_record('user', $newuser);
            echo "Cadastro efetuado com sucesso. O id o usuário recém cadastrado         é: ".$newuser->id;
      }

O cadastro só deve ser feito caso não houver duplicação de login e e-mail.


Bem, esses 5 passos é tudo que você precisa para cadastrar um usuário no Moodle. Viu como é moleza.

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
     $firstname=$_GET['firstname'];
     $lastname=$_GET['lastname'];
     $username=$_GET['username'];
     $email=$_GET['email'];
     $password=$username;
    
     if(empty($firstname)){echo "Nome é um parâmetro obrigatório";exit;}
     if(empty($lastname)){echo "Sobrenome é um parâmetro obrigatório";exit;}
     if(empty($username)){echo "Login é um parâmetro obrigatório";exit;}
     if(empty($email)){echo "E-mail é um parâmetro obrigatório";exit;}

     //verificar se login já existe
     $existLogin=record_exists('user', 'username', $username);
     if($existLogin)echo "Login já existe <br>";
    
      //verificar se e-mail já existe
     $existEmail=record_exists('user', 'email', $email);
     if($existEmail)echo "E-mail já existe<br>";
    
    
     //criar um objeto usuário
        $newuser=  new object();
       
        $newuser->id='';
        $newuser->auth='manual';
        $newuser->confirmed=1;
        $newuser->policyagreed=0;
        $newuser->deleted=0;
        $newuser->mnethostid=1;    
        $newuser->username=$username;
        $newuser->password=hash_internal_user_password($password);
        $newuser->idnumber='';
        $newuser->firstname=$firstname;
        $newuser->lastname=$lastname;
        $newuser->email=$email;
        $newuser->emailstop=0;
        $newuser->icq='';
        $newuser->skype='';
        $newuser->yahoo='';
        $newuser->aim='';
        $newuser->msn='';
        $newuser->phone1='';
        $newuser->phone2='';
        $newuser->institution='';
        $newuser->department='';
        $newuser->address='';
        $newuser->city=" ";
        $newuser->country='BR';
        $newuser->lang='pt_br_utf8';
        $newuser->theme='';
        $newuser->timezone=99;
        $newuser->firstaccess=0;
        $newuser->lastaccess=0;
        $newuser->lastlogin=0;
        $newuser->currentlogin='';
        $newuser->lastip='';
        $newuser->secret='';
        $newuser->picture=0;
        $newuser->url='';
        $newuser->description='';
        $newuser->mailformat=1;
        $newuser->maildigest=0;
        $newuser->maildisplay=2;
        $newuser->htmleditor=1;
        $newuser->ajax=1;
        $newuser->autosubscribe=1;
        $newuser->trackforums=0;
        $newuser->timemodified='';
        $newuser->trustbitmask='';
        $newuser->imagealt='';
        $newuser->screenreader=0;
       
     //Cadastrar usuário
     if(!$existLogin && !$existEmail){
         $newuser->id = insert_record('user', $newuser);
        echo "Cadastro efetuado com sucesso. O id o usuário recém cadastrado é: ".$newuser->id;
      }
      
    
?>


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_add.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_add.php?firstname=Pedro&lastname=Silva&username=pedro&email=pedro_2010@gmail.com

O url já passa os parâmetros necessários. Para ter certeza que tudo funcionou bem, tente logar com o usuário que cadastrou. Se funcionar é sinal que tudo está ok.

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 do Moodle. Caso ocorrer alguma falha com a versão do seu Moodle, tente editar o código para que cada campo do objeto seja igual a um campo da tabela mdl_user.
  

Veja Também:
Cadastrar Usuário no Moodle pelo Comando SQL

25 comentários:

  1. Seus blog é massa pra caramba.

    Pois então, gostaria de fazer com que o moodle faça cadastro na url alternativo no wamp como exemplo ou teste, pois não condigo enviar os dados na página que se pede do moodle.

    Poderia me ajudar Badiu?

    ResponderExcluir
  2. Para criar uma página alternativa de cadastro de usuário no Moodle siga os seguintes passos:


    1) Crie uma página com formulário de cadastro. O formulário deve ter os campos obrigatórios para cadastro de usuário no Moodle tais como: Nome, Sobrenome, E-mail, Cidade, Login e Senha.



    2) Crie uma página que captura os dados e salva no banco de dados. A lógica dessa página já está nesse post.

    ResponderExcluir
  3. Nota 10. A muito procurava um blog assim. Meus parabéns!

    ResponderExcluir
    Respostas
    1. Maurício,
      É uma satisfação saber que o blog está sendo útil para a comunidade do Moodle.

      Excluir
  4. Olá,

    recentemente estou usando o moodle na intranet este blog é o mais claro a respeito das duvidas do moodle.
    Parabens !!!
    E obrigado por compartilhar conhecimento.

    ResponderExcluir
  5. Muito bom os tutoriais.... parabéns mesmo pela iniciativa de compartilhar seus conhecimentos... Valeu..

    ResponderExcluir
  6. Olá cara. Teria como adicionar uma atualização para o 2.0?

    ResponderExcluir
    Respostas
    1. Daniel,
      Para cadastrar usuário na versão 2 do Moodle não houve mudança da estrutura do banco. Houve mudança com API de acesso ao banco. Todo o API do banco passou a ser invocado pelo objeto $DB.

      Nesse post, há duas funções que acessam o banco: record_exists e insert_record. Mude o código e chame essas funções através do objeto $DB->. Aí fica assim:
      $DB->record_exists
      $DB->insert_record

      Para esse código ficar compatível com a versão 2 do Moodle, altere apenas três linhas de código:

      Primeira alteração:

      Código anterior:
      $existLogin=record_exists('user', 'username', $username);

      Código novo
      $existLogin=$DB->record_exists('user', 'username', $username);



      Segunda alteração:

      Código anterior:
       $existEmail=record_exists('user', 'email', $email);

      Código novo
       $existEmail=$DB->record_exists('user', 'email', $email);

      Terceira alteração:

      Código anterior:
      $newuser->id = insert_record('user', $newuser);

      Código novo
      $newuser->id = $DB->insert_record('user', $newuser);

      Excluir
  7. Olá Badiu, Cara, to com a versão 2.4 e não consigo encontrar a forma correta de chamar as funções citas acima... já usei as 2 formas usando o $DB e sem...
    Estou chamando as bibliotecas de 2 arquivos
    require_once("config.php");
    require_once("lib/dmllib.php");
    Fiz também a declaração do objeto global $DB;
    Já procurei muitas informações sobre mas não consegui resolver: por favor me ajude

    ResponderExcluir
    Respostas
    1. Marco,

      Para fazer inserção na base do Moodle 2.x usando a API do banco, siga os seguintes passos:

      1- Faça include do config.php
      require_once("MOODLE_DIR_INSTALL/config.php");

      2- Crie a função que vai fazer inserção no banco:
      function save($dto) {
      global $DB;
      return $DB->insert_record('user', $dto);
      }
      O objeto $dto deve passar os dados do usuário preenchido nos campos que são obrigatórios.

      Excluir
    2. Obrigado Badiu, mas o problema é que o Moodle nas versões 2.x não tem a função insert_record e a record_exists...
      Fiz como você me orientou acima, mas o apache retorna a seguinte mensagem: Fatal error: Call to a member function insert_record() on a non-object in C:\wamp\www\site\ead\cadastro.php on line 258

      Excluir
    3. Bom Badiu!! Testei no moodle 2.x em uma maquina local e num servidor web que hospedo meu site.. os 2 apresentaram o mesmo problema.. Decidi então tentar numa versão anterior, a 1.9 e "funfou", consegui cadastrar o usuario no banco de dados.. Se tiver mais alguma informação a respeito ficarei grato..

      Excluir
    4. Marco,
      Se a função $DB->insert_record não está funcionando no Moodle 2.x há alguma falha no seu código. Eu uso essa função com muita frequência. Sugiro que você desabilite essa linha do código:
      require_once("lib/dmllib.php");

      A importação do config.php traz tudo que você precisa para manipular a base de dados.

      Excluir
  8. Este comentário foi removido pelo autor.

    ResponderExcluir
  9. Badiu,

    Estou tentando inserir via programação PHP com moodle 2.5 a informação que força o usuário a mudar a senha. Não está funcionando, me ajude aqui onde é que estou errando!!! (:

    require_once("../../config.php");
    $pref = new stdClass();
    $pref->name = 'auth_forcepasswordchange';
    $pref->value = 1;
    $pref->userid = 2;
    $DB->insert_record('user_preferences', $pref, false);

    ResponderExcluir
    Respostas
    1. Angelo,
      O procedimento para isso é o seguinte:
      1) Verifique se já existe algum registro com chave auth_forcepasswordchange para o usuário;
      2) Caso exista, faça um update setando o campo valor para 1;
      3) Caso não exista, faça um update;

      Após execução de cada etapa, faça uma pesquisa direto no banco de dados para ver se os dados estão sendo inseridos / atualizados;

      Excluir
  10. Obrigado Badiu, problema resolvido!
    Outra dúvida é: como verifica se o existe ou nao uma sessão de login do visitante, tipo abri o moodle, nao loguei, quero uma função que verifica se no meu browser tem a sessao de login ativa.

    ResponderExcluir
    Respostas
    1. Oi Angelo, tudo bem.
      Para verificar se o usuário está ou não logado no Moodle, use a função isloggedin()

      Veja um exemplo de implementação:

      if(isloggedin()){
      echo 'logado';
      }else{echo 'nao logado';}



      Já testei essa função na versão 2 mais especificamente na versão 2.4. Não testei na versão 1.9. Mas deve funcionar também. Teste aí e veja.

      Excluir
  11. Prezado Bibu,

    Estou com um problema e gostaria de contar com sua ajuda.
    Já utilizo seu algoritmo há algum tempo na versão 1.9 e sempre funcionou perfeitamente. Contudo, estou implementando outro ambiente na versão 2.6.3, invocando o objeto $DB e recebo mensagem de PHP catchable fatal error, como pode ser vista abaixo:

    Debug info: Argument 2 passed to moodle_database::record_exists() must be of the type array, string given, called in [dirroot]/_extra/add_user.php on line 45 and defined
    Error code: codingerror
    Stack trace:

    line 393 of /lib/setuplib.php: coding_exception thrown
    line 1674 of /lib/dml/moodle_database.php: call to default_error_handler()
    line 45 of /_extra/add_user.php: call to moodle_database->record_exists()

    Como posso alterar o argumento desta função?

    Grande abraço

    Felipe

    ResponderExcluir
    Respostas
    1. Felipe,
      Tudo beleza?

      Poste aqui ao código que está usando. Vou fazer um teste no meu servidor para ver.

      Caso o seu código estiver dentro de uma função, verifique se setou $DB como variável global. Algo assim global $DB

      Excluir
    2. Olá Bidu,

      Mandei o trecho do código para o seu e-mail, pois o Blogger não está permitindo inserí-lo aqui nocomentário.

      A linha 45 apontada pelo Debug é:

      $existEmail=$DB->record_exists('user', 'email', $email);

      Desde já obrigado,

      Felipe

      Excluir
  12. Bidu,

    Identifiquei o erro no código!

    Na versão 2.6 ou superior, é necessário passar o argumento como array.

    Neste caso o trecho da função ficará assim:

    $existEmail=$DB->record_exists('user',array('email'=>$email));


    Abraço e obrigado!

    ResponderExcluir
    Respostas
    1. Valeu Felipe Grintzos

      Vou o post atualizando o para a versão 2 do Moodle. Vou incorporar esses código e o outro que me mandou por e-mail. Vou organizar um fórum para sistematizar melhor o compartilhamento.

      Excluir