Vous voulez afficher sur votre site un des sondages présents sur votre forum CB et permettre à vos membres de voter depuis le site ?
Voici un module que je suis finalement arrivée à faire.
Installation du script
Prérequis : Vous devez d'abord avoir initialisé votre site pour qu'il utilise la base de données du forum avec les identifiants que vous utilisez pour le forum.
Pour en savoir plus :
http://www.connectix-boards.org/index.php?page=doc§=12
Ce module est à placer dans un bloc de votre menu vertical.
Mais tout d'abord, vous aurez trois constantes à renseigner dans le code qui sera donné plus bas :
CB_POLL : Ceci est l'id du sondage que vous voulez mettre. Pour connaître l'id, vous devrez chercher dans la table
cb_polls (remplacez cb_ par un autre préfixe si vous utilisez un préfixe différent) dans PhpMyAdmin.
CB_POLLBAR : Ceci est la largeur que vous voulez définir pour votre barre de vote. Ceci va en fonction de la largeur de votre menu. J'ai mis 60 par défaut pour aller avec le menu de mon site, mais vous pouvez modifier cette valeur.
CB_POLLBAR_IMG : Ceci est l'image pour votre barre de vote, de préférence une image qui se répète horizontalement. Le chemin doit être défini selon la page où votre sondage s'affiche.
Vous trouverez ces constantes au tout début du code que voici :
<div class="sous-menu">
<h3>Sondage</h3>
<?php
//On définit d'abord les constantes pour la suite du code
define('CB_POLL',5); //ID du sondage, vous pouvez changer cette valeur
define('CB_POLLBAR',60); //Longueur de la barre des votes
define('CB_POLLBAR_IMG','../styles/menubar_center.png'); //Image pour la barre de vote
//Maintenant, on vérifie si on a des nouveaux votes envoyés
//Vote blanc
if(isset($_POST['white']) && $_SESSION['cb_user']->logged)
{
$voted = $GLOBALS['cb_db']->single_result('SELECT poll_id, poll_voted FROM '.$GLOBALS['cb_db']->prefix.'polls WHERE poll_id='.CB_POLL.'');
if($voted !== false)
{
if(!in_array($_SESSION['cb_user']->userid,explode('/',$voted)))
{
$GLOBALS['cb_db']->query('UPDATE '.$GLOBALS['cb_db']->prefix.'polls SET poll_white=poll_white+1,poll_voted=CONCAT(poll_voted,\'/'.$_SESSION['cb_user']->userid.'\')
WHERE poll_id='.CB_POLL.'');
}
}
}
//Vote normal
elseif(isset($_POST['vote']))
{
if(isset($_POST['choice']) && $_SESSION['cb_user']->logged && is_numeric($_POST['choice']))
{
$voted = $GLOBALS['cb_db']->single_result('SELECT poll_id, poll_voted FROM '.$GLOBALS['cb_db']->prefix.'polls WHERE poll_id='.CB_POLL.'');
if($voted !== false)
{
if(!in_array($_SESSION['cb_user']->userid,explode('/',$voted)))
{
$GLOBALS['cb_db']->query('UPDATE '.$GLOBALS['cb_db']->prefix.'pollpossibilities SET poss_votes=poss_votes+1 WHERE poss_pollid='.CB_POLL.' AND poss_id='.(int)$_POST['choice']);
if($GLOBALS['cb_db']->affected_rows() > 0)
{
$GLOBALS['cb_db']->query('UPDATE '.$GLOBALS['cb_db']->prefix.'polls SET poll_voted=CONCAT(poll_voted,\'/'.$_SESSION['cb_user']->userid.'\'),poll_totalvotes=poll_totalvotes+1 WHERE poll_id='.CB_POLL.'');
}
else trigger_error('La proposition sélectionnée est erronée',E_USER_WARNING);
}
}
}
else trigger_error('La proposition sélectionnée est erronée',E_USER_WARNING);
}
//Maintenant, on est prêt à afficher le sondage.
//On commence par récupérer les informations
$return = $GLOBALS['cb_db']->query('SELECT poll_id, poll_question, poll_voted, poll_totalvotes, poll_white
FROM '.$GLOBALS['cb_db']->prefix.'polls
WHERE poll_id='.CB_POLL.'');
//Message d'erreur si le sondage n'existe pas
if(!$topic = $GLOBALS['cb_db']->fetch_assoc($return))
{
trigger_error('Le sondage que vous recherchez n\'existe pas. Éditez le fichier menu_fr.php pour modifier la constante CB_POLL pour choisir un nouveau sondage.',E_USER_ERROR);
}
?>
<h5><?php echo $topic['poll_question']; ?></h5>
<form action="" method="post">
<dl class="poll">
<?php
//Si le sondage existe on continue de traiter les données
if(!empty($topic['poll_id']))
{
$voted = ($_SESSION['cb_user']->logged) ? in_array($_SESSION['cb_user']->userid,explode('/',$topic['poll_voted'])) : false;
//Traitement des résultats du sondage
$rp = $GLOBALS['cb_db']->query('SELECT poss_name, poss_votes, poss_id
FROM '.$GLOBALS['cb_db']->prefix.'pollpossibilities
WHERE poss_pollid='.$topic['poll_id'].'
ORDER BY poss_id');
$results = array();
$num = 0;
$maxres = 0;
$max_bar_size = CB_POLLBAR;
while($poss = $GLOBALS['cb_db']->fetch_assoc($rp))
{
$percentage = ($topic['poll_totalvotes']>0) ? ($poss['poss_votes']/$topic['poll_totalvotes'])*100 :0;
$results[$num]['poss_id'] = $poss['poss_id'];
$results[$num]['poss_name'] = $poss['poss_name'];
$results[$num]['poss_votes'] = $poss['poss_votes'];
$results[$num]['poss_percentage'] = $percentage;
if ($percentage>$maxres)
{
$maxres=$percentage;
}
$num++;
}
//On fait un foreach pour le calcul du pourcentage de chaque option
foreach ($results as $key => $poss)
{
$results[$key]['poss_barwidth'] = ((($topic['poll_totalvotes']>0))?round($results[$key]['poss_percentage']*$max_bar_size/$maxres):0);
$results[$key]['poss_percentage'] = number_format($results[$key]['poss_percentage'],2);
}
//On fait un foreach pour permettre d'afficher les résultats ou les choix
foreach($results as $poll)
{
if(!$_SESSION['cb_user']->logged || $voted)
{
//L'utilisateur n'est pas connecté ou a déjà voté, donc on affiche les résultats
?>
<dt class="vote <?php echo $poll['poss_id']; ?>"><?php echo $poll['poss_name']; ?></dt>
<dd class="normal"><img src="<?php echo CB_POLLBAR_IMG; ?>" style="width: 2px; height: 12px;" alt="" /><img src="<?php echo CB_POLLBAR_IMG; ?>" style="width: <?php echo $poll['poss_barwidth']; ?>px; height: 12px;" alt="Barre des votes" /> <?php echo $poll['poss_votes']; ?> vote(s) (<?php echo $poll['poss_percentage']; ?>%)</dd>
<?php
}
else
{
//L'utilisateur est connecté mais n'a pas voté, donc on affiche les choix
?>
<dt class="vote-option"><label for="<?php echo $poll['poss_id']; ?>"><?php echo $poll['poss_name']; ?></label></dt><dd class="vote-choice"><input type="radio" id="<?php echo $poll['poss_id']; ?>" name="choice" value="<?php echo $poll['poss_id']; ?>" /></dd>
<?php
}
}
if(!$_SESSION['cb_user']->logged || $voted)
{
//Pour les invités et ceux qui ont voté, on finit avec les votes blancs
?>
<dt class="white-result">Votes blancs : </dt>
<dd class="nb-white"><?php echo $topic['poll_white']; ?></dd>
<?php
}
else
{
//Pour les membres n'ayant pas voté, on finit avec les boutons pour valider le vote
?>
<dt class="submit-vote"><input type="submit" name="vote" value="Voter" /></dt>
<dd class="submit-white"><input type="submit" name="white" value="Voter blanc" /></dd>
<?php
}
}
?>
</dl>
</form>
</div>
Vous pouvez adapter le code XHTML pour que la class du sous-menu et la balise de titre utilisée correspondent à votre site.
Et pour un meilleur rendu esthétique, utilisez ce bout de code CSS que vous pouvez adapter ensuite :
#menu dl
{
margin: 0px;
font-size: 0.75em;
text-align: left;
}
#menu dt, #menu dd
{
line-height: 22px;
}
#menu h5
{
padding: 2px;
text-align: center;
font-size: 0.75em;
}
dl.poll dt
{
font-weight: bold;
}
dl.poll dt.vote-option
{
width: 130px;
float: left;
}
dl.poll dt.submit-vote
{
float: left;
}
dl.poll dt.white-result
{
float: left;
}
Vous pouvez adapter le
font-size des éléments
dl et
h5, et le
width de l'élément
dl.poll dt.vote-option pour aller avec votre menu.
Voici une démo de ce que ça donne :

Merci à Martin pour son coup de main dans le déboguage du script