Problème d'affichage dans une arborescence catégorie/cours
Visiteur
Boosteur Inactif
Je suis entrain d'améliorer l'arborescence pour un module mais je n'arrive pas à obtenir le résultat souhaité.
En fait, je voudrais afficher les différentes catégories avec les différents cours qui y sont associés.
Pour bien me faire comprendre, voici le résultat actuel :
http://www.style2kill.net/micronoob/cours/cours.php
Donc ici, on a ceci :
Racine
>test
>>cours 2 section test
>>cours 1 section test
>>cours 1 section suite test
>>cours 3 section suite test
>suite test
>>cours 2 section test
>>cours 1 section test
>>cours 1 section suite test
>>cours 3 section suite test
Et je souhaiterai avoir :
Racine
>test
>>cours 2 section test
>>cours 1 section test
>suite test
>>cours 1 section suite test
>>cours 3 section suite test
Je fais donc appel à votre aide.
Voici le code qui récupère les catégories et cours :
Code PHP :
if ($total_cat > 0) { $Template->assign_vars(array( 'C_COURS_CAT' => true, 'PAGINATION_CAT' => $Pagination->display('cours' . url('.php' . (!empty($unget) ? $unget . '&' : '?') . 'cat=' . $idartcat . '&pcat=%d', '-' . $idartcat . '-0+' . $rewrite_title . '.php?pcat=%d' . $unget), $total_cat , 'pcat', $CONFIG_COURS['nbr_cat_max'], 3), 'EDIT_CAT' => $is_admin ? '<a href="admin_cours_cat.php"><img class="valign_middle" src="../templates/' . get_utheme() . '/images/' . get_ulang() . '/edit.png" alt="" /></a>' : '' )); $max_cat = $Sql->query("SELECT MAX(id_left) FROM " . PREFIX . "cours_cats", __LINE__, __FILE__); $list_cats_js = ''; $array_js = ''; $i = 0; $result = $Sql->query_while("SELECT id, id_left, id_right, level, name, contents FROM " . PREFIX . "cours_cats ORDER BY id_left", __LINE__, __FILE__); while ($row = $Sql->fetch_assoc($result)) { //On assigne les variables pour le POST en précisant l'idurl. $Template->assign_block_vars('list', array( 'I' => $i, 'ID' => $row['id'], 'NAME' => $row['name'], 'DESC' => $row['contents'], 'INDENT' => ($row['level'] + 1) * 75, //Indentation des sous catégories. 'U_COURS_VARS' => url('.php?cat=' . $row['id'], '-' . $row['id'] . '+' . url_encode_rewrite($row['name']) . '.php') )); $idcatcours = $row['id']; $list_cats_js .= $row['id'] . ', '; $array_js .= 'array_cats[' . $row['id'] . '] = new Array();' . "n"; $array_js .= 'array_cats[' . $row['id'] . ']['id'] = ' . $row['id'] . ";n"; $array_js .= 'array_cats[' . $row['id'] . ']['id_left'] = ' . $row['id_left'] . ";n"; $array_js .= 'array_cats[' . $row['id'] . ']['id_right'] = ' . $row['id_right'] . ";n"; $array_js .= 'array_cats[' . $row['id'] . ']['i'] = ' . $i . ";n"; // Gestion des cours dans la liste des catégories // On compte le nombre de cours $nbr_cours_cat = $Sql->query("SELECT COUNT(*) FROM " . PREFIX . "cours WHERE visible = 1 AND idcat = '" . $idcatcours . "'", __LINE__, __FILE__); if($nbr_cours_cat > 0) { $result_cat = $Sql->query_while("SELECT id, idcat, title FROM " . PREFIX . "cours WHERE visible = 1 AND idcat = '" . $idcatcours . "' ORDER BY id", __LINE__, __FILE__); $j = 0; while ($row_cat = $Sql->fetch_assoc($result_cat)) { $Template->assign_block_vars('list_cat_cours', array( 'J' => $j, 'ID' => $row_cat['id'], 'NAME' => $row_cat['title'], 'U_COURS_VARS' => url('.php?id=' . $row_cat['id'] . '&cat=' . $row['id'], '-' . $row['id'] . '-' . $row_cat['id'] . '+' . url_encode_rewrite($row_cat['title']) . '.php') )); $j++; } } $i++; } $Sql->query_close($result); $Template->assign_vars(array( 'LIST_CATS' => trim($list_cats_js, ', '), 'ARRAY_JS' => $array_js, 'L_ROOT' => $LANG['root'], 'ID_END' => ($i - 1) )); }
Et voici le fichier cours_cat.tpl actuel :
Code HTML :
{JAVA}
<link href="{MODULE_DATA_PATH}/cours.css" rel="stylesheet" type="text/css" media="screen, handheld">
<script type="text/javascript">
<!--
function Confirm() {
return confirm("{L_CONFIRM_DEL_ENTRY}");
}
var list_cats = new Array({LIST_CATS});
var array_cats = new Array();
{ARRAY_JS}
function XMLHttpRequest_get_parent(divid, direction)
{
document.getElementById('l' + divid).innerHTML = '<img src="../templates/{THEME}/images/loading_mini.gif" alt="" class="valign_middle" />';
var xhr_object = xmlhttprequest_init('admin_xmlhttprequest.php?g_' + direction + '=' + divid);
xhr_object.onreadystatechange = function()
{
if( xhr_object.readyState == 4 && xhr_object.status == 200 && xhr_object.responseText != '' )
XMLHttpRequest_cours_cats_move(xhr_object.responseText, divid, direction);
else if( xhr_object.readyState == 4 && xhr_object.responseText == '' )
document.getElementById('l' + divid).innerHTML = '';
}
xmlhttprequest_sender(xhr_object, null);
}
function XMLHttpRequest_cours_cats_move(change_cat, divid, direction)
{
var xhr_object = xmlhttprequest_init('admin_xmlhttprequest.php?id=' + divid + '&move=' + direction);
xhr_object.onreadystatechange = function()
{
if( xhr_object.readyState == 4 && xhr_object.status == 200 && xhr_object.responseText != '' )
{
cours_cats_move(change_cat, divid, direction);
eval(xhr_object.responseText);
document.getElementById('l' + divid).innerHTML = '';
}
else if( xhr_object.readyState == 4 && xhr_object.responseText == '' )
document.getElementById('l' + divid).innerHTML = '';
}
xmlhttprequest_sender(xhr_object, null);
}
function cours_cats_move(change_cat, divid, direction)
{
var i;
var id_left = array_cats[divid]['id_left'];
var id_right = array_cats[divid]['id_right'];
var id = array_cats[divid]['i'];
var tmp_list_cats = list_cats;
var id_parent;
var pos_parent;
var parents_end = 0;
var check_change_cat = false;
var tmp;
if( change_cat.substring(0, 1) == 's' )
{
change_cat = change_cat.substring(1, change_cat.length);
check_change_cat = true;
}
id_parent = parseInt(change_cat);
pos_parent = array_cats[id_parent]['i'];
parents_end = pos_parent + ((array_cats[id_parent]['id_right'] - array_cats[id_parent]['id_left']) - 1)/2;
if( direction == 'up' )
{
if( !check_change_cat )
{
var parent_cats = new Array();
var parent_cats_id = new Array();
for(i = pos_parent; i <= parents_end; i++)
{
parent_cats.push(document.getElementById('c' + i).innerHTML);
parent_cats_id.push(list_cats[i]);
}
var child_cats = new Array();
var child_cats_id = new Array();
var child_end = id + (((id_right - id_left) - 1)/2);
for(i = id; i <= child_end; i++)
{
child_cats.push(document.getElementById('c' + i).innerHTML);
child_cats_id.push(list_cats[i]);
}
var z = 0;
var child_length = pos_parent + child_cats.length;
for(i = pos_parent; i < child_length; i++)
{
document.getElementById('c' + i).innerHTML = child_cats[z];
tmp_list_cats[i] = child_cats_id[z];
z++;
}
z = 0;
var parent_length = pos_parent + child_cats.length + parent_cats.length;
for(i = pos_parent + child_cats.length; i < parent_length; i++)
{
document.getElementById('c' + i).innerHTML = parent_cats[z];
tmp_list_cats[i] = parent_cats_id[z];
z++;
}
}
else
{
var parent_cats = new Array();
var child_cats = new Array();
var parent_end;
var nbr_child = (((id_right - id_left) - 1)/2);
var child_end = id + nbr_child;
for(i = pos_parent; i < id; i++)
parent_cats.push(document.getElementById('c' + i).innerHTML);
for(i = id; i <= child_end; i++)
child_cats.push(document.getElementById('c' + i).innerHTML);
var z = 0;
child_end = pos_parent + child_cats.length;
for(i = pos_parent; i < child_end; i++)
{
document.getElementById('c' + i).innerHTML = child_cats[z];
z++;
}
parent_end = pos_parent + child_cats.length + parent_cats.length;
var z = 0;
for(i = pos_parent + child_cats.length; i < parent_end; i++)
{
document.getElementById('c' + i).innerHTML = parent_cats[z];
z++;
}
}
}
else
{
if( !check_change_cat )
{
var parent_cats = new Array();
var parent_cats_id = new Array();
for(i = pos_parent; i <= parents_end; i++)
{
parent_cats.push(document.getElementById('c' + i).innerHTML);
parent_cats_id.push(list_cats[i]);
}
var child_cats = new Array();
var child_cats_id = new Array();
var child_end = id + ((id_right - id_left) - 1)/2;
for(i = id; i <= child_end; i++)
{
child_cats.push(document.getElementById('c' + i).innerHTML);
child_cats_id.push(list_cats[i]);
}
var z = 0;
var child_length = id + parent_cats.length + child_cats.length;
for(i = id + parent_cats.length; i < child_length; i++)
{
document.getElementById('c' + i).innerHTML = child_cats[z];
tmp_list_cats[i] = child_cats_id[z];
z++;
}
z = 0;
var parent_length = id + parent_cats.length;
for(i = id; i < parent_length; i++)
{
document.getElementById('c' + i).innerHTML = parent_cats[z];
tmp_list_cats[i] = parent_cats_id[z];
z++;
}
}
else
{
var parent_cats = new Array();
var child_cats = new Array();
var parent_end;
var nbr_child = (((id_right - id_left) - 1)/2);
for(i = id + nbr_child + 1; i <= pos_parent; i++)
parent_cats.push(document.getElementById('c' + i).innerHTML);
var child_end = id + nbr_child;
for(i = id; i <= child_end; i++)
child_cats.push(document.getElementById('c' + i).innerHTML);
var z = 0;
child_end = id + child_cats.length + parent_cats.length;
for(i = id + parent_cats.length; i < child_end; i++)
{
document.getElementById('c' + i).innerHTML = child_cats[z];
z++;
}
z = 0;
parent_end = id + parent_cats.length;
for(i = id; i < parent_end; i++)
{
document.getElementById('c' + i).innerHTML = parent_cats[z];
z++;
}
}
}
}
function Confirm() {
return confirm("{L_CONFIRM_DEL}");
}
-->
</script>
<div class="module_position">
<div class="module_top_l"></div>
<div class="module_top_r"></div>
<div class="module_top">
<a href="cours.php{SID}">{L_COURS_INDEX}</a> » {U_COURS_CAT_LINKS} {EDIT} {ADD_COURS}
</div>
<div class="module_contents">
# IF C_COURS_CAT #
<p style="text-align:center;" class="text_strong">{L_CATEGORIES} {EDIT_CAT}</p>
<hr style="margin-bottom:20px;" />
<div style="width:80%;margin:auto;">
<div>
<div class="row3 cours_cat_admin">
<span style="float:left;">
<img src="../cours/images/folder.png" alt="" style="vertical-align:middle" /> <a href="cours.php" class="cours_link_cat">{L_ROOT}</a>
</span>
<span style="float:right;">
</span>
</div>
</div>
# START list #
<span id="{list.I}">
<div style="margin-left:{list.INDENT}px;">
<div class="row3 cours_cat_admin">
<span style="float:left;">
<img src="../cours/images/folder.png" alt="" style="vertical-align:middle" /> {list.LOCK} <a href="cours{list.U_COURS_VARS}" class="cours_link_cat">{list.NAME}</a> <span class="text_small">{list.DESC}</span>
</span>
<span style="float:right;">
<span id="l{list.ID}"></span>
</span>
</div>
# START list_cat_cours #
<div style="margin-left:{list.INDENT}+10px;">
<div class="row3 cours_cat_admin">
<span style="float:left;">
<img src="../cours/images/folder.png" alt="" style="vertical-align:middle" />
<a href="cours{list_cat_cours.U_COURS_VARS}" class="cours_link_cat">{list_cat_cours.NAME}</a> <span class="text_small">{list.DESC}</span>
</span>
<span style="float:right;">
<span id="l{list.ID}"></span>
</span>
</div>
# END list_cat_cours #
</div>
</span>
# END list #
</div>
<div class="spacer"> </div>
<p style="text-align:center;">{PAGINATION_CAT}</p>
<hr />
# ENDIF #
# IF C_COURS_LINK #
<table class="module_table">
<tr>
<th style="text-align:center;">
<a href="cours{U_COURS_ALPHA_TOP}"><img src="../templates/{THEME}/images/top.png" alt="" class="valign_middle" /></a>
{L_COURS}
<a href="cours{U_COURS_ALPHA_BOTTOM}"><img src="../templates/{THEME}/images/bottom.png" alt="" class="valign_middle" /></a>
</th>
<th style="text-align:center;">
<a href="cours{U_COURS_DATE_TOP}"><img src="../templates/{THEME}/images/top.png" alt="" class="valign_middle" /></a>
{L_DATE}
<a href="cours{U_COURS_DATE_BOTTOM}"><img src="../templates/{THEME}/images/bottom.png" alt="" class="valign_middle" /></a>
</th>
<th style="text-align:center;">
<a href="cours{U_COURS_VIEW_TOP}"><img src="../templates/{THEME}/images/top.png" alt="" class="valign_middle" /></a>
{L_VIEW}
<a href="cours{U_COURS_VIEW_BOTTOM}"><img src="../templates/{THEME}/images/bottom.png" alt="" class="valign_middle" /></a>
</th>
<th style="text-align:center;">
<a href="cours{U_COURS_NOTE_TOP}"><img src="../templates/{THEME}/images/top.png" alt="" class="valign_middle" /></a>
{L_NOTE}
<a href="cours{U_COURS_NOTE_BOTTOM}"><img src="../templates/{THEME}/images/bottom.png" alt="" class="valign_middle" /></a>
</th>
<th style="text-align:center;">
<a href="cours{U_COURS_COM_TOP}"><img src="../templates/{THEME}/images/top.png" alt="" class="valign_middle" /></a>
{L_COM}
<a href="cours{U_COURS_COM_BOTTOM}"><img src="../templates/{THEME}/images/bottom.png" alt="" class="valign_middle" /></a>
</th>
</tr>
# START cours #
<tr>
<td class="row2" style="padding-left:25px">
{cours.ICON} <a href="cours{cours.U_COURS_LINK}">{cours.NAME}</a>
</td>
<td class="row2" style="text-align: center;">
{cours.DATE}
</td>
<td class="row2" style="text-align: center;">
{cours.COMPT}
</td>
<td class="row2" style="text-align: center;">
{cours.NOTE}
</td>
<td class="row2" style="text-align: center;">
{cours.COM}
</td>
</tr>
# END cours #
<tr>
<td colspan="6" class="row3">
{PAGINATION}
</td>
</tr>
</table>
# ENDIF #
<p style="text-align:center;padding-top:10px;" class="text_small">
{L_NO_COURS} {L_TOTAL_COURS}
</p>
</div>
<div class="module_bottom_l"></div>
<div class="module_bottom_r"></div>
<div class="module_bottom text_strong">
<a href="cours.php{SID}">{L_COURS_INDEX}</a> » {U_COURS_CAT_LINKS} {EDIT} {ADD_COURS}
</div>
</div>
Merci d'avance à tous ceux qui pourront m'aider.
Visiteur
Boosteur Inactif
alain91 Membre non connecté
Booster Missile
-
Booster Missile
- Voir le profil du membre alain91
- Inscrit le : 26/09/2010
- Groupes :
Je ne comprends pas la relation entre cours et catégories ? peut-on reformuler svp ?
Le pessimisme est d'humeur. L'optimisme est de volonté (Philosophe Alain).
Visiteur
Boosteur Inactif
En fait, c'est comme le module articles.
Tu peux créer des catégories d'articles et publier des articles dans ces différentes catégories.
Ici, c'est la même chose sauf que nous cherchons à afficher les catégories ET les cours sur la même page.
Il faudrait donc que les cours soient affichés SOUS leur catégorie respective.
Je ne sais pas si j'ai été plus clair.
giliam Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre giliam
- Inscrit le : 27/12/2008
Tu sélectionnes toutes les catégories.
Et tu joins à cette sélection les cours qui en font parti.
Tu fais ta boucle des catégories.
Là, il va y avoir un problème.
Tu afficheras plusieurs fois la même catégorie s'il y a plusieurs cours, avec chaque fois les données concernant les cours qui changent.
Ce que je fais dans ces cas-ci, à l'intérieur de ma boucle. Avant la boucle, j'initialise un tableau $donnees_tpl.
Ce code n'est pas forcément adapté à PBT.
Dans ma requête, je sélectionne l'ID de chaque catégorie et le CAT_ID par exemple de chaque cours.
Code PHP :
<?php $array_cours = array( 'cours_titre' => $data['cours_titre'], 'cours_id' => $data['cours_id'], ); $j = $i - 1; if( array_key_exists( $j, $donnees_tpl ) && $i > 0 && $donnees_tpl[$j]['cat_id'] == $data['cat_id'] ) { $donnees_tpl[$j]['cours'][] = $array_cours; } else { $array = array( 'titre' => $data['titre'], 'icone' => $data['icone'], //autres options des catégories.... //.... 'cours'=> array( $array_cours ), 'cat_id' => $data['cat_id'], ); //On met dans le tableau. $donnees_tpl[] = $array; $i++; } ?>
Je m'explique.
On met les donnees sur le cours de la catégorie qu'on est en train de parcourir dans un premier tableau.
La condition :
Si la case d'avant celle qu'on regarde existe.
Si le $i > 0, dans quel cas, $j = -1, impossible.
Et si, dans cette case d'avant, l'id de la catégorie est égal à celui de la case qu'on est en train de regarder, alors, j'ajoute les valeurs à mon second tableau, celui qui contient les données sur les cours.
Sinon, si cette condition n'est pas remplie, on met tout dans un tableau.
On s'entend qu'il y a minimum une partie pour chaque cours.

Sinon, il faut rajouter une petite condition.
À toi de l'adapter dans ton cas.
Chez moi, ça fonctionne.
Édité par giliam Le 03/02/2009 à 23h34
Visiteur
Boosteur Inactif
Tu pourrai me montrer ta requête stp.
Et au niveau du template, ça se passe comment ?
$donnees_tpl correspond à quoi ?
Édité par Visiteur Le 04/02/2009 à 09h19
giliam Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre giliam
- Inscrit le : 27/12/2008
Alors, je ne sais pas trop, il faut sûrement adapter le code.
Tu es obligé de faire des jointures, ça t'épargnera de multiples requêtes.
Au niveau du templates, j'utilise foreach ...
Mais il faut voir.
Je regarde.

Visiteur
Boosteur Inactif
Ne te triture pas le cerveau pour moi ^^.
giliam Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre giliam
- Inscrit le : 27/12/2008
Visiteur
Boosteur Inactif
Merci bien pour ton aide.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie