[Resolu] Tableau nb cours par categorie (Moodle)

Tableau nb cours par categorie (Moodle) [Resolu] - PHP - Programmation

Marsh Posté le 07-01-2010 à 16:00:58    

Bonjour à tous,
 
j'ai un ptit problème un peu bete, que je vais vous expliquer.
 
j'ai un champ dans une table qui est systématiquement du style "/4/25/12" correspondant au chemin d'une catégorie
(exemple : la catégorie 12 est une catégorie fille de la 25 qui est elle même dans la catégorie 4"...
 
J'ai donc fais un explode de"/" afin d'avoir chaque categorie... seulement apres il me faudrait un tableau pour regrouper toutes les categorie dans leur categorie mère...
 
J'ai chercher en vain... :-(
 
 
Si vous avez une piste ou une idée de classement, je suis preneur !
 
Merci !
 :hello:


Message édité par Crawdge le 12-01-2010 à 09:02:42
Reply

Marsh Posté le 07-01-2010 à 16:00:58   

Reply

Marsh Posté le 07-01-2010 à 16:04:59    

moodle ?

Reply

Marsh Posté le 07-01-2010 à 16:07:14    

exactement :)

Reply

Marsh Posté le 07-01-2010 à 16:22:27    

ta de de la chance
$courses etant la liste de t'es cours, genre  my_moodle ou une autre requete

 
Code :
  1. $menu = array();
  2.  
  3. foreach($courses as $course)
  4.     {
  5.         $path     = $course->categorypath;
  6.         $id     = $course->id;
  7.         
  8.         $tree     = create_tree_path($path, $id);
  9.         $menu      = array_merge_recursive($menu, $tree);
  10.     }    
  11.     
  12.     function create_tree_path($item, $id)
  13.     {
  14.         $paths = explode('/', $item);        
  15.         $depth = count($paths) - 1;
  16.         
  17.         $tree = array_fill_keys($paths, array());
  18.         
  19.         $last_key = end(array_keys($tree));
  20.         $tree[$last_key] = array('course' => $id);    
  21.     
  22.         while($depth)
  23.         {
  24.             $cat = $paths[$depth - 1];            
  25.             $last = array_pop($paths);            
  26.             
  27.             $result = get_record("course_categories", "id", $last);
  28.             
  29.             $tree[$cat] = array($result->sortorder . ':' . $last  => $tree[$last]);
  30.             array_pop($tree);
  31.         
  32.             --$depth;
  33.         }
  34.         
  35.         return current($tree);        
  36.     }


Message édité par stealth35 le 07-01-2010 à 16:23:28
Reply

Marsh Posté le 07-01-2010 à 16:30:58    

Hummm ca m'a l'air très intéréssant !
 
je te remercie beaucoup !
je vais me pencher là dessus !
 
Bonne soirée !

Reply

Marsh Posté le 08-01-2010 à 15:41:16    

Bon, j'ai fait autrement vu que ca ne correspondait pas exactement à mon problème, mais j'ai quand même un soucis...
 
La situation :  
Je veux réaliser un tableau récapitulant les catégories à la racine, et le nombre de cours qui a été créés pour chacune pendant une période donnée.
 
Ma solution :
J'ai récupéré les catégories de profondeur=1 (qui sont donc à la racine, soit les catégories mères).  
Pour chaque catégories mères, je lance ma fonction récursive :recherche_nb_espace_ouvert_cat_racine(id de la catégorie, date début, date fin)
Cette fonction regarde s'il y a des cours dans cette categorie, cherche s'il elle a des categories filles, et additionne le nombre de cours dans la catégorie mère+ les cours des autres catégories filles.
S'il y a des catégories filles, on relance la récursive, sinon on retourne le nombre de cours qui sont dans la catégorie mère.
 
Mon code :

