Moodle - struktura kurzu v databazi

Moodle - struktura kurzu v databazi

autor Tomáš Nosek -
Počet odpovědí: 4
Jiz nejakou dobu hledam to, jak vlastne funguji kurzy z pohledu DB. Potrebuji z ruznych kurzu vytahnout ruzne informace a dat dohromady s odpovedmi v modulu dotazniky. Nemam problem s modulem dotazniky, ten je pomerne prehledny. Nicmene vlastni struktura kurzu v Moodlu mi je malinko zahadou... jeste tak chapu, ze v tabulce mdl_course_sections jsou ulozena nejspis jednotliva temata kurzu a ve sloupci sequence teto tabulky pak cisla odkazujici na jejich odkaz. Nicmene nevim, kde najdu obsah prirazeny jednotlivym cislum. Muzete me prosim nekdo odkazat spravnym smerem. Dekuji.
Počet hodnocení: -
V odpovědi na Tomáš Nosek

Re: Moodle - struktura kurzu v databazi

autor David Mudrák -
Obrázek: Moodle HQ Obrázek: Obzvláště nápomocní moodlisté Obrázek: Překladatelé Obrázek: Vývojáři
Zdravíčko.

Každý modul v kurzu (tj. např. Fórum, Test, Studijní materiál nebo Dotazník) má informace o sobě samém uchovány ve své vlastní tabulce (např. forum, quiz, resource apod.). Každé jednotlivé instanci daného modulu je přiřazen jeden "slot" v osnově kurzu - jakýsi šuplík, do něhož je možné modul umístit. Když se vytváří nová instance (např. nový dotazník), je na příslušném místě nejprve vytvořen nový slot a do něj je pak umístěna instance daného modulu.

Informace o slotech, které drží dohromady strukturu všech kurzů, jsou uloženy v tabulce course_modules. V této tabulce jsou důležité cizí klíče:
  • course - id kurzu z tabulky course, který obsahuje tento slot
  • module - id modulu z tabulky modules, který je umístěn v tomto slotu
  • instance - id instance daného modulu, která je umístěna v tomto slotu
Je možno si všimnout, že např. informace o tom, v kterém kurzu je umístěna daná instance nějakého modulu, je uložena dvakrát. Jednou je v tabulce course_modules, podruhé přímo v hlavní tabulce instancí daného modulu. Z pragmaticky databázového hlediska to není vůbec čistý návrh, ale má své výhody ve výkonu dotazů.

Toto uspořádání rovněž ozřejmuje známé problémy v "prázdným kurzem" po importu, kdy se namísto osnovy modulů zobrazují jen jejich ikony bez názvu. V průběhu obnovy/importu totiž dochází nejprve k vytvoření slotu a poté k jeho naplnění importovaným modulem. Pokud se import nezdařil, zůstal v kurzu "trčet" neobsazený slot. Tento problém by však již měl být ošetřen.

Hezké chvíle strávené studiem vnitřností Moodlu přeje

--mudrd8mz
V odpovědi na David Mudrák

Re: Moodle - struktura kurzu v databazi

autor Tomáš Nosek -

Děkuji za rady, doufám, že po Vánocích bude trocha času a dostanu se k vlastní realizaci... úsměv

V odpovědi na Tomáš Nosek

Re: Moodle - struktura kurzu v databazi

autor David Mudrák -
Obrázek: Moodle HQ Obrázek: Obzvláště nápomocní moodlisté Obrázek: Překladatelé Obrázek: Vývojáři
Jinak samozřejmě preferovaný způsob je maximálně využívat API knihoven Moodle, např. pro získaní všech modulů v daném kurzu apod. Většinou čerpám přímo ze zdrojových kódů - je to nejlepší dokumentace mrknout


V odpovědi na Tomáš Nosek

Re: Moodle - struktura kurzu v databazi

autor Peter M -
Mno, ja nedavno potreboval zjistit, kdo je v jakem kurzu zapsany jako ucitel. PHP kod vypada asi takto, treba ti to pomuze. Bohuzel to hleda pouze prvniho ucitele a ne vsechny, myslim...

<?php
@ini_set('error_reporting',E_ALL);
@ini_set('display_errors' ,'on');
error_reporting(E_ALL);

$CFG = array(
'SQL' =>array(
'host' =>"localhost", //MySQL server (host)
'user' =>"root", //MySQL user
'psw' =>"", //MySQL password
'dbname'=>"test" //MySQL DB name
)
);

function sq($query) {$res = mysql_query($query) or die("<hr>Err: $query<hr>".mysql_error()); return $res;} //debug mode

$SQLserver = mysql_connect($CFG['SQL']['host'],$CFG['SQL']['user'],$CFG['SQL']['psw']) or die("Err: connect DB server!" . mysql_error());
$SQLdb = mysql_select_db($CFG['SQL']['dbname'],$SQLserver) or die("Err: connect DB!" . mysql_error());
sq("SET NAMES 'utf8'");


$vysl = sq("
SELECT
`mdl_course`.`visible`,`mdl_course`.`id`, `mdl_course`.`idnumber`,
`mdl_course`.`category`, `mdl_course`.`shortname`, `mdl_course`.`fullname`,
`mdl_role_assignments`.`roleid`,
`mdl_user`.`username`, `mdl_user`.`lastname`, `mdl_user`.`firstname`,
`mdl_role_assignments`.`userid`, `mdl_user`.`id`, `mdl_context`.`instanceid`,
`mdl_context`.`id`, `mdl_role_assignments`.`contextid`
FROM
`mdl_context`, `mdl_course`, `mdl_role_assignments`, `mdl_user`
WHERE
`mdl_user`.`id` = `mdl_role_assignments`.`userid` AND
`mdl_course`.`id` = `mdl_context`.`instanceid` AND
`mdl_context`.`id` = `mdl_role_assignments`.`contextid` AND
`mdl_role_assignments`.`roleid`<5
GROUP BY
`mdl_user`.`id`, `mdl_role_assignments`.`userid`, `mdl_course`.`id`,
`mdl_context`.`instanceid`, `mdl_context`.`id`,
`mdl_role_assignments`.`contextid`
ORDER BY
`mdl_course`.`visible`, `mdl_course`.`category`, `mdl_course`.`fullname`, `mdl_user`.`username`
");

$pocet = mysql_numrows($vysl);
$b = '';
for($i=0; $i<$pocet; $i++)
{
$row = mysql_fetch_array($vysl);
if ($i==0)
{
$b.= "\n".'<tr>';
foreach($row as $key=>$value)
{
if (!is_int($key))
{$b.= '<th>'.strip_tags($key).'</th>';}
}
$b.= '</tr>';
}
$b.= "\n".'<tr>';
foreach($row as $key=>$value)
{
if (!is_int($key))
{$b.= '<td>'.strip_tags($value).'</td>';}
}
$b.= '</tr>';
}
echo '<table border="1"><tbody valign="top">'.$b.'</tbody></table><p>Pocet = '.$pocet.'</p>';
?>