quarta-feira, 18 de julho de 2012

Arquitetura do Sistema Moodle

    Moodle é um framework de desenvolvimento PHP. A sua arquitetura de organização e sistematização de dados é centralizada em curso, ou seja, na sala de aula virtual.
    A arquitetura da Plataforma Moodle é complexa. Para explicá-la de uma forma mais simples, vamos explorar a relação entre três elementos:
  •    Material didático;
  •    Curso;
  •    Matrícula.
Material didático
    Material didático é o conteúdo do curso. São textos, arquivos, imagens, vídeos, recursos de comunicação síncrona / assíncrona, questionários etc. No ambiente do curso do Moodle, há um sistema de editoração de conteúdo sistematizado em recursos e atividades. Cada recurso e atividade é gerenciado por um módulo específico. Por exemplo, para criar um questionário, será usado o módulo quiz. Para criar um texto, será usado o módulo page. O material didático é um item dependente do curso. Este só pode existir se estiver vinculado a um curso. Isso significa que os módulos de recursos e atividades do Moodle só podem ser instanciados dentro do ambiente do curso.

Curso
    O curso é a sala de aula virtual. É um espaço de publicação do material didático. O curso é organizado em categorias. Uma categoria pode ter vários níveis de subcategoria. Um curso deve ser vinculado a uma determinada categoria. Da mesma forma, uma atividade deve ser vinculada a um curso. Nessa estrutura de organização, há três níveis:

 1.  Categoria de curso
     1.1 Curso
        1.1.1 Atividades (material didático)

    A categoria ocupa o nível mais alto na hierarquia e a atividade o nível mais baixo. A categoria serve para sistematizar a oferta de curso. Em cada curso, há um conjunto de recursos e atividades que compõe o material didático.

Matrícula
    Matrícula é o vínculo de um usuário cadastrado na base do Moodle a um determinado curso. Um usuário pode ser vinculado a mais de um curso. Para efetuar a matrícula, é necessário definir o perfil. Pode ser aluno, tutor, professor etc. O perfil define a permissão do usuário no ambiente do curso. A matrícula pode ser efetuada em nível do curso, categoria de curso ou do sistema. A matrícula no contexto do sistema possibilita acesso a todos os cursos cadastrados do Moodle. Já no contexto da categoria de curso, dá acesso apenas aos cursos daquela categoria.
    O usuário matriculado no curso terá acesso a todas as atividades criadas dentro do curso. Quando o usuário realiza uma atividade, como postar uma mensagem no fórum, a postagem é vinculada à instância do usuário e não à da matrícula. Isso significa que os módulos de atividades são vinculados ao usuário e não à matrícula. O usuário só poderá ser instanciado na atividade se estiver matriculado no ambiente do curso ao qual a atividade está vinculada.
    Tendo em conta que o usuário é instanciado no módulo de atividade e não no de matrícula, em caso da exclusão  da matrícula, o histórico de participação do usuário nas atividades do curso não será excluído em efeito cascata. O histórico permanecerá inalterado. Se a matrícula for reativada, o aluno continuará no curso do ponto onde havia parado.
    A matrícula no curso ainda pode ser estruturada em grupo e agrupamento. Após cadastrar um aluno no curso, este pode ser vinculado a um ou mais grupos. Grupos servem para efetuar divisão de turmas dentro do ambiente de um curso. Ainda há possibilidade de criar agrupamentos, grupos de grupos. Um agrupamento pode ter um ou mais grupos de usuários. Serve para isolar uma atividade apenas a determinado grupo de usuários. Geralmente é usado para atividade recuperação que só determinados alunos devem fazer.

    Em suma, a arquitetura do Moodle é focada no ambiente do curso. O material didático é instanciado no curso. A matrícula é instância do usuário no ambiente do curso. O aluno acessa o material didático instanciado no curso. Pelo padrão da arquitetura, não há possibilidade de vincular um material didático ou atividade na instância da matrícula. Ou seja, não é possível alocar uma atividade só para um aluno. Isso gera uma grande restrição para projetos pedagógicos que demandam do professor uma atuação personalizada para cada aluno.
     Essa restrição fica muito evidente quando um aluno reprova em um curso e precisa refazê-lo novamente. Como não é possível rematricular na mesma sala de aula, será necessário replicar o curso numa nova sala de aula e inscrever o aluno.  É comum fazer backup de um curso inteiro e restaurar numa nova instância do curso apenas para um aluno que ficou em recuperação.
    Embora o Moodle seja um framework modularizado, toda sua estrutura seguem as regras da arquitetura.  É possível fazer um módulo que solucione essa restrição. No entanto, isso implica reescrever alguns APIs para atender ao desvio do padrão do framework.