Code :
  1. $nb_cours_total=0; //On va additionné toutes les créations de cours toutes categories confondues
  2. $sql = "SELECT * FROM mdl_course_categories WHERE depth=1";
  3. // on selectionne toutes les rubriques de première profondeur (les rubriques principales)  
  4. $categories_racine = mysql_query($sql);
  5. while($categorie=mysql_fetch_object($categories_racine))
  6. {
  7.     $liste_cat.= "<tr><td>".$categorie->name."</td>";
  8.     $nb_cours_cat_racine=recherche_nb_espace_ouvert_cat_racine($categorie->id,$debut,$fin);
  9.     if($nb_cours_cat_racine==0){
  10.       $liste_cat.= "<td>".$nb_cours_cat_racine."</td></tr>";
  11.     }else{
  12.       //le lien permet de voir dans une dialog en jquery, les cours créés dans cette periode
  13.       $liste_cat.= "<td><a href='#' onclick='voir_ss_cat(".$categorie->id.",".$debut.",".$fin." );return false;'>".$nb_cours_cat_racine."</a></td></tr>";
  14.       //on additionne pour avoir le nombre de cours total
  15.       $nb_cours_total+=$nb_cours_cat_racine;
  16.     }
  17.    
  18.    
  19. }
  20. $liste_cat.="</table>";
  21. fonction appellée :
  22. function recherche_nb_espace_ouvert_cat_racine($id_cat,$date_deb,$date_fin,$nb=0){
  23.    
  24.     //On recupere des infos sur la categorie
  25.     $sql="SELECT * FROM mdl_course_categories WHERE id='".$id_cat."'";
  26.     $info_cat=mysql_query($sql);
  27.     $infos_cat=mysql_fetch_object($info_cat);
  28.                                            
  29.     //On cherche les courses qui sont dans la categorie et créées entre  la date de debut et la date de fin
  30.     $sql= 'SELECT * FROM mdl_course WHERE category='.$id_cat.' AND timecreated BETWEEN '.$date_deb.' AND '.$date_fin;
  31.     $cours_racine_cat = mysql_query($sql);
  32.        
  33.     //On compte le nombre de courses qui sont dans cette categorie
  34.     $nb+=mysql_num_rows($cours_racine_cat);
  35.        
  36.     //On cherche les courses qui sont dans la categorie et qui ont pour parent la categorie actuelle
  37.     $sql = "SELECT * FROM mdl_course_categories WHERE parent=".$id_cat." ORDER BY sortorder";
  38.     $ss_cats = mysql_query($sql);
  39.     //On compte le nombre de categorie fille qu'il y a
  40.     if(mysql_num_rows($ss_cats)!=0){
  41.       //S'il y a des categories filles, pour chaqu'une on va récuperer leurs filles
  42.       while($ss_cat=mysql_fetch_object($ss_cats))
  43.        {
  44.           //On recherche les filles de la categorie fille auquel on ajoute le compteur
  45.           recherche_nb_espace_ouvert_cat_racine($ss_cat->id,$date_deb,$date_fin, $nb);
  46.        }
  47.     }else{
  48.       //S'il n'y a pas de categorie fille, on a atteint le bout de la branche des sous categories de la categorie principale
  49.       return $nb;
  50.     }
  51. }

