domingo, 19 de setembro de 2010

Criar Curso no Moodle com Comando SQL


    Se você estiver fazendo migração de dados ou integração de um sistema acadêmico com a  Plataforma  Moodle, certamente vai precisar criar curso no Moodle diretamente no banco de  dados sem usar a interface do Moodle.

      Isso implica conhecer a estrutura das tabelas da base de dados do Moodle e fazer INSERT nas tabelas certas. Bem, isso me custou muitas horas de pesquisa. No final descobri que é necessário fazer apenas 4 INSERT básicos. Bem, vamos lá. São  três passos. 

Os comandos SQL foram testados na versão 1.9.3 do Moodle. Devem funcionar para qualquer versão 1.9.x e não para versão inferior a 1.9.
1º Passo – Criar o Curso
    Essa parte é mais moleza. Basta fazer um INSERT na tabela mdl_course com o seguinte comando SQL:

INSERT INTO mdl_course (category,fullname,shortname) VALUES (1,'Curso1','C1')   

Embora a tabela  mdl_course tenha muitas colunas, nesse exemplo foram usadas os mais importantes:
  • category -  Chave estrangeira da tabela de categoria de curso - mdl_course_categories 
  • fullname – Nome complete do curso 
  • shortname – Abreviatura do curso
No comando INSERT, foi criado um curso denominado Curso1 na categoria de curso padrão do Moodle, cujo id é 1. 
Após executar o INSERT, recupera o id do curso gerado automaticamente pelo banco de dados. No MySQL use o comando LAST_INSERT_ID().

2º Passo – Criar Contexto do Curso
    Com o curso criado, agora é necessário criar contexto do curso na tabela mdl_context com o seguinte comando SQL:

INSERT INTO mdl_context (contextlevel,instanceid) VALUES (50,?)
O campo contextlevel define o nível do contexto. Para curso 50 é o valor padrão da tabela de domínio. O campo instanceid é a instância do curso. Preencha esse campo com o valor do Id do curso gerado automaticamente no 1º passo.

    Ao executar o comando SQL, recupere o id do contexto gerado automaticamente. Use esse id para atualizar duas colunas:  path e depth. Para isso, execute o seguinte comando SQL:

UPDATE  mdl_context SET path='/1/3/$ID_CONTEXT', depth=3 WHERE id=$ID_CONTEXT

    Você precisa substituir a variável $ID_CONTEXT pelo id gerado automaticamente do INSERT anterior, ao executar o comando  para criar o contexto do curso. Se o id for 10,  o comando SQL de atualização será:

UPDATE  mdl_context SET path='/1/3/10', depth=3 WHERE id=10
Nesse momento você deve estar perguntando por que o campo path recebe  '/1/3/$ID_CONTEXT' como valor padrão  e o  campo  depth o número 3. Ainda não encontrei a resposta. Assim como você, eu também estou perguntando. Só sei que demorei três semanas mudando de variável até que funcionou. Se não preencher esses campos,  nenhum usuário consegue entrar no curso.  Se você encontrar alguma explicação  não esqueça de me avisar.

3º Passo – Criar tópico/seção padrão do curso 

Ao criar o curso no 1º passo, não foi definido o formato. Por padrão, será criado curso em formato de tópico.  Assim, é necessário cria um primeiro tópico, o tópico número zero,  do curso. Para isso, execute o seguinte comando SQL:

 INSERT INTO mdl_course_sections (course,section) VALUES (?,0)
Na coluna course o valor do parâmetro é o id do curso gerado automaticamente no 1º passo. A segunda coluna, a section define a ordem do tópico. Por se tratar do primeiro tópico, deixe zero como está.
    Há outras colunas na tabela mdl_course_sections. No entanto, para efeito de simplificação, se restringiu aos mais importantes.
    Ao finalizar o 3º passo, o curso já está criado no Moodle. Há muitas configurações do curso que não foram abordado nesse poste. Você pode fazer isso preenchendo todos as outras colunas das tabelas mdl_course mdl_course_sections  e entre outros. Agora que o curso já está criado, acesse o ambiente Moodle com a senha do admin,  ative a edição e adicione o bloco de administração. Daí, faça o restante das configurações.

    Os comandos SQL foram testados apenas na versão 1.9.3. Deve funcionar em qualquer versão 1.9.x  já a estrutura das tabelas são as mesmas.  Não deve funcionar para as versões anteriores a 1.9.  Mas lógica é muito parecida. Não custa testar e fazer os ajustes necessários.  Agora boa programação, ou melhor, boa sorte na jornada de integração do Moodle com o seu sistema acadêmico.