sexta-feira, 13 de julho de 2012

Tornar o Campo Descrição Obrigatório ao Editar Perfil do Usuário pelo Código PHP

O campo descrição é opcional no formulário de cadastro e edição do perfil do usuário. Caso queira torná-lo obrigatório apenas ao editar o perfil, será necessário    fazer um hacker no código do core do Moodle. O hacker será desnecessário se houver alguma opção de configuração na interface do Moodle. Pelas pesquisas que fiz, não encontrei essa opção. Então vamos ao hacker. Se você descobrir como fazer essa configuração na interface do Moodle, não esquece de me avisar.
   
    Para obrigar o preenchimento do campo descrição na edição do perifl pelo código PHP, siga os seguintes passos:

1° Passo  - Abrir o arquivo editlib.php
    Abra em um editor de texto o seguinte arquivo:
    $CFG->wwwroot /user/editlib.php
$CFG->wwwroot  se refere ao endereço da pasta em que a aplicação do Moodle está instalada. 

2° Passo  - Localizar o campo descrição do formulário de cadastro/edição
    O código que gera o campo descrição no formulário de cadastro/edição do usuário fica  geralmente na linha  230. Na versão 2.2.2 na linha 260.

Moodle 1.9
Na versão 1.9.x, localize a seguinte linha de código:

$mform->setHelpButton('description', array('text', get_string('helptext')));

Abaixo dessa linha insira o seguinte código:

if(optional_param('id', 0,PARAM_INT)>0) $mform->addRule('description',  get_string('required'), 'required', null, 'client');

Moodle 2
Na versão 2.x , localize a seguinte linha de código:

$mform->addHelpButton('description_editor', 'userdescription');

Abaixo dessa linha insira o seguinte código:

if(optional_param('id', 0,PARAM_INT)>0) $mform->addRule('description_editor',  get_string('required'), 'required', null, 'client');

O código adicionado define a obrigatoriedade do campo descrição apenas se for a edição do  perfil e não o  cadastro de um novo usuário. A diferença do código da versão 1.9.x para 2.x está apenas no nome do campo que mudou de description  para description_editor.


O url de cadastro de usuário e de edição do perfil é  o mesmo . A diferença está no parâmetro id.

Url para cadastro de usuário:
$CFG->wwwroot /user/editadvanced.php?id=-1

Url para edição do perfil do  usuário:
$CFG->wwwroot /user/editadvanced.php?id=5

O parâmetro -1 indica é o processo de cadastro de um novo usuário. Se o parâmetro id for maior que zero, significa que se trata de edição do usuário. Id maior que zero é o id do usuário na base de dados.

O código   if(optional_param('id', 0,PARAM_INT)>0)   verifica se o valor do parâmetro id é maior que zero. Se for, a função addRule aplica a obrigatoriedade no campo descrição. 
 


3° Passo  - Gravar alteração do arquivo editlib.php
    Para que a alteração seja efetivada, grave o arquivo. Feito isso, basta acessar o formulário de edição do perfil  para verificar se o campo descrição ficou obrigatório. 


    Esse procedimento é um hacker do código, ou seja, altera o código padrão do Moodle. Em caso de atualização, esse código será perdido. Para manter, é necessário seguir os mesmos procedimentos após a atualização da versão.

sábado, 2 de junho de 2012