Mon problème actuel :  
J'ai bien la liste des catégories qui sont à la racine.
Cependant, pour certaines categorie, il ne m'affiche pas de résultat (même pas un simple 0)...
(alors que pour certaines, ca a l'air de fonctionner...)
 
 
Donc j'aurai besoin d'un oeil exterieur à mon problème, pour essayé de voir où je merdouille...
 
 
Merci d'avance en tout cas pour le temps de la lecture, et de la réponse éventuel ! ;)

Reply

Marsh Posté le 08-01-2010 à 16:13:44    

en gros tu veux un tableau type
 
Math  52 cours
Français 40 cours
 
peu importe les sous catergories (exemple  : Math - trigo - 3 cours)

Reply

Marsh Posté le 11-01-2010 à 15:49:10    

J'ai besoin des 2 en fait...
 
Un sans pour un tableau général et l'autre avec pour un tableau d'une catégorie en paramètre...
 
 
J'ai réussi a faire marcher mon code, mais les résultats sont faux on dirait... (une de mes erreurs était lignes 51 de mon code... vu que si on est en bout de hiérarchie de catégorie, il retournais le résultat nul part)
 
 

Reply

Marsh Posté le 11-01-2010 à 18:31:01    

je suis sur y'a moyen de faire ca direct en sql, je test et je te redis

Reply

Marsh Posté le 12-01-2010 à 08:25:33    

Ok merci, c'est gentil :)

Reply

Marsh Posté le 12-01-2010 à 08:25:33   

Reply

Marsh Posté le 12-01-2010 à 09:02:08    

Bon, c'est plus la peine de chercher, j'ai réussi !  [:mycrub]  
 
Merci pour ton aide en tout cas, qui m'a donné des pistes de réflexions ;)
 
 
 
 
Pour ma solution j'ai dans ma page principal :

Code :
  1. $liste_cat="<table>";           
  2.        
  3. $nb_cours_total=0; //On va additionné toutes les créations de cours toutes categories confondues
  4. $sql = "SELECT * FROM mdl_course_categories WHERE depth=1";
  5. // on selectionne toutes les rubriques de première profondeur (les rubriques principales)  
  6. $categories_racine = mysql_query($sql);
  7. while($categorie=mysql_fetch_object($categories_racine))
  8. {
  9.     $liste_cat.= "<tr><td>".$categorie->name."</td>";
  10.     $nb_cours_cat_racine=recherche_nb_espace_ouvert_cat_racine($categorie->id,$debut,$fin,0);
  11.     if($nb_cours_cat_racine==0){
  12.       $liste_cat.= "<td>".$nb_cours_cat_racine."</td></tr>";
  13.     }else{
  14.       $liste_cat.= "<td><a href='#'onclick='voir_ss_cat(".$categorie->id.",".$debut.",".$fin." );returnfalse;'>".$nb_cours_cat_racine."</a></td></tr>";
  15.       //on additionne pour avoir le nombre de cours total
  16.     $nb_cours_total+=$nb_cours_cat_racine;
  17.     } 
  18. }
  19. $liste_cat.="</table>";


Celà permet de prendre toutes les categories de prondeur 1 (categories mère donc), et pour chaque, de lancer ma fonction récursive, cherchant s'il y a des cours dans cette categorie, et si elle a des categories filles.
 
 
Ma fonction récursive :

Code :
  1. //variable global pour calculer le nombre de cours dans une categorie mère
  2. global $nb_retour_cat;
  3. function recherche_nb_espace_ouvert_cat_racine($id_cat,$date_deb,$date_fin,$nb_retour_cat){
  4.    
  5.                                                    
  6.     //On cherche les courses qui sont dans la categorie et créées entre  la date de debut et la date de fin
  7.     $sql1= "SELECT * FROM mdl_course WHERE category=".$id_cat." AND timecreated BETWEEN ".$date_deb." AND ".$date_fin;
  8.     $cours_racine_cat = mysql_query($sql1);
  9.                
  10.     //On compte le nombre de courses qui sont dans cette categorie
  11.     $nb_cours_cat=mysql_num_rows($cours_racine_cat);
  12.     $nb_retour_cat+=$nb_cours_cat;
  13.                
  14.     //On cherche les categories qui sont dans la categorie mere et qui ne sont pas vide
  15.     $sql2 = "SELECT * FROM mdl_course_categories WHERE parent=".$id_cat."  ORDER BY sortorder";
  16.     $ss_cats = mysql_query($sql2);
  17.     $nb_sscats=mysql_num_rows($ss_cats);       
  18.     //On compte le nombre de categorie fille qu'il y a
  19.     if($nb_sscats!=0){
  20.       //S'il y a des categories filles, pour chaqu'une on va récuperer leurs filles
  21.       while($ss_cat=mysql_fetch_object($ss_cats))
  22.        {
  23.      
  24.           $nb_retour_cat=recherche_nb_espace_ouvert_cat_racine($ss_cat->id,$date_deb,$date_fin, $nb_retour_cat);                   
  25.        }
  26.     }                 
  27.   //S'il n'y a pas de categorie fille, on a atteint le bout de la branche des sous categories de la categorie principale
  28.   return $nb_retour_cat;
  29. }


 [:d4buff]

Reply

Marsh Posté le 12-01-2010 à 15:09:31    

ca a l'air pas mal tout ca, par contre je t'invite a utiliser le codage moodle, par exemple tes table sont du type  mdl_ mais c'est pas obligation

 

exemple  : mdl_course  ca sera  {$CFG->prefix}course

 

sinon ta des petite fonction simpa interne a moodle comme :
get_records_sql($sql);
ou
get_record("course", "id", 17);

 

je dis ca dans le cas ou t'aimerai partagé ton code avec la communauté ;)


Message édité par stealth35 le 12-01-2010 à 15:10:03
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed