Pour ceux que ça intéresse je livre tel que un snippet à adapter selon les besoins et qui permet de faire des Qcms :
class Qcm {
private $question;
private $reponses;
private $id;
public function __construct($query, $reps, $id=0){
$this->question=$query;
$this->reponses=$reps;
$this->id=$id;
}
public function getQuestion(){return $this->question;}
public function getReponses(){return $this->reponses;}
public function getId(){return $this->id;}
public function setQuestion($question){$this->question=$question;}
public function setReponses($reps){$this->reponses=$reps;}
public function setId($id){$this->id=$id;}
}
interface QcmService{
public function getQcmById($id);
public function getQcmsByIds($ids);
}
interface QcmServiceByParent{
public function getQcmsByParent($id);
public function getQcmsByParents($ids);
}
interface QcmDAO{
public function getQcmById($id);
public function getQcmsByIds($ids);
}
interface QcmIdParentDAO{
public function getIdsQcmsByParent($id);
public function getIdsQcmsByParents($ids);
}
interface QcmParentDAO extends QcmIdParentDAO{
public function getQcmsByParent($id);
public function getQcmsByParents($ids);
}
interface QcmAff{
public function affQcm(Qcm $qcm);
public function affQcms($qcms);
}
interface QcmAffById{
public function affQcmById($id);
public function affQcmsByIds($ids);
}
interface QcmAffByParent{
public function affQcmsByParent($id);
public function affQcmsByParents($ids);
}
interface RandomTabId{
public function pickone();
public function pickmultiple($nb);
}
///on implémente à présent les interfaces
class RandomTabIdImpl implements RandomTabId{
private $n=1;
private $lasts=array();
private $nbs=array();
private $tab=array();
public function __construct($n){
$this->n=$n;
$this->init();
//echo 'salut';
}
public function init(){
for($j=0;$j<$this->n;$j++){
$lasts[$j]=1;
$nbs[]=1;
}
$this->lasts=$lasts;
$this->nbs=$nbs;
$tab=range(0,$this->n-1);
$this->tab=$tab;
}
public function pickOne(){
srand((float)microtime()*1000000);
shuffle($this->tab);
$this->update($tab[0]);
return $this->tab[0];
}
public function pickOne2(){
srand((float)microtime()*1000000);
$nbs=$this->nbs;
sort($nbs);
$nbs=array_slice($nbs,0,$this->n/4+1);
$tab=array();
for($j=0;$j<$this->n;$j++){
if(in_array($this->nbs[$j],$nbs)) $tab[]=$j;
}
shuffle($tab);
//print_r($tab);
$this->update($tab[0]);
//print_r($this->nbs);
return $tab[0];
}
public function pickMultiple($nb){
srand((float)microtime()*1000000);
shuffle($this->tab);
$returntab=array_slice($this->tab, 0, $nb);
$this->updatea($returntab);
return $returntab;
}
private function update($id){
for($j=0;$j<$this->n;$j++){
$this->lasts[$j]++;
}
$this->lasts[$id]=0;
$this->nbs[$id]++;
}
private function updatea($ids){
for($j=0;$j<$this->n;$j++){
$this->lasts[$j]++;
}
foreach($ids as $id){
$this->lasts[$id]=0;
$this->nbs[$id]++;
}
}
}
/*
$random=unserialize($_SESSION['random']);
if (empty($random)){
$random=new RandomTabIdImpl(18);
}
$random->pickMultiple(8);
$random->pickMultiple(8);
$random->pickMultiple(8);
$random->pickOne();
print($random->pickOne2());
$_SESSION['random']=serialize($random);
print_r($random);
*/
class QcmServiceImpl implements QcmService{
private $_dao=null;
public function getQcmById($id){return $this->_dao->getQcmById($id);}
public function getQcmsByIds($ids){
$returnQcms=array();
foreach($ids as $id){
$returnQcms[]=$this->getQcmById($id);
}
return $returnQcms;
}
public function setDAO(QcmDAO $dao){$this->_dao=$dao;}
}
class QcmServiceIdParentImpl extends QcmServiceImpl implements QcmServiceByParent{
private $_parentDao=null;
public function getQcmsByParent($id){
return $this->_parentDao->getQcmsByParent($id);
}
public function getQcmsByParents($ids){
return $this->_parentDao->getQcmsByParents($ids);
}
public function setParentDAO(QcmParentDAO $dao){$this->_parentDao=$dao;}
public function getQcmById($id){if(isset($this->_parentDao)){return $this->_parentDao->getQcmById($id);}}
}
class QcmAffImpl implements QcmAff{
public function affQcm(Qcm $qcm){
echo $qcm->getQuestion();
srand((float)microtime()*1000000);
echo '<form name="qcmform'.$qcm->getId().'">';
$reps=$qcm->getReponses();
$num=count($reps);
$shuff=array();
for($i=0;$i<$num;$i++){
$shuff[]=$i;
}
shuffle($shuff);
for($i=0;$i<$num;$i++){
echo '<input type="radio" class="qcm" name="qcm" value="'.$shuff[$i].'" style="display:inline" />';
echo $reps[$shuff[$i]];
echo '<br/>';
}
echo '<input type="button" label="tester" value="tester" onclick="testrep(document.qcmform'.$qcm->getId().','.$qcm->getId().');"/>';
echo '</form>';
echo '<span id="rep'.$qcm->getId().'"> </span><br/>';
}
public function affQcms($qcms){
foreach($qcms as $qcm){
$this->affQcm($qcm);
}
}
}
class QcmAffByIdImpl extends QcmAffImpl implements QcmAffById {
private $_service=null;
public function affQcmById($id){$this->affQcm($this->_service->getQcmById($id));}
public function affQcmsByIds($ids){
foreach($ids as $id){
$this->affQcmById($id);
}
}
public function setService(QcmService $service){$this->_service=$service;}
}
class QcmDAOImpl implements QcmDAO{
public function getQcmById($id){
global $modx;
$doc=$modx->getDocument($id);
$query=$doc['content'];
$numtv=$modx->getTemplateVar('QCM_nbR','*',"$id");
$num=$numtv['value'];
$tv=array();
$tvv=array();
for($i=0;$i<$num;$i++){
$j=$i+1;
$tv[$i]=$modx->getTemplateVar("QCM_R".$j,'*',"$id");
$tvv[$i]=$tv[$i]['value'];
}
$returnQcm=new Qcm($query, $tvv,$id);
return $returnQcm;
}
public function getQcmsByIds($ids){
$returnQcms=array();
foreach($id as $ids){
$returnQcms[]=$this->getQcmById($id);
}
}
}
class QcmDAOImplMock implements QcmDAO{
public function getQcmById($id){
$query="ma question";
$reps=array("first","second","third");
$returnQcm=new Qcm($query, $reps,$id);
return $returnQcm;
}
public function getQcmsByIds($ids){
$returnQcms=array();
foreach($id as $ids){
$returnQcms[]=$this->getQcmById($id);
}
}
}
$qcmDao=new QcmDAOImplMock();
$qcmService=new QcmServiceImpl();
$qcmService->setDAO($qcmDao);
$qcmAff=new QcmAffImpl();
$qcm=$qcmService->getQcmById(1);
$qcmAff->affQcm($qcm);
//$qcms=$qcmService->getQcmsByIds(range(3,4));
//$qcmAff->affQcms($qcms);
$qcmAff2=new QcmAffByIdImpl();
$qcmAff2->setService($qcmService);
//$qcmAff2->affQcmById(8);
//$qcmAff2->affQcms($qcms);
$qcmAff2->affQcmsByIds(range(8,10));
$qcmDao=new QcmDAOImpl();
$qcmService->setDAO($qcmDao);
$qcmAff2->setService($qcmService);
//$qcmAff2->affQcmById(149);
Il faut également créer un chunk qcm :
<script language='javascript'>
function selecteditem(field){
for (i=0;i<field.length;i++){
//alert(field[i].value);
if (field[i].checked==true){
return i;}}
return -1;
}
function testrep(form,i){
sel=selecteditem(form.qcm);
rep="rep"+i;
if(form.qcm[sel].value==0){
$(rep).firstChild.nodeValue=" Bravo !!";
}
else $(rep).firstChild.nodeValue=" Essaye encore";
}
</script>
Puis on réalise cet appel dans une page : {{qcm}}[[qcm]].
Comme vous le verrez je crée un Qcm pipo qui permet de vérifier si l’affichage fonctionne bien.
Sinon pour afficher des Qcms provenant de ma base MODx, je crée un template QCM avec les TVs QCM_R1, QCM_R2, QCM_R3, ..., QCM_nbR.
La question sera le contenu standard de mon document, les réponses possibles sont QCM_R1, QCM_R2, ..., je code en dur le nombre de réponses à proposer avec QCM_nbR, et la bonne réponse sera toujours QCM_R1. Ensuite vous décommentez les dernières lignes en remplaçant 149 par l’id de votre fiche qcm.