Create Dynamic Poll System With Animated Colors
[Edit] jQuery Dynamic Poll With Animated Colors [Edit] The JavaScript I will use the jQuery framework and 'backgroundColor.js' (remove it if you have the jQuery UI) Get Color For Percentagevar percentColors = [ { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } }, { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } }, { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } } ]; var getColorForPercentage = function (pct) { for (var i = 0; i < percentColors.length; i++) { if (pct <= percentColors[ i ].pct) { var lower = percentColors[i - 1] || { pct: 0.1, color: { r: 0x0, g: 0x00, b: 0 } }; var upper = percentColors[ i ]; var range = upper.pct - lower.pct; var rangePct = (pct - lower.pct) / range; var pctLower = 1 - rangePct; var pctUpper = rangePct; var color = { r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) }; return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; } } }This function take a percentage from 0 to 1 (0.10 = 10%, 0.05 = 5% etc) and return a color (0 = red | 1 = green | any percentage in between 0 and 1 wil take its color value between red and green) The jQuery$(document).ready(function ($) { // set the first colors $('div.polls').find('span.option').each(function () { $(this).css({ backgroundColor: getColorForPercentage($(this).attr('title') / 100) }); }); // the on click event $("div.polls > form > p").click(function () { var loader = $('<img src="lib/loading.gif" />'); var poll = $(this).parents("div.polls"); var form = $(this).parents("form"); var poll_id = poll.attr("id"); if (form.hasClass("closed")) { return false; } var option_id = $(this).find('input').val(); $(":radio", form).hide(); $("em", $(this)).html(loader).show(); form.addClass("closed"); //send the poll id and the selected option id $.post('vote.php', { poll: poll_id, option: option_id }, function (data) { $("img", form).remove(); //set the new options Percentages $.each(data.results, function (option, value) { $("p#option_" + option).find("span").show().css({ width: 0, opacity: 0 }).animate({ width: value + "%", backgroundColor: getColorForPercentage(value / 100), opacity: 1 }, "slow", "swing", function () { $("p#option_" + option).find("em").text(value + "%").fadeIn("slow"); }) }); }, "json"); return false; }); }); How the background Color work with .animate() ?as you know, .animate() function never work with the backgound-color, so we use extra code (backgroundColor.js) for this if you use jQuery only but if you have the UI you can use the code without backgroundColor.js[Edit] The PHP & MYSQL
index.php <?php $id = (isset($_GET['id'])) ? intval($_GET['id']) : 1; if(!$row = get_poll($id)){ exit('not found'); } ?> <div id="<?php echo $row['poll_id'];?>" class="polls"> <h2><?php echo $row['title'];?></h2> <form <?php if(get_votes($row['poll_id'])){ echo 'class="closed"';}?> method="post"> <?php foreach (poll_options($id) as $option) { ?> <p id="option_<?php echo $option['id'];?>"> <span class="option" style="width:<?php echo $option['percent'];?>%;" title="<?php echo $option['percent'];?>"></span> <input id="<?php echo $option['id'];?>" name="vote" value="<?php echo $option['id'];?>" type="radio" /> <label for="<?php echo $option['id'];?>"><?php echo $option['title'];?></label> <em><?php echo $option['percent'];?>%</em> </p> <?php } ?> </form> </div>vote.php (to record user's vote) if ( isset($_POST['poll']) and isset($_POST['option'])){ $poll_id = intval($_POST['poll']); $option_id = intval($_POST['option']); add_vote( $option_id,$poll_id ); setcookie('poll_'.$poll_id, 1, time() * (60 * 60 * 5),'/'); exit( json_encode(array('results' => results($poll_id))) ); } The functionsthis are the functions used in the codeget_poll()to get the poll rowfunction get_poll($id){ $query = mysql_query("SELECT * FROM `polls` WHERE `poll_id` = '$id'"); return mysql_fetch_array($query, MYSQL_ASSOC ); } poll_options()give all answers related to the poll with its percentagefunction poll_options($poll_id){ $query = mysql_query("SELECT x . * , z.rates FROM poll_options x LEFT JOIN (SELECT option_id, COUNT( id ) AS `rates` FROM poll_votes GROUP BY option_id) z ON x.id = z.option_id where x.poll_id = '$poll_id' ORDER BY x.id asc"); $total = total_votes($poll_id); while( $row = mysql_fetch_array( $query, MYSQL_ASSOC ) ){ $row['percent'] = @round((($row['rates'] / $total) * 100),1); $list[] = $row; } return $list; } results()to get just options id with its percentage related to the pollfunction results($poll_id){ foreach (poll_options($poll_id) as $value) { $list[$value['id']] = $value['percent']; } return $list; } total_votes()get the total votes for specific pollfunction total_votes($poll_id){ $query = mysql_query("SELECT sum(z.rates) as total FROM poll_options x JOIN (SELECT option_id, COUNT( id ) AS `rates` FROM poll_votes GROUP BY option_id) z ON x.id = z.option_id where x.poll_id = '$poll_id'"); $row = mysql_fetch_array( $query, MYSQL_ASSOC ); return $row['total']; } get_votes()check if the user voted or not, by check ip and cookiesfunction get_votes($poll_id){ $query = mysql_query("SELECT * FROM `poll_votes` where `poll_id` = '$poll_id' and `ip` = '{$_SERVER["REMOTE_ADDR"]}'"); $row = mysql_fetch_array( $query ); if($row or isset($_COOKIE['p_'.$poll_id])){ return $row; }else{ return false; } } add_vote()check if the user already voted or not and then insert or update user votefunction add_vote($option_id,$poll_id){ $row = get_votes($poll_id); if(!$row){ mysql_query("INSERT INTO `poll_votes` (`poll_id` ,`option_id` ,`ip`) VALUES ( '$poll_id','$option_id', '{$_SERVER["REMOTE_ADDR"]}')"); }else{ mysql_query("UPDATE `poll_votes` set `option_id` = '$option_id' where `id` = '{$row['id']}'"); } }
Don’t be Afraid to Ask for Help
It’s only human nature to want to hide the fact that we don’t know much about a certain topic. Nobody likes being a n00b! But how are we going to learn without asking? Feel free to use our problems section to ask more seasoned PHP developers questions.
|
© Advanced Web Core. All rights reserved