<?php
/*******************************************************************************
*
* [ ./includes/functions/fonctions_hierarchie.php (français) ]
*
* --------------------------------------------------------------------------
* Commencé le : 29 aoà»t 2004
* Copyright : Groupe Fire Soft Board
* Site Web : http://www.fire-soft-board.com
* E-mail : support@fire-soft-board.com
* --------------------------------------------------------------------------
* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les
* termes de la Licence Publique Générale GNU publiée par la Free Software Foundation
* (version 2). Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
* Vous devez avoir reçu une copie de la Licence Publique Générale GNU en même temps
* que ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, àtats-Unis.
* --------------------------------------------------------------------------
*
* Derniére modification le 11 février 2004 par Genova vRC3-00018
* Templates : 0
*
*******************************************************************************/
//
// La plupart des fonctions ci dessous utilisent un concept qui est la récurence. Ainsi on éxécutes
// la fonction en son sein même autant de fois qu'il faut. Par exemple dans le cadre des sous forums
// on fait une fonction qui liste les sous forums d'un forum, et dans cette fonction pour chaque forum
// listé on l'appelle affin de lister les sous forums des sous forums, etc...
// - Dark_Genova -
//
/************************************
* Cette fonction va afficher par récurence les différents forums et sous forums.
* - $arg_forum :: reçoit une catégorie au premier palier et un forum à partir des suivants
* - $sous_niveau :: définit le niveau de la hierarchie, PREMIER_PALIER corespondant à la racine
* - $prefixe_tpl :: définit un préfixe pour la boucle dans le template
* - $boucle_width :: par défaut vaut TRUE et prend en compte un espace de décalage entre les sous forums
************************************/
function afficher_forums_simple($arg_forum, $sous_niveau, $prefixe_tpl, $boucle_width = TRUE)
{
global $compte_forum, $droit_forum, $forum, $langue, $membre, $moderation, $theme, $tpl, $cookie_sujet, $temps_aujourdhui, $temps_hier;
$total_messages = 0;
$total_sujets = 0;
for ( $i = 0; $i < $compte_forum; $i++ )
{
if ( ( $forum[$i]['forum_lien_id'] == $arg_forum['forum_id'] && $sous_niveau > PREMIER_PALIER) || ( $sous_niveau == PREMIER_PALIER && $forum[$i]['cat_id'] == $arg_forum['cat_id'] && ! empty($arg_forum['cat_id']) ) )
{
$droits = droits($membre, $forum[$i], $moderation, $droit_forum);
if ( $droits['droit_voir'] )
{
$nb_donnees = compte_donnees_forum($forum[$i]['forum_id']);
$nb_message = $nb_donnees['nb_message'] + $forum[$i]['forum_nb_message'];
$nb_sujet = $nb_donnees['nb_sujet'] + $forum[$i]['forum_nb_sujet'];
$l_messages = '<span class="b">' . $nb_message . '</span> ' . $langue['message'] . ( $nb_message > 1 ? $langue['s'] : '' );
$l_sujets = '<span class="b">' . $nb_sujet . '</span> ' . $langue['sujet'] . ( $nb_sujet > 1 ? $langue['s'] : '' );
$t_forum_id = recuperer_hierarchie_id($forum[$i], (PREMIER_PALIER + 1), '', array(), TRUE);
$forum_status = LU;
if ( is_array($cookie_sujet) )
{
foreach ( $cookie_sujet AS $valeur )
{
if (in_array($valeur['forum_id'], $t_forum_id['t_ids']) && $valeur['dernier_message_temps'] > $valeur['dernier_message_lu'])
{
$forum_status = NON_LU;
break;
}
}
}
$last = get_last_data($t_forum_id['t_ids'], $forum[$i]);
// Gestion de la date du premier message !
if ( $temps_aujourdhui < $last['dernier_message_temps'] )
{
$date_msg = sprintf($langue['dernier_aujourdhui'], aff_date($last['dernier_message_temps'], 'G:i'));
}
elseif ( ( $temps_hier < $last['dernier_message_temps']) && ( $temps_aujourdhui > $last['dernier_message_temps'] ) )
{
$date_msg = sprintf($langue['dernier_hier'], aff_date($last['dernier_message_temps'], 'G:i'));
}
elseif ( $temps_hier > $last['dernier_message_temps'] )
{
$date_msg = aff_date($last['dernier_message_temps']);
}
$tpl->assign_block_vars($prefixe_tpl . 'forum', array(
'FORUM_NOM' => stripslashes($forum[$i]['forum_nom']),
'FORUM_DESCRIPTION' => stripslashes($forum[$i]['forum_description']),
'STATS' => $l_messages . '<br />' . $l_sujets,
'DATE_DERNIER_MESSAGE' => ( ! empty($last['dernier_message_temps']) ) ? $date_msg : '------',
'V_DERNIER_POSTEUR' => ( $last['dernier_posteur_id'] != '' && $last['dernier_posteur_login'] != '' ) ? ( $last['dernier_posteur_id'] != INVITE ? '<a href="' . ajout_sid('profil_public.php?id=' . $last['dernier_posteur_id']) . '">' . $dernier_posteur_login . '</a>' : $dernier_posteur_login ) . ' <a href="' . ajout_sid('sujet.php?message=' . $last['dernier_message_id']) . '#' . $last['dernier_message_id'] . '">' . sprintf($theme['img'], $racine . 'themes/' . $membre['membre_theme'] . 'images/lien' . ( $forum_status == NON_LU ? '_nouv' : '' ) . '_message.gif', '', '') . '</a>' : '------',
'IMG_STATUS' => ( $forum_status == LU ) ? sprintf($theme['img'], $racine . 'themes/' . $membre['membre_theme'] . 'images/type_message.gif', $langue['message_lu'], $langue['message_lu']) : sprintf($theme['img'], $racine . 'themes/' . $membre['membre_theme'] . 'images/type_nouveau_message.gif', $langue['message_non_lu'], $langue['message_non_lu']),
'U_FORUM' => ajout_sid('forum.php?forum=' . $forum[$i]['forum_id'])
));
afficher_forums_liens($forum[$i], $prefixe_tpl);
$total_messages += $nb_message;
$total_sujets += $nb_sujet;
}
}
}
return array('nb_message' => $total_messages, 'nb_sujet' => $total_sujets);
}
/************************************
* Cette fonction va afficher les liens des sous forums situés à un niveau au dessous
* du forum passé en argument.
* - $arg_forum :: reçoit un forum
* - $prefixe_tpl :: définit un préfixe pour la boucle dans le template
************************************/
function afficher_forums_liens($arg_forum, $prefixe_tpl)
{
global $compte_forum, $droit_forum, $forum, $langue, $membre, $moderation, $tpl;
for ( $f = 0; $f < $compte_forum; $f++ )
{
if ( $forum[$f]['forum_lien_id'] == $arg_forum['forum_id'] )
{
$droits = droits($membre, $forum[$i], $moderation, $droit_forum);
if ( $droits['droit_voir'] )
{
$tpl->assign_block_vars($prefixe_tpl . 'forum.sous_lien', array(
'L_SOUS_LIEN' => $forum[$f]['forum_nom'],
'U_SOUS_LIEN' => ajout_sid('forum.php?forum=' . $forum[$f]['forum_id'])
));
}
}
}
}
/************************************
* Créé une liste hierarchisée des forums et des catégories (contient deux fonctions)
* - $redirection :: créé ou non une redirection javascript en cas de clic sur une option
* - $categorie :: reçoit le tableau des catégories
* - $forum :: reçoit le tableau des forums
* - $liste_name :: nom de la liste
* - $v_selection :: valeur par défaut de la sélection
************************************/
function hierarchie_forums($redirection, $categorie, $forum, $liste_name, $v_selection, $cache_cat = true)
{
global $compte_forum, $droit_forum, $membre, $moderation, $racine;
$redirection_code = ( $redirection ) ? 'OnChange="if ( this.options[this.selectedIndex].value != 0 ) { redirection_forum(this.value); }"' : '';
$redirection_js = '<script language="javascript">
<!--
function redirection_forum(valeur)
{
if ( valeur != "" )
{
location.href="' . $racine . 'forum.php?forum=" + valeur;
}
}
-->
</script>';
$sous_niveau = 1;
$liste_forum = '<select name="' . $liste_name . '" class="listing" ' . $redirection_code . '>';
for ( $c = 0; $c < count($categorie); $c++ )
{
//
// On affiche la catégorie que si au moins
// un de ses forums est visible.
//
if ($cache_cat)
{
$cat_visible = FALSE;
for ( $i = 0; $i < $compte_forum; $i++ )
{
if ($forum[$i]['cat_id'] == $categorie[$c]['cat_id'])
{
$droits = droits($membre, $forum[$i], $moderation, $droit_forum);
if ($droits['droit_voir'])
{
$cat_visible = TRUE;
break;
}
}
}
}
else
{
$cat_visible = TRUE;
}
if ($cat_visible)
{
$selection = ( $v_selection == 'c-' . $categorie[$c]['cat_id'] ) ? 'selected="selected"' : '';
$liste_forum .= ( $c > 0 ) ? '<option value="0"></option>' : '';
$liste_forum .= '<option value="' . ( $redirection ? '0' : 'c-' . $categorie[$c]['cat_id'] ) . '" ' . $selection . '>' . $categorie[$c]['cat_nom'] . '</option>';
$liste_forum .= recurence_forums($categorie[$c], PREMIER_PALIER, $forum, $v_selection, $redirection);
}
}
$liste_forum .= '</select>';
return array('liste' => $liste_forum, 'code' => $redirection_js);
}
function recurence_forums($arg_forum, $sous_niveau, $forum, $v_selection, $redirection)
{
global $droit_forum, $membre, $moderation;
for ( $i = 0; $i < count($forum); $i++ )
{
if ( ( $sous_niveau == PREMIER_PALIER && $arg_forum['cat_id'] == $forum[$i]['cat_id'] ) || ( $sous_niveau > PREMIER_PALIER && $forum[$i]['forum_lien_id'] == $arg_forum['forum_id'] ) )
{
$droits = droits($membre, $forum[$i], $moderation, $droit_forum);
if ( $droits['droit_voir'] )
{
$forum_width = '';
for ( $j = 0; $j <= $sous_niveau; $j++ )
{
$forum_width .= ' ';
}
$forum_width .= '|- ';
$selection = ( $v_selection == 'f-' . $forum[$i]['forum_id'] ) ? 'selected="selected"' : '';
$liste_sous_forum .= '<option value="' . ( $redirection ? '' : 'f-' ) . $forum[$i]['forum_id'] . '" ' . $selection . '>' . $forum_width . $forum[$i]['forum_nom'] . '</option>';
$sous_niveau++;
$liste_sous_forum .= recurence_forums($forum[$i], $sous_niveau, $forum, $v_selection, $redirection);
$sous_niveau--;
}
}
}
return $liste_sous_forum;
}
/************************************
* Récupère le nombre de messages et de sujets d'un forum en comptant ceux de ses
* sous forums par récurence. Ne compte que les messages et sujets des sous forums,
* veillez donc à additioner ensuite avec ceux du forum courant.
* - $forum_id :: ID du forum père
************************************/
function compte_donnees_forum($forum_id)
{
global $compte_forum, $forum;
$t = array();
for ( $i = 0; $i < $compte_forum; $i++ )
{
if ( $forum_id == $forum[$i]['forum_lien_id'] )
{
$tmp = compte_donnees_forum($forum[$i]['forum_id']);
$t['nb_message'] += $tmp['nb_message'] + $forum[$i]['forum_nb_message'];
$t['nb_sujet'] += $tmp['nb_sujet'] + $forum[$i]['forum_nb_sujet'];
}
}
return array('nb_message' => $t['nb_message'], 'nb_sujet' => $t['nb_sujet']);
}
/************************************
* Permet de récupérer toutes les ID des sous ensembles d'un objet parent
* sous forme de liste et sous forme de tableau
************************************/
function recuperer_hierarchie_id($f, $position, $ids = '', $t_ids = array(), $forum_seul = FALSE)
{
global $compte_forum, $forum;
for ( $i = 0; $i < $compte_forum; $i++ )
{
if ( ( $position == PREMIER_PALIER && $f['cat_id'] == $forum[$i]['cat_id'] ) || ( $position > PREMIER_PALIER && $f['forum_id'] == $forum[$i]['forum_lien_id'] ) )
{
$position++;
$t = recuperer_hierarchie_id($forum[$i], $position, $ids, $t_ids);
$position--;
$ids = $t['ids'];
$t_ids = $t['t_ids'];
$t_ids[] = $forum[$i]['forum_id'];
$ids .= ( $ids == '' ) ? $forum[$i]['forum_id'] : ',' . $forum[$i]['forum_id'];
}
}
if ( $forum_seul )
{
$ids .= ( $ids == '' ) ? $f['forum_id'] : ',' . $f['forum_id'];
$t_ids[] = $f['forum_id'];
}
return array('ids' => $ids, 't_ids' => $t_ids);
}
/************************************
* Renvoie les données du dernier message posté (time, id, posteur_id et login) en
* cherchant aussi dans les sous forums.
************************************/
function get_last_data($id_list, $this_forum)
{
global $forum, $compte_forum;
$tmp_forum = $forum;
if (!function_exists('sort_forum_by_last_time'))
{
function sort_forum_by_last_time($a, $b)
{
return (($a['dernier_message_temps'] < $b['dernier_message_temps']) ? 1 : -1);
}
}
usort($tmp_forum, 'sort_forum_by_last_time');
for ($i = 0; $i < $compte_forum; $i++)
{
if (in_array($tmp_forum[$i]['forum_id'], $id_list))
{
return ($tmp_forum[$i]);
}
}
return ($this_forum);
}
?>