Veja Também
Matricular Usuário no Curso do Moodle com Comando SQL

segunda-feira, 13 de setembro de 2010

Verificar a Senha do Usuário do Moodle com Comando SQL


    É muito comum no Moodle a senha do usuário não funcionar. Isso pode ocorrer após a importação da base de dados de usuário, cadastro de novo usuário, recuperação de curso  etc. O fato é que, de repente,  as senhas deixam de funcionar. Ao logar, mesmo usando o login e a senha corretos não funciona.  

    Quando isso acontece, as causas podem ser diversas. Para eliminar a hipótese que você esteja passando o login e a senha erradas ou que a tabela do banco que armazena a senha não foi corrompida,  é necessário fazer uma consulta SQL diretamente na base de dados. Nessa consulta, verifique se a combinação de login e senha existem. Para isso, execute o seguinte comando SQL:

SELECT COUNT(id) FROM   mdl_user WHERE username='joao' AND password=MD5('silva')
Se o resultado da consulta retornar 0 (zero)  significa que não existe nenhum usuário cadastrado com login João e senha silva. Caso retorna 1 (um) significa que o cadastro.

    Se a combinação do login e da senha funcionarem no comando SQL deve funcionar também ao logar no Moodle.  Se não funcionar no Moodle, é sinal que problema é outro e não da senha. Neste caso, você eliminou uma hipótese. Então, passe para próxima hipótese da lista e boa sorte.

Veja Também:
Recuperar Senha do Administrador do Moodle com Comando SQL

quinta-feira, 9 de setembro de 2010

Padronização das tabelas do Banco de Dados do Moodle


    A Plataforma Moodle é um sistema modular, ou seja, é um ambiente de gerenciamento de vários módulos voltado para gerenciamento de cursos.  A estrutura da base de dados reflete muito bem isso.

Padrão de Nome das  Tabelas

    As tabelas no banco de dados são compostas pelo prefixo e nome do módulo. mdl_ é o prefixo padrão. Isso pode ser alterado no momento de instalação.  Por exemplo, a tabela do módulo fórum é mdl_forum. Sendo mdl_ é o prefixo e forum é o nome do módulo. Todos os módulos seguem esse padrão.

Módulos que não são do Núcleo do Sistema
Os módulos que não compões o núcleo do sistema  ficam registradas na tabela mdl_modules. Para visualizar esses módulos,  basta fazer uma consulta na  tabela mdl_modules, usando o seguinte comando SQL:

SELECT id,name FROM mdl_modules
Resultado da pesquisa:
Id    name
1      assignment
2      chat
3      choice
4      data
5      forum
6      glossary
7      hotpot
8      journal
9      label
10      lams
11      lesson
12      quiz
13      resource
14      scorm
15      survey
16      wiki
17      workshop  

    Essa consulta foi feita nas versões 1.9.3 e 1.9.7 do Moodle. Isso já é padrão da versão 1.9+ A consulta lista os módulos que vêm na distribuição padrão do Moodle. A consulta traz os campos id (chave de identificação) e name (nome do módulo).

Tabela Principal e Secundária do Módulo
    A tabela principal de cada modulo é  prefixo + nome do módulo. Em cada módulo há outras tabelas, ou seja, tabelas secundárias. Por exemplo, a tabela principal do fórum é mdl_forum (prefixo + nome do módulo). O fórum é  composta por tópicos de discussões de comentários. Pois, as tabelas secundárias são:
  • mdl_forum_discussions – Tabela dos tópicos de discussão do fórum
  • mdl_forum_posts    - Tabela de comentários do fórum
  • mdl_forum_ratings    - Tabela de nota do fórum
    Nas tabelas secundárias dá para notar que o padrão do nome é prefixo + nome do módulo + funcionalidade do módulo.
    Embora tomamos como exemplo a tabela do fórum, esse padrão se aplica a todos os módulos.

Colunas Padrão nas Principais  Tabelas que não são do Núcleo do Sistema
    Até agora deu para entender a estrutura das tabelas dos módulos. Em cada tabela do módulo que não seja do núcleo do sistema, por padrão, deve as seguintes colunas:
  • id – Chave de identificação de cada registro da instância do módulo.
  • name – Nome  do registro da instância do módulo.
  • course – Id do curso  em que o módulo está vinculado. É a chave estrangeira da tabela mdl_course. Isso significa que cada registro da instancia de um módulo deve estar obrigatoriamente vinculado a um determinado curso.
Com esse padrão, torna possível montar uma rotina que faz leitura automática de todos os módulos. Para tornar isso mais claro, vamos ver um exemplo.
O comando SQL  abaixo faz uma consulta dos campos padrões do módulo fórum.

SELECT id, name, course FROM mdl_forum
Resultado da pesquisa:
id    name        course
1    Fórum Teste I     2
2    Fórum Teste II    2
3    Dúvidas Gerais    3
    A consulta retorna três registros de fórum. A coluna course indica que os fóruns registrados pertencem aos cursos cujo id são 2 e 3. A  mesma pesquisa pode ser aplicada a qualquer módulo, basta substituir a parte do nome da tabela após o prefixo pelo nome do outro módulo. Para pesquisar no módulo do questionário, o comando SQL seria:

SELECT id, name, course FROM mdl_quiz
    Isso não se aplica aos módulos que compões ao núcleo  do sistema tais como usuário, curso, log etc.

Tabelas dos módulos do sistema

mdl_user – Tabela principal do módulo do usuário
mdl_course  - Tabela principal do módulo do curso
mdl_log - Tabela principal do módulo de log
etc.
 
    Bem, você já deve ter sacado como é o padrão e a estrutura das tabelas do Moodle. Caso queira  explorar mais afundo isso, clique aqui, e acesse um arquivo com dump, ou seja, um backup da estrutura de todas as tabelas do Moodle 1.9.3 e com dados reais sobre curso. Estudar banco de dados não é uma tarefa muito mole, por isso lhe desejo boa sorte e muita paciência.

sexta-feira, 3 de setembro de 2010

Extrair Lista de Usuários não Cadastrados no Curso do Moodle com Comando SQL


    Para extrair uma lista de usuários que não estão cadastrados em nenhum curso do Moodle ou em um determinado curso, é necessário fazer a junção por exclusão da tabela usuário na tabela matrícula. 

mdl_user Tabela de usuário
mdl_role_assignmentsTabela de matrícula a partir da versão 1.7
    A junção por exclusão consiste em mapear todos os registros na tabela usuário que não tenham correspondência na tabela da matrícula. No comando SQL  isso é implementado por meio da sub consulta, como segue a abaixo.

Lista de usuários que não estão cadastrados em nenhum curso
SELECT  id,firstname, lastname FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments )
Contar a quantidade de  usuários que não estão cadastrados em nenhum curso
SELECT  COUNT(id) FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments )
Lista de usuários que não estão cadastrados em um determinado curso
SELECT  id,firstname, lastname  FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments rs INNER JOIN mdl_context c ON rs.contextid=c.id WHERE c.instanceid=?)
Passe o parâmetro id do curso em c.instanceid=?

Contar a quantidade de  usuários que não estão cadastrados em um determinado curso
SELECT COUNT(id)   FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments rs INNER JOIN mdl_context c ON rs.contextid=c.id WHERE c.instanceid=?)
Passe o parâmetro id do curso em c.instanceid=?

    Todos os filtros utilizam sub-select, uma consulta dentro da outra. O primeiro SELECT extrai a lista de usuário da tabela do usuário. O segundo SELECT extrai a lista de usuários da tabela matrícula. O camando NOT IN exclui da primeira lista, os usuários que tem correspondência na segunda lista. Assim, sobra apenas os que não estão cadastrados no curso.

Veja também:
Matricular Usuário no Curso do Moodle com Comando SQL
Cancelar Matricula no Moodle com Comando SQL
Data de inscrição do aluno no curso do Moodle

quinta-feira, 2 de setembro de 2010

Vincular um Curso a mais de uma Categoria de Curso no Moodle com Comando SQL



Caso você precise que um curso do Moodle seja vinculado a mais de uma categoria do curso, é necessário fazer uma customização do Moodle. O propósito dessa postagem é explicar como fazer isso  por meio do comando SQL.

    De repente você deve estar confuso com os termos curso e categoria de curso.  Bem, devo ressaltar que estou usando a linguagem técnica do Moodle. Traduzindo isso para a linguagem acadêmica, curso equivale a disciplina e categoria de curso equivale ao curso. Há  uma postagem que explica de forma mais detalhada. Veja aqui: http://moodlesql.blogspot.com/2010/08/organizacao-do-curso-no-moodle-e.html
    Na estrutura do banco de dados do Moodle, um curso deve pertencer a uma única categoria. É um relacionamento de um para muitos, como mostra a estrutura das tabelas  mdl_course_categories e mdl_course.

Estrutura da tabela mdl_course_categories
 id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 name varchar(255) NOT NULL DEFAULT '',
 description text,
 parent bigint(10) unsigned NOT NULL DEFAULT '0',
 etc…
Estrutura da tabela mdl_course

 id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 category bigint(10) unsigned NOT NULL DEFAULT '0',
 sortorder bigint(10) unsigned NOT NULL DEFAULT '0',
 fullname varchar(254) NOT NULL DEFAULT '',
 shortname varchar(100) NOT NULL DEFAULT '',
etc…
    Apenas as colunas mais importantes foram apresentadas para ficar resumido. Então vamos lá. A coluna category  da tabela mdl_course é a chave estrangeira da coluna id da tabela mdl_course_categories. Sendo assim, cada curso deve pertencer a uma única categoria de curso. Uma categoria de curso pode ter vários cursos vinculados. Por isso, o relacionamento é de um para muitos.

    Para que um curso seja vinculado a mais de uma categoria, é necessário criar uma tabela intermediaria entre as tabelas  mdl_course_categories e mdl_course. Neste caso,  temos que criar uma terceira tabela que  pode ser nomeada mdl_courses_categories. Olhe que a terceira tabela, para manter o padrão do nome do Moodle, ficou  mdl_courses_categories. A única diferença da tabela mdl_course_categories é nome do curso que ficou no plural. Cuidado para não fazer confusão. Bem, esse nome é só uma sugestão. Você pode atribuir nome que achar mais conveniente.

Estrutura da tabela mdl_courses_categories  (tabela intermediária)
id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 course bigint(10) unsigned NOT NULL,
 category bigint(10) unsigned NOT NULL,
 
Para criar essa tabela execute o seguinte comando comando SQL:

CREATE TABLE mdl_courses_categories (
      id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
      course bigint(10) unsigned NOT NULL,
      category bigint(10) unsigned NOT NULL,
     PRIMARY KEY (id)
    )
    Nessa tabela, a coluna course é a chave estrangeira da coluna id da tabela mdl_course. A coluna category é a chave estrangeira da coluna id da tabela mdl_course_categories. Neste caso, há um relacionamento de muitos para muitos. Um curso pode pertencer a  várias categorias e uma categoria pode ter vários cursos. Assim, você amplie a possibilidade do Moodle atender uma nova estrutura de organização de dados.

    Essa alteração na camada da base de dados do Moodle requer desenvolver uma aplicação a parte ou um módulo do Moodle para inserir dados e extrair relatórios. Para isso, veja o comando SQL para inserir dados e extrair relatórios na tabela intermediária.

Comando SQL  para inserir dados
INSERT INTO  mdl_courses_categories (course,category) VALUES(?,?)

Comando SQL  para listar todas as categorias e todos os cursos relacionados na tabela intermediária
SELECT t.name, c.fullname FROM mdl_course c INNER JOIN mdl_courses_categories s ON c.id=s.course INNER JOIN mdl_course_categories t ON t.id=s.category
A coluna t.name é o nome da categoria de curso. Já a  coluna c.fullname é o nome do curso.

Comando SQL  para listar todos os cursos vinculados a uma determinada categoria
SELECT c.id, c.fullname FROM mdl_course c INNER JOIN mdl_courses_categories s ON c.id=s.course WHERE s.category=?
Passe o parâmetro id da categoria do curso em s.category=?

Comando SQL  para listar todos as categorias relacionadas a um determinado curso
SELECT t.id,t.name FROM mdl_course_categories t INNER JOIN mdl_courses_categories s ON t.id=s.category WHERE s.course=?
Passe o parâmetro id do curso   em  s.course=?
Comando SQL  para contar a quantidade de categorias em que um curso está vinculado
SELECT COUNT(category) FROM mdl_courses_categories  WHERE course=?
Passe o parâmetro id do curso   em  course=?
    Os exemplos dos comandos SQL lhe auxiliam para inserir dados e montar relatórios usando qualquer linguagem de programação.

    Falando agora na linguagem acadêmica, ao implementar a tabela intermediária, torna possível que uma disciplina (curso no Moodle) seja vinculada a mais de um curso (categoria de curso no Moodle). Se isso for o caso da sua instituição de ensino, agora só falta fazer a programação. Então, boa codificação.