Connectix Boards

Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

Dernière version sortie: 0.8.4!
Venez tester la version 1.0 beta :)

Connectix Boards > Zone développement > Programmation > Addons et mods finalisés > [Release] Module "Sondage" sur votre site

RSS >  [Release] Module "Sondage" sur votre site
Ishimaru Chiaki #1 18/02/2009 - 19h13

Groupe : Doc-rédacteur
Messages : 800
Enregistré le : 12/03/2008

Hors ligne Site Web

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&sect=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" />&nbsp;<?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 :
Posted Image Posted Image

Merci à Martin pour son coup de main dans le déboguage du script :)
Besoin de volontaires pour les tests du support IPv6 dans la future version 0.8.5 !
Plus d'informations ici

Mon fil Twitter

 >  Réponse rapide

Composez votre message

Connectix Boards > Zone développement > Programmation > Addons et mods finalisés > [Release] Module "Sondage" sur votre site

 >  Informations du forum

1 personne(s) présente(s) durant une période de 15 minutes (0 membre(s) et 1 invité(s)).