Moodle é um Framework de Ensino Online

    A Plataforma Moodle não é apenas um sistema de gestão de ensino online. É também  um framework de desenvolvimento PHP.
    O ambiente de desenvolvimento do Moodle  disponibiliza ao  programador PHP um conjunto de diretrizes a serem seguidos e bibliotecas prontas para serem reaproveitadas de forma similar a outros frameworks PHP como Zend Framework e cakePHP.
   
Diretrizes de  desenvolvimento do Moodle
    Os diretrizes de  desenvolvimento são um conjunto de regras que o programador PHP deve seguir para criar módulos/plugins seguindo o padrão do framework Moodle. Segue um breve resumo das principais diretrizes de desenvolvimento:
  • Estrutura de arquivos – Define a estrutura de organização de pastas e arquivos padrões que os plugins devem ter para que possam ser reconhecidos automaticamente pelo core do sistema Moodle.
  • Tabelas da base de dados – Define as especificações para gerar tabelas do banco de dados de forma automática durante a instalação de um plugin.
  • Sistema de permissão - Define como os plugins devem tratar as permissões para serem gerenciadas pelo core do Moodle.
  • Internacionalização de idiomas – Define como os plugins devem  tratar as mensagens e textos, que são  exibidos  na interface do usuário, para que estes  tenham suporte multilíngues e possam ser gerenciados pelo core do Moodle.
  • Padronização de nomes – Define as regras sobre o nome do plugin. O nome do plugin funciona como uma chave de identidade para o core do sistema Moodle. A estrutura de alguns arquivos do plugin deve seguir o padrão de nomes para garantir a acoplagem ao core do Moodle.

Biblioteca de código do Moodle
    Ao implementar o código no ambiente Moodle, o programador pode reduzir o tempo de trabalho ao reaproveitar as  várias bibliotecas disponibilizadas  na Plataforma Moodle. A  seguir será apresentada alguns APIs acompanhado de uma breve descrição e link que aponta para a documentação oficial do Moodle.
  •   API do banco de dados - É um conjunto de funções para manipular o acesso ao banco de dados configurado no ambiente Moodle. Para mais detalhes, acesse o link: http://docs.moodle.org/dev/Data_manipulation_API
  •  API do formulário – O formlib do Moodle possibilita efetuar o gerenciamento de formulários: define tipo de entrada de dado, campos obrigatórios, captura e crítica os dados inseridos. Para mais detalhes, acesse o link: http://docs.moodle.org/dev/Form_API
  •  API de Acesso- Esse API  oferece um conjunto de funções que controla permissão de acesso do usuário no ambiente Moodle. Para mais detalhes, acesse o link: http://docs.moodle.org/dev/Access_API
  •  API de Autenticação - Esse API  tem  um conjunto de funções que efetue cadastro e autenticação do usuário. Para mais detalhes, acesse o link: http://docs.moodle.org/dev/Authentication_API
  •  API do String – Define as regras como estruturar arquivos nos plugins para gerenciar string, ou seja, mensagens e texto exibidos na interface do usuário com suporte multilíngues. Para mais detalhes, acesse o link:  http://docs.moodle.org/dev/String_API
  •  Theme – Define a estrutura de arquivos que o plugin do theme (interface gráfica) deve contemplar. Por outro lado, especifica as funções do core do Moodle para gerenciar theme. Para mais detalhes, acesse o link:  http://docs.moodle.org/19/en/Theme_basics
    Moodle não é meramente um website. É um ambiente de desenvolvimento com uma arquitetura voltado para o ensino online. É um framework de desenvolvimento modular que oferece ao usuário a possibilidade de adicionar novas funcionalidades.  A distribuição padrão do Moodle traz o core do sistema e alguns módulos já acoplados. Há inúmeros outros módulos disponíveis na internet que podem ser baixados e instalados no Moodle.

    Do ponto de vista técnico, o Moodle é um ambiente aberto. Pode ser ajustado para atender qualquer demanda pedagógica criando novos módulos/plugins. Para isso, basta seguir as diretrizes de desenvolvimento. Ainda o trabalho pode ser facilitado ao usar os APIs do  Moodle.

terça-feira, 15 de maio de 2012

