Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
670 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [Resolu] Tableau nb cours par categorie (Moodle)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Resolu] Tableau nb cours par categorie (Moodle)

n°1955855
Crawdge
Posté le 07-01-2010 à 16:00:58  profilanswer
 

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
mood
Publicité
Posté le 07-01-2010 à 16:00:58  profilanswer
 

n°1955857
stealth35
Posté le 07-01-2010 à 16:04:59  profilanswer
 

moodle ?

n°1955858
Crawdge
Posté le 07-01-2010 à 16:07:14  profilanswer
 

exactement :)

n°1955869
stealth35
Posté le 07-01-2010 à 16:22:27  profilanswer
 

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
n°1955874
Crawdge
Posté le 07-01-2010 à 16:30:58  profilanswer
 

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

n°1956201
Crawdge
Posté le 08-01-2010 à 15:41:16  profilanswer
 

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 ! ;)

n°1956211
stealth35
Posté le 08-01-2010 à 16:13:44  profilanswer
 

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

n°1956876
Crawdge
Posté le 11-01-2010 à 15:49:10  profilanswer
 

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)
 
 

n°1956958
stealth35
Posté le 11-01-2010 à 18:31:01  profilanswer
 

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

n°1957068
Crawdge
Posté le 12-01-2010 à 08:25:33  profilanswer
 

Ok merci, c'est gentil :)

mood
Publicité
Posté le 12-01-2010 à 08:25:33  profilanswer
 

n°1957076
Crawdge
Posté le 12-01-2010 à 09:02:08  profilanswer
 

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]

n°1957190
stealth35
Posté le 12-01-2010 à 15:09:31  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [Resolu] Tableau nb cours par categorie (Moodle)

 

Sujets relatifs
[VBA] Collage Variable après copie de tableau de taille variableRecherche dans tableau et copie de lignes
[RESOLU] [MYSQL] Retrouver mot de passe d'un userTri de tableau
créer un tableau a partir d'une chaineChoisir entre une liste de variables ou un tableau
Comparer valeur impossible ! [Résolu]marquer comme selected une valeur dynamique [RESOLU]
[RESOLU] Probleme avec AJAX Star Rating sur IE 
Plus de sujets relatifs à : [Resolu] Tableau nb cours par categorie (Moodle)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR