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.

Um comentário:

  1. Gostaria de saber para que server o campo sortorder da tabela mdl_course_categories exatamente. Pois tenho que criar uns sub-categorias através do SQL e não sei como devo preencher este campo.
    Obrigado pela atenção.

    ResponderExcluir