Bloquear Edição do Nome e Sobrenome dos Usuários Cadastrados no Moodle pelo Código PHP


Caso você queira impedir que o nome e o sobrenome dos usuários sejam alterados após o cadastro, é necessário desativar esses campos na configuração do plugin de autenticação ou  fazer um hacker no código do core do Moodle. O caminho mais indicado é usar interface de configuração do Moodle. Aqui demonstraremos como fazer isso via código PHP. 

Para bloquear a edição dos  campos nome e sobrenome no formulário de edição pelo código PHP, siga os seguintes passos:


1° Passo  - Abrir o arquivo editlib.php
    Abra em um editor de texto o seguinte arquivo:
    $CFG->wwwroot /user/editlib.php
$CFG->wwwroot  se refere ao endereço da pasta em que a aplicação do Moodle está instalada.

2° Passo  - Inserir função de bloqueio edição
    Insira o código abaixo em qualquer parte do arquivo editlib.php. Preferencialmente coloque antes da função useredit_shared_definition. Essa função fica geralmente na linha 70 na versão 1.9  e 80 na versão 2.x.

function readonly_form_element(){
   if(has_capability('moodle/user:create',

    get_context_instance(CONTEXT_SYSTEM)))  return ' ';
  else return ' READONLY ';
 }


Essa função retorna o string READONLY apenas para usuários que não têm permissão de cadastrar usuário. O perfil de aluno e tutor não tem essa permissão. Já o perfil Administrador tem. O string READONLY é um código HTML que impede o campo do formulário de ser editado.
 

3° Passo  - Localizar o campo nome e sobrenome do formulário de cadastro/edição
    O código que gera campo de nome e sobrenome no formulário de cadastro/edição do usuário fica dentro da função useredit_shared_definition. Nessa função, localize os seguintes trechos do código:

if (fullname($nameordercheck) == 'b a' ) {  // See MDL-4325
        $mform->addElement('text', 'lastname',  get_string('lastname'),  'maxlength="100" size="30"');


        $mform->addElement('text', 'firstname', get_string('firstname'), 'maxlength="100" size="30"');


    } else {
        $mform->addElement('text', 'firstname', get_string('firstname'), 'maxlength="100" size="30"');

        $mform->addElement('text', 'lastname',  get_string('lastname'),  'maxlength="100" size="30"');
    }



4° Passo  -  Desativar a edição dos campos nome o sobrenome

    No final de cada linha de código que começa com $mform->addElement...  adicione a função readonly_form_element()definida no passo 2. Feito isso, o trecho do código deve ficar assim:
    if (fullname($nameordercheck) == 'b a' ) {  // See MDL-4325
        $mform->addElement('text', 'lastname',  get_string('lastname'),  'maxlength="100" size="30"'.readonly_form_element());

        $mform->addElement('text', 'firstname', get_string('firstname'), 'maxlength="100" size="30"'.readonly_form_element());

    } else {
        $mform->addElement('text', 'firstname', get_string('firstname'), 'maxlength="100" size="30"'.readonly_form_element());

        $mform->addElement('text', 'lastname',  get_string('lastname'),  'maxlength="100" size="30"'.readonly_form_element());
    }


Ao adicionar a função, o HTML gerado terá o código  READONLY para os usuários que não têm permissão de adicionar novos usuários no Moodle tais como aluno e tutor.  Estes não conseguirão editar os campos nome e sobrenome ao modificar o perfil no Moodle.
 

4° Passo  - Gravar alteração do arquivo editlib.php
    Para que a alteração seja efetivada, grave o arquivo. Feito isso, basta acessar o formulário de edição do perfil  com a senha do aluno ou do tutor para verificar se os campos nome e sobrenome estão bloqueados para edição. Confirme também que esses mesmos campos não estão bloqueados para edição ao acessar o Moodle com a senha do  administrador.  


    Esse procedimento é um hacker do código, ou seja, altera o código padrão do Moodle. Em caso de atualização, esse código será perdido. Para manter, é necessário seguir os mesmos procedimentos após a atualização da versão.