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.
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:
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
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
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
Děkuji za rady, doufám, že po Vánocích bude trocha času a dostanu se k vlastní realizaci...
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
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>';
?>
<?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>';
?>