Создание динамического голосования на jQuery и PHP

Вы можете получить супер крутой результат, когда комбинируете основы PHP и функциональность jQuery! В этом уроке мы будем создавать голосование на PHP и XHTML, применять некоторые эффекты jQuery Ajax, чтоб сымитировать перезагрузку страницы и конечно же добавим немного анимации.

demosourse

План реализации проекта:

  1. HTML
  2. PHP
    1. Introduction
    2. poll_default()
    3. poll_submit()
    4. poll_return_result()
    5. poll_ajax()
  3. CSS
  4. JavaScript
    1. Introduction
    2. formProcess()
    3. loadResults()
    4. animateResults()

HTML

Для начала, заполним раздел <head>:

<link href="style.css" rel="stylesheet" type="text/css" />
<script src="jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="jquery.cookie.js" type="text/javascript" charset="utf-8"></script>
<script src="poll.js" type="text/javascript" charset="utf-8"></script>
  • style.css - будет содержать в себе все необходимые стили
  • jquery.js - сама библиотека jQuery
  • jquery.cookie.js - плагин, созданный Клаусом Хартлом, для управления Cookies через jQuery
  • poll.js - тут будет размещен скрипт, обеспечивающий динамичность голосования

Следующий шаг это создания формы для нашего голосования:

<div id="poll-container">
<h3>Голосование</h3>
<form id='poll' action="poll.php" method="post" accept-charset="utf-8">
<p>Голосуйте за ваш любимый Javascript framework:</p>
<p><input type="radio" name="poll" value="opt1" id="opt1" /><label for='opt1'> jQuery</label><br />
<input type="radio" name="poll" value="opt2" id="opt2" /><label for='opt2'> Ext JS</label><br />
<input type="radio" name="poll" value="opt3" id="opt3" /><label for='opt3'> Dojo</label><br />
<input type="radio" name="poll" value="opt4" id="opt4" /><label for='opt4'> Prototype</label><br />
<input type="radio" name="poll" value="opt5" id="opt5" /><label for='opt5'> YUI</label><br />
<input type="radio" name="poll" value="opt6" id="opt6" /><label for='opt6'> mootools</label><br /><br />
<input type="submit" value="Голосовать →" /></p>
</form>
</div>

Данная форма будет обрабатываться средствами php и сейчас и когда мы добавим функциональность jQuery. С помощью PHP и JavaScript мы будем доставать значение атрибута value тега input через определённые id. &nbps; это HTML сущность которая представляет собой пробел; &rarr; это стрелка →.

PHP

Вступление

Если JavaScript выключен PHP скрипт будет работать по следующей схеме:

  1. Получает GET/POST запрос из формы;
  2. Задаёт/Изымает значение Cookie;
  3. Производит проверку ip для устранения множественного голосования;
  4. Сохраняет голос в FlatFile db;
  5. Возвращает результат, включенный в HTML файл;

В случае, если JavaScript включён PHP будет действовать так:

  1. Получать GET/POST запрос от JavaScript;
  2. Производит проверку ip для устранения множественного голосования;
  3. Сохраняет голос в FlatFile db;
  4. Возвращать результат в формате JSON

Для работы с текстовыми файлами мы будем использовать PHP FlatFile Package (автор Luke Plant).

Для начала нам необходимо создать массив, который будет содержать название и id, опций голосования:

<?php
$options[1] = 'jQuery';
$options[2] = 'Ext JS';
$options[3] = 'Dojo';
$options[4] = 'Prototype';
$options[5] = 'YUI';
$options[6] = 'mootools';

Пакет FlatFile использует числа для идентификации колонок, поэтому нам необходимо определить некоторые константы, чтоб по значению номеров, получать имена:

define('OPT_ID', 0);
define('OPT_TITLE', 1);
define('OPT_VOTES', 2);

Когда форма будет заполнена и отправлена на обработку, PHP необходимо знать в какой файл записывать результат и соответственно возвращать. Поэтому нам необходимо создать ещё одну константу.

define('HTML_FILE', 'index.html');

Далее нам необходимо присоединить flatfile.php и инициализировать объект базы данных:

require_once('flatfile.php');
$db = new Flatfile();

FlatFile представляет из себя обычный текстовой документ, расположенный в каталоге data:

$db->datadir = 'data/';  
define('VOTE_DB', 'votes.txt');  
define('IP_DB', 'ips.txt');

Если в GET/POST запросе присутствует параметр poll, это значит, что у пользователя отключён JavaScript и мы будем обрабатывать данные традиционным PHP способом. Если в GET/POST запросе присутствует параметр vote, это значит, что к нам идёт AJAX запрос. В любом другом случае мы просто возвращаем HTML_FILE:

if ($_GET['poll'] || $_POST['poll']) {  
  poll_submit();  
}  
else if ($_GET['vote'] || $_POST['vote']) {  
  poll_ajax();  
}  
else {  
  poll_default();  
}

poll_default()

function poll_default() {  
  global $db;  
  
  $ip_result = $db->selectUnique(IP_DB, 0, $_SERVER['REMOTE_ADDR']);  
  
  if (!isset($_COOKIE['vote_id']) && empty($ip_result)) {  
    print file_get_contents(HTML_FILE);  
  }  
  else {  
    poll_return_results($_COOKIE['vote_id']);  
  }  
}

poll_default() напрямую обрабатывает запрос, в случае если GET/POST запросы не валидны.

Ключевое слово global делает объект $db доступным в пределах области видимости функции.

Скрипт должен проверять IP на уникальность, чтобы исключить множественное голосование. Для этого нам необходимо сделать запрос в наш текстовой файл, чтоб узнать, присутствует ли данный IP в списке.

$ip_result = $db->selectUnique(IP_DB, 0, $_SERVER['REMOTE_ADDR']);

Если Cookie отсутсвуют и ответ на запрос об IP пришёл пустой, это значит что данный пользователь ещё не голосовал поэтому мы ему отобразим HTML файл с формой. В противном случае, мы ему покажем результат:

if (!isset($_COOKIE['vote_id']) && empty($ip_result)) {  
  print file_get_contents(HTML_FILE);  
}  
else {  
  poll_return_results($_COOKIE['vote_id']);  
}

poll_submit()

function poll_submit() {  
  global $db;  
  global $options;  
  
  $id = $_GET['vote'];
  $id = str_replace("opt", '', $id);  
  
  $ip_result = $db->selectUnique(IP_DB, 0, $_SERVER['REMOTE_ADDR']);  
  
  if (!isset($_COOKIE['vote_id']) && empty($ip_result)) {  
    $row = $db->selectUnique(VOTE_DB, OPT_ID, $id);  
    if (!empty($row)) {  
      $ip[0] = $_SERVER['REMOTE_ADDR'];  
      $db->insert(IP_DB, $ip);  
  
      setcookie("vote_id", $id, time()+31556926);  
  
      $new_votes = $row[OPT_VOTES]+1;  
      $db->updateSetWhere(VOTE_DB, array(OPT_VOTES => $new_votes), new SimpleWhereClause(OPT_ID, '=', $id));  
  
      poll_return_results($id);  
    }  
    else if ($options[$id]) {  
      $ip[0] = $_SERVER['REMOTE_ADDR'];  
      $db->insert(IP_DB, $ip);  
  
      setcookie("vote_id", $id, time()+31556926);  
  
      $new_row[OPT_ID] = $id;  
      $new_row[OPT_TITLE] = $options[$id];  
      $new_row[OPT_VOTES] = 1;  
      $db->insert(VOTE_DB, $new_row);  
  
      poll_return_results($id);  
    }  
  }  
  else {  
    poll_return_results($id);  
  }  
}

poll_submit() принимает данные от формы, проверяет, голосовал ли пользователь, а потом обновляет БД, добавляя голос.

Этот фрагмент кода изымает значение опции ID варианта голосования и преобразовывает его в чистое значение без текста:

$id = $_GET['poll'] || $_POST['poll'];  
$id = str_replace("opt", '', $id);

Так же нам надо проверить есть ли такая опция в нашей базе (id варианта)

$row = $db->selectUnique(VOTE_DB, OPT_ID, $id);

Если такой вариант в базе присутствует (ответ не пустой), нам необходимо запустить функцию updateSetWhere(). Если нет, нам нужно её вставить - insert():

if (!empty($row)) {  
  $new_votes = $row[OPT_VOTES]+1;  
  $db->updateSetWhere(VOTE_DB, array(OPT_VOTES => $new_votes), new SimpleWhereClause(OPT_ID, '=', $id));  
  
  poll_return_results($id);  
}  
else if ($options[$id]) {  
  $new_row[OPT_ID] = $id;  
  $new_row[OPT_TITLE] = $options[$id];  
  $new_row[OPT_VOTES] = 1;  
  $db->insert(VOTE_DB, $new_row);  
  
  poll_return_results($id);  
}

Тем же путём нам необходимо вставить в базу IP пользователя и установить Сookie сроком на 1 год:

$ip[0] = $_SERVER['REMOTE_ADDR'];  
$db->insert(IP_DB, $ip);  
  
setcookie("vote_id", $id, time()+31556926);

poll_return_results()

function poll_return_results($id = NULL) {  
    global $db;  
  
    $html = file_get_contents(HTML_FILE);  
    $results_html = "<div id='poll-container'><div id='poll-results'><h3>Poll Results</h3>\n<dl class='graph'>\n";
  
    $rows = $db->selectWhere(VOTE_DB,  
      new SimpleWhereClause(OPT_ID, "!=", 0), -1,  
      new OrderBy(OPT_VOTES, DESCENDING, INTEGER_COMPARISON));  
  
    foreach ($rows as $row) {  
      $total_votes = $row[OPT_VOTES]+$total_votes;  
    }  
  
    foreach ($rows as $row) {  
      $percent = round(($row[OPT_VOTES]/$total_votes)*100);  
      if (!$row[OPT_ID] == $id) {  
        $results_html .= "<dt class='bar-title'>". $row[OPT_TITLE] ."</dt><dd class='bar-container'><div id='bar". $row[OPT_ID] ."'style='width:$percent%;'> </div><strong>$percent%</strong></dd>\n";  
      }  
      else {  
        $results_html .= "<dt class='bar-title'>". $row[OPT_TITLE] ."</dt><dd class='bar-container'><div id='bar". $row[OPT_ID] ."' style='width:$percent%;background-color:#0066cc;'> </div><strong>$percent%</strong></dd>\n";  
      }  
    }  
  
    $results_html .= "</dl><p>Total Votes: ". $total_votes ."</p></div></div>\n";  
  
    $results_regex = '/<div id="poll-container">(.*?)<\/div>/s';  
    $return_html = preg_replace($results_regex, $results_html, $html);  
    print $return_html;  
}

poll_return_results() генерирует результаты опроса, записывая их в HTML файл вместо формы и возвращает пользователю.

В первую очередь давайте присвоим HTML переменной $html:

$html = file_get_contents(HTML_FILE);

Следующим файлом наклипаем начальную структуру html:

$results_html = "<div id='poll-container'><div id='poll-results'><h3>Poll Results</h3>\n<dl class='graph'>\n";

Чтобы сформировать результаты опроса необходимо выбрать все строки (варианты) из БД отсортированные по количеству голосов.

$rows = $db->selectWhere(VOTE_DB,  
  new SimpleWhereClause(OPT_ID, "!=", 0), -1,  
  new OrderBy(OPT_VOTES, DESCENDING, INTEGER_COMPARISON));

Нам так же необходимо общее количество голосов для вычисления процентов:

foreach ($rows as $row) {  
  $total_votes = $row[OPT_VOTES]+$total_votes;  
}

Следующим шагом вычисляем процентаж каждой опции голосования:

foreach ($rows as $row) {  
  $percent = round(($row[OPT_VOTES]/$total_votes)*100);

HTML в который буду записаны результаты состоит из списка (dl), стилизованного посредством CSS для создания графика.

$results_html .= "<dt class='bar-title'>". $row[OPT_TITLE] ."</dt><dd class='bar-container'><div id='bar". $row[OPT_ID] ."'style='width:$percent%;'> </div><strong>$percent%</strong></dd>\n";

Так же при переборе мы должны изменить цвет той опции за которую голосовал пользователь:

if (!$row[OPT_ID] == $id) {  
  
}  
else {  
  $results_html .= "<dt class='bar-title'>". $row[OPT_TITLE] ."</dt><dd class='bar-container'><div id='bar". $row[OPT_ID] ."' style='width:$percent%;background-color:#0066cc;'> </div><strong>$percent%</strong></dd>\n";  
}

Тут мы выводим общее число голосов и закрываем наш HTML:

$results_html .= "</dl><p>Total Votes: ". $total_votes ."</p></div></div>\n";

А вот это регулярное выражение, которое находит

с id poll-container:

 

$results_regex = '/<div id="poll-container">(.*?)<\/div>/s';

В этой функции нам осталось заменить HTML самого опроса, на HTML результатов с помощью регулярного выражения:

$return_html = preg_replace($results_regex, $results_html, $html);  
print $return_html;

poll_ajax()

function poll_ajax() {  
  global $db;  
  global $options;  
  
  $id = $_GET['vote'] || $_POST['vote'];  
  
  $ip_result = $db->selectUnique(IP_DB, 0, $_SERVER['REMOTE_ADDR']);  
  
  if (empty($ip_result)) {  
    $ip[0] = $_SERVER['REMOTE_ADDR'];  
    $db->insert(IP_DB, $ip);  
  
    if ($id != 'none') {  
      $row = $db->selectUnique(VOTE_DB, OPT_ID, $id);  
      if (!empty($row)) {  
        $new_votes = $row[OPT_VOTES]+1;  
  
        $db->updateSetWhere(VOTE_DB, array(OPT_VOTES => $new_votes), new SimpleWhereClause(OPT_ID, '=', $id));  
      }  
      else if ($options[$id]) {  
        $new_row[OPT_ID] = $id;  
        $new_row[OPT_TITLE] = $options[$id];  
        $new_row[OPT_VOTES] = 1;  
        $db->insert(VOTE_DB, $new_row);  
      }  
    }  
  }  
  
  $rows = $db->selectWhere(VOTE_DB, new SimpleWhereClause(OPT_ID, "!=", 0), -1, new OrderBy(OPT_VOTES, DESCENDING, INTEGER_COMPARISON));  
  print json_encode($rows);  
}

poll_ajax() принимает запрос от JavaScript, добавляет голоса в БД и возвращает результат в формате JSON.

В этом коде по сравнению с poll_submit() присутствуют некоторые изменения. Первое это проверка на то, что JavaScript делает запрос за результатами и в этом случае голоса не подсчитываются:

if ($id != 'none')

Следующие строки кода извлекают всю инфу из БД и возвращают её в формате JSON:

$rows = $db->selectWhere(VOTE_DB, new SimpleWhereClause(OPT_ID, "!=", 0), -1, new OrderBy(OPT_VOTES, DESCENDING, INTEGER_COMPARISON));  
print json_encode($rows);

CSS

.graph {  
  width: 250px;  
  position: relative;  
  rightright: 30px;  
}  
.bar-title {  
  position: relative;  
  float: left;  
  width: 104px;  
  line-height: 20px;  
  margin-right: 17px;  
  font-weight: bold;  
  text-align: rightright;  
}  
.bar-container {  
  position: relative;  
  float: left;  
  width: 110px;  
  height: 10px;  
  margin: 0px 0px 15px;  
}  
  
.bar-container div {  
  background-color:#cc4400;  
  height: 20px;  
}  
.bar-container strong {  
  position: absolute;  
  rightright: -32px;  
  top: 0px;  
  overflow: hidden;  
}  
#poll-results p {  
  text-align: center;  
}

CSS стилизует результаты, возвращённые PHP или JavaScript-ом:

  • .graph стилизует контейнер для прямоугольников, заголовков и процентов. Опция width будет различной для разных сайтов;
  • .bar-title заголовок для прямоугольного графика;
  • .bar-container оформляет индивидуальный прямоугольник и контейнер процентов;
  • .bar-container div оформляет див, в котором содержится контент. Значение width задаётся из PHP или Javascript;
  • .bar-container strong оформляет процентные данные;
  • #poll-results p оформляет общее число голосов;

Javascript

Вступление

JavaScript будет использоваться для отправки информации из формы, для отправления нового голоса через AJAX запрос и анимирования результатов.

Для начала создадим некоторые глобальные переменные. Первые три такие же какие у нас были в PHP. В votedID будет храниться id опции которую выбрал пользователь.

var OPT_ID = 0;  
var OPT_TITLE = 1;  
var OPT_VOTES = 2;

var votedID;

Теперь нужно заставить код запуститься после загрузки страницы:

$(document).ready(function(){
Внутри данной функции мы устанавливаем обработчик для кнопки, на которую пользователи буду нажимать, чтоб проголосовать. Когда кнопка будет нажата в бой вступит функция formProcess:
$("#poll").submit(formProcess);

Так же нам надо проверить какие данные сейчас отображеные на странице. Если это не сама форма голосования, то нам необходимо анимировать результаты:

if ($("#poll-results").length > 0 ) {  
    animateResults();  
}

Если Cookie существуют, то мы должны отобразить результаты, т.к. пользователь уже голосовал. Для этого нам необходимо извлечь значение из Cookie и результаты средсвом PHP. Следующий шаг отправка извлечённых данные в функцию loadResults():

if ($.cookie('vote_id'))  
    $("#poll-container").empty();  
    votedID = $.cookie('vote_id');  
    $.getJSON("poll.php?vote=none",loadResults);  
}

formProcess()

function formProcess(event){  
  event.preventDefault();  
  
  var id = $("input[@name='poll']:checked").attr("value");  
  id = id.replace("opt",'');  
  
  $("#poll-container").fadeOut("slow",function(){  
    $(this).empty();  
  
    votedID = id;  
    $.getJSON("poll.php?vote="+id,loadResults);  
  
    $.cookie('vote_id', id, {expires: 365});  
    });  
}

formProcess() вызывается, когда форма заполнена. Это позволяет определить каким способом была отправлена форма: PHP или JavaScript. Далее происходит проверка/установка Сookies, запускается Ajax извлечение данных для преобразования результатов в HTML.

Для начала нам необходимо предотвратить отправку формы по умолчанию: event.preventDefault();

Далее мы извлекаем ID выбранной опции:

var id = $("input[@name='poll']:checked").attr("value");  
id = id.replace("opt",'');

input[@name='poll']:checked это селектор jQuery который выбирает <input> у которого есть атрибут name равный значению 'poll', причём данный элемент должен быть выбран. attr("value") извлекает значение объекта, который в нашем случае является optn, где n это ID опции.

Теперь, когда у нас есть ID, мы можем его обработать. Для этого мы скроем форму голосования, и настроем анонимную функцию для возврата ответа, которая запустится, когда форма голосования исчезнет полностью.

$("#poll-container").fadeOut("slow",function(){

После того как форма исчезнет, мы её удалим из DOM с помощью empty():

$(this).empty();

В данном случае $(this) это специальная переменная, которая представляет собой объект, который изчезал со страницы (в нашем случае форма).

В jQuery так же присутствует немало специальных функций, таких к примеру как $.getJSON(), которая принимает GET запрос от JSON объекта. Когда у нас будет объект мы вызываем функцию loadResults():

$.getJSON("poll.php?vote="+id,loadResults);

Нам осталось только записать значение в Cookie:

$.cookie('vote_id', id, {expires: 365});

loadResults()

function loadResults(data) {  
  var total_votes = 0;  
  var percent;  
  
  for (id in data) {  
    total_votes = total_votes+parseInt(data[id][OPT_VOTES]);  
  }  
  
  var results_html = "<div id='poll-results'><h3>Poll Results</h3>\n<dl class='graph'>\n";  
  for (id in data) {  
    percent = Math.round((parseInt(data[id][OPT_VOTES])/parseInt(total_votes))*100);  
    if (data[id][OPT_ID] !== votedID) {  
      results_html = results_html+"<dt class='bar-title'>"+data[id][OPT_TITLE]+"</dt><dd class='bar-container'><div id='bar"+data[id][OPT_ID]+"'style='width:0%;'> </div><strong>"+percent+"%</strong></dd>\n";  
    } else {  
      results_html = results_html+"<dt class='bar-title'>"+data[id][OPT_TITLE]+"</dt><dd class='bar-container'><div id='bar"+data[id][OPT_ID]+"'style='width:0%;background-color:#0066cc;'> </div><strong>"+percent+"%</strong></dd>\n";  
    }  
  }  
  
  results_html = results_html+"</dl><p>Total Votes: "+total_votes+"</p></div>\n";  
  
  $("#poll-container").append(results_html).fadeIn("slow",function(){  
    animateResults();});  
}

loadResults() вызывается из $.getJSON() и возвращает JSON объект, в котором содержутся данные из БД. Эта функция работает практически так же как poll_return_results(). Первое отличие в том, что мы устанавливаем width прямоугольников в 0% потому как собираемся их анимировать. Другое отличие в том, что мы используем функцию jQuery append() вместо регулярных выражений для вывода результата. После того, как результаты появятся на странице мы вызываем функцию animateResults().

animateResults()

function animateResults(){  
  $("#poll-results div").each(function(){  
      var percentage = $(this).next().text();  
      $(this).css({width: "0%"}).animate({  
                width: percentage}, 'slow');  
  });  
}

animateResults() последовательно проходит по всем прямоугольниками и анимирует изменение ширины (width).
each() это функция jQuery которая последовательно проходит по всем элементам попадающим под селектор:

$("#poll-results div").each(function(){

Для начала мы зададим значения тексту, который находится после прямоугольника заключённого в тег <strong>, содержащий проценты.

var percentage = $(this).next().text();

Затем мы выставляем значение 0% для width и запускаем анимацию:

$(this).css({width: "0%"}).animate({  
  width: percentage}, 'slow');

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.net.tutsplus.com/tutorials/javascript-ajax/creating-a-dynamic-poll-with-jquery-and-php/
Перевел: Станислав Протасевич
Урок создан: 8 Января 2011
Просмотров: 60654
Правила перепечатки


5 последних уроков рубрики "jQuery"

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 8 Января 2011 22:24
    truehazard
    о новые автора )) что я не понял а как добавить другие варианты ответа ??) и почему нельзя было использовать сразу базу данных ??
    • 5 Августа 2011 09:04
      Avaz
      klassna
  • 8 Января 2011 22:29
    valeros
    Глобальные переменные...
  • 9 Января 2011 00:12
    truehazard
    помогите кто знает зачем на некоторых сайтах при подключении скрипта пишут scripts/ajax.js?1966 зачем и так же видел на стилях типо - style/css.css?4354 ????
    • 9 Января 2011 01:09
      notbot
      Передают аргумент
      • 10 Января 2011 19:50
        budzin
        А поподробнее! Мне тоже интересно!
        • 15 Января 2011 14:25
          notbot
          medved.php?preved и в $_GET появляется пустой preved ($_GET['preved']). Хотя скорее всего это сделано для отключения кэширования.
    • 9 Января 2011 01:46
      Evgenics
      Скорее всего в исходнике так:
      <link rel="stylesheet" href="css/style.css?<?php echo filemtime('css/style.css')?>" type="text/css" media="screen, projection" />
      Делается для того, чтобы когда файл стилей или js обновится, браузер не тащил старый файл из кеша. filemtime вернет unix-time последнего изменения файла, как только файл обновится обновится и время, соответственно для браузера это будет уже новый файл. Хотя могут и просто аргумент передать. В js/css тоже можно выполнить php-код ;)
      • 9 Января 2011 12:54
        truehazard
        спасибо за ответ)
  • 9 Января 2011 00:59
    petrik86
    Это ужас. На файлах опрос. Есть же точно такой скрипт, но с БД.
    • 10 Января 2011 09:28
      Альбертович
      на каких файлах????
      • 10 Января 2011 21:40
        petrik86
        Текстовых. Т.е вся инфа храниться в файлах!
        • 14 Ноября 2011 21:46
          Login99
          petrik86
          Чем тебе ненравится то что все на файлах? Зачем тебе база данных? Чем проще тем лучше, MyQSL лесом. Можешьпросто в папку date положить
          htacess
          напиши внутри deny from all и всё,. Никто неувидит твоих данных что там хранятся.
    • 10 Января 2011 16:41
      russmike
      Подскажите адрес точно такого скрипта, но с базой данных.
  • 9 Января 2011 13:27
    turin
    Сделайте уже урок по Smarty и на его основе выводите html из php...
    • 9 Января 2011 15:01
      budzin
      Smarty уже не актуален!
      • 9 Января 2011 23:29
        PROGRAMMATOR
        И что актуально?
        • 10 Января 2011 19:42
          budzin
          Ну например:
          function load_view($filename, $data){
          extract($data);
          include($filename . ".php");
          }
          $data = array(
          "title" => "Моя страница",
          "content" => "Мое содержание страницы :)"
          );
          load_view('page',$data);
          
          Это гораздо быстрее, чем эти парсеры.
        • 10 Января 2011 19:43
          budzin
          Примерно как у framework'а CodeIgniter, т.е. отделяем логику от представления!
      • 11 Января 2011 13:32
        turin
        возможно и не актуален, но удобен и прост, и иногда проще не выдумывать велосипед, а взять уже готовый. Если не смарти, то любой другой, но хтмл код в php просто глажа режет
        • 11 Января 2011 18:07
          budzin
          Возни больше! А сам то ты сто пудов не пробывал данный способ! Он намного легче!
          • 11 Января 2011 21:31
            Evgenics
            согласен на 100% с budzin. Делаю аналогично.
            • 12 Января 2011 08:01
              budzin
              Вооо! Красаувец :)
        • 11 Января 2011 18:29
          budzin
          Насчет удобства я могу с тобой поспорить, но не буду. Если бы я сам не пробовал, то не говорил бы.
        • 11 Января 2011 19:08
          budzin
          Если хочешь могу пример написать для тебя!
          • 30 Января 2011 21:44
            turin
            я пробовал различные способы отображения шаблонов. и на данный момент работая web-мастером, приходится обслуживать различные, в том числе и "самописные" движки. и могу честно сказать, что Гораздо удобнее полностью отделить мух от котлет, и делать всё едино-шаблонно. приближая к стандарту, а то при появлении "гениев", потом хтмл код приходится из пхп вытаскивать и выискивать. да и использование своих систем усложняет работу тем, что каждого нового члена команды необходимо обучить. Лично я у себя на данный момент предпочитаю использовать Smarty, обращение к которому осуществляется через статический класс.
            • 31 Января 2011 20:05
              budzin
              О вкусах не спорят! Каждому свое. Можете кстати попробовать мой вариант! Может он тебе больше понравиться. Если, что могу для тебя написать пример :)
              • 1 Февраля 2011 21:05
                turin
                Спасибо :) но придётся отказаться, пока работаю в этой фирме, надо делать всё единообразно... а в других фирмах - другие правила :)
  • 11 Января 2011 15:21
    samb100
    подскажите, где есть точно такой же скрипт, но с БД ???
    • 12 Января 2011 08:04
      budzin
      У меня на компе где-то лежит простой класс для работы с БД. Можешь погуглить :) вот пример http://www.forum.dklab.ru/viewtopic.php?t=15824
    • 12 Января 2011 08:07
      budzin
      Можешь по сути сам написать!
    • 12 Января 2011 09:11
      budzin
      Вот еще можешь почитать http://phpprogs.ru/article/mysql-sozdanie-klassa-na-php-dlya-raboty-s-mysql
  • 12 Января 2011 07:08
    samb100
    а где можно почитать на этом сайте скрипт на БД ?
  • 14 Января 2011 03:45
    smalls
    Я поддержу автора данной статьи думаю он молодец потомучто не у всех есть хостинг который поддерживает mysql в таком случае этот вариант будет как раз.
  • 14 Января 2011 22:15
    VALERI
    YO! Это пипец! Вы поробуйте русский вставить в файл TEXT...8 часов потратил чтобы устранить причину но выходит как в дет.саду.Стоит вмешатся в файл...Короче не партесь!!!
  • 14 Января 2011 22:51
    VALERI
    Короче млин! Проблема решена. Бардак был из-за длинного предложения. Вот результат,плюс обработка кнопок: http://www.valar.ru/upload/jpg/0111/p.htm
  • 28 Января 2011 22:44
    Ak_lucky_47
    Здравствуйте! у меня сайт на основе php и я бы хотел узнать как вывести голосование в и отображение голосов в php блок! я сделал: Вывел html с формой в php include в мой блок отображается хорошо но при голосовании он выводит в исходный html файл понял что нада лазить в poll.php но чета я там немного не понял! а проще говоря как вывести форму и результат в php
  • 12 Февраля 2011 21:51
    TEVSeo
    Нет такой картинки в исходниках <img src="lessons/les832/02.jpg" alt=""> как у вас в файле ксс. Это важно или нет?
  • 20 Февраля 2011 10:48
    mikfake
    Сразу видно по коду, что америкос создавал...
  • 21 Апреля 2011 15:48
    destripador
    всем привет! Скрипт хороший, но... я немогу разобраться, как его заставить работать на русском языке. Я в массиве и текстовых файлах всё поменял на рус. и теперь в место процентов и названий выдаёт: null NaN% Всего голосов: NaN может я чего-нибудь не понимаю? Если кто сталнулся с этой проблемой и нашёл решение, то скинте ответ.
    • 27 Мая 2011 10:19
      bossboss1
      Нужно открыть файл flatfile.php в Dreamweaver. Потом в меню Modify (изменить)-> Page properties (Свойства страницы) -> Title/Encoding (Кодирование). С строке Кодирование выбрать Кирилица (Windows) и нажать Применить. Готово!
  • 15 Мая 2011 22:01
    azizniy
    как отключить проверку IP или поставить ограничение на несколько минут? чтобы с одного компа можно было голосовать несколько раз.
  • 1 Октября 2011 22:18
    Noxter
    Кто подскажет мне как массив опций считывать из БД а не из PHP файла, и какую таблицу в БД создать?
  • 27 Октября 2011 02:20
    tlustenko
    лично для меня очень важно, что БЕЗ БД и SQL !!
  • 27 Октября 2011 14:22
    tlustenko
    я вставил код себе на сайт (тестирую на локалке через Денвер) (сайт на основе php - через include - в левую часть) и при нажатии на кнопку "голосовать" пишет, что страница не найдена. Т.е. идёт обращение к poll.php но этот файл не находит, хотя он реально есть. Исходники не трогал. Путь до poll.php верный - как и в исходнике - лежит в корне. Кто подскажет?
  • 27 Октября 2011 15:06
    tlustenko
    bossboss1 27 мая писал: Нужно открыть файл flatfile.php в Dreamweaver. Потом в меню Modify (изменить)-> Page properties (Свойства страницы) -> Title/Encoding (Кодирование). С строке Кодирование выбрать Кирилица (Windows) и нажать Применить. Готово! НЕ ПОЛУЧАЕТСЯ ТАК!!! проблема с русской кодировкой осталась. я открыл этот файл, а он УЖЕ был в кириллице. Пересохранение в ANSI ничего не дало - файлы УЖЕ были в ANSI кто решил вопрос с русской кодировкой - поделитесь подробной инструкцией!!!
  • 27 Октября 2011 19:39
    tlustenko
    Ещё у меня вопрос: нужно временно отключить проверку по IP. Нужно как-то проверять результат на наличие русских кракозябр, а я один раз проголосовал и всё! Больше не пускает. Очищение файлов ips.txt и votes.txt ни к чему не привели. Менять каждый раз IP нет возможности - IP не динамический.
  • 11 Ноября 2011 19:34
    Виктор Третьяк
    Возникла проблема! В исходниках после выбора варинта и нажатия "голосовать" варианты исчезают, а результаты не отображаются! В чем может быть проблема? Кто-либо сталкивался с подобным?
  • 14 Ноября 2011 21:30
    Login99
    Извените но скрипт полное "Г". Я хотел сделать Голосование "какой у вас браузер" Поменял все что нужно.
    <?php
    2	$options[1] = 'jQuery';
    3	$options[2] = 'Ext JS';
    4	$options[3] = 'Dojo';
    5	$options[4] = 'Prototype';
    6	$options[5] = 'YUI';
    7	$options[6] = 'mootools';
    Поменял на
    <?php
    2	$options[1] = 'Opera';
    3	$options[2] = 'IE';
    4	$options[3] = 'Mozilla';
    5	$options[4] = 'Safari';
    6	$options[5] = 'Chrome';
    7	$options[6] = 'Другой';
    Так же в
    votes.txt
    Поменял все значения. ВСЕ зделал как надо. Но этот дурацкий извените скрипт вообще перестал работать. А теперь внимание! Сделал все как было, вернул все значения такими как в исходнике... этот скрипт всё равно не запустился. А теперь вывод: Скрипт использовать можно., но только если
    НИЧЕГО
    в неём не менять, иначе фиг работать будет :( Так что если хотите поставить его себе на сайт, будет великолепно, но стоит вам хоть что нибудь поменять в
    poll.php 
    и(или)
    votes.txt
    файлах и фиг вы его запустите .
    • 3 Ноября 2012 17:47
      Nymph
      Если ты не можешь разобраться толком, то не надо обвинять всех. Скрипт рабочий.
  • 13 Декабря 2011 23:33
    Сергей Васьков
    Присоединяюсь к Виктору. Все сделал как написано. Но при нажатии "голосовать" не появляется результат (пустое место). Подскажите пожалуйста, как исправить проблему?
  • 17 Декабря 2011 15:39
    spiderone1
    Нечего даже не менял хотя перделать надо для ASP.NET )) но даже как есть не запустился на php .... пол часа ковырялся не получилось ...
  • 29 Декабря 2011 13:26
    kolyi
    Классный урок! :)
    • 31 Января 2012 00:10
      galaktika123
      Результатов голосования не видно, как исправить?
      • 12 Февраля 2012 00:44
        sanya797
        а эта функция что требует базу данных ?
      • 12 Февраля 2012 00:45
        sanya797
        и у меня не видно голосования
      • 12 Февраля 2012 11:51
        sanya797
        Здесь вообще кто то есть ?
  • 7 Мая 2012 16:09
    legokoh
    Классный урок. Но с исходником явная проблемка. И почему-то автор и никто другой не могут ее ни прокоментировать ни исправить. И такое не впервые на rusellere
    • 13 Июня 2012 11:41
      Guslik
      Исходники не рабочии. Выложили чтобы народ привлечь.
      • 24 Октября 2012 13:20
        Paladinrus
        Такая же фигня(((
  • 15 Августа 2012 17:15
    Евгений Панченко
    Как проверку IP адреса убрать,что бы нормально тестить на локалхосте...Всё перечитал,вопросов подобных несколько,но никто ещё не ответил!!! Админ-хелп!!!! Я нашёл:нужно в poll.js убрать обращение к кукам (в самом начале почти) и затереть свой IP в текстовом файле! Удачи!
  • 24 Октября 2012 13:30
    Paladinrus
    Подскажите почему не работают исходники??? Запускаю на локальном серваке, опрос появляется, выбрав жму голосовать и все белый фон вместо результатов
    • 3 Ноября 2012 17:44
      Nymph
      локально пхп не работает, ты увидишь результат после того как сам скрипт будет на хосте. если хочешь смотреть локально, поставь денвер хотя бы...
  • 3 Ноября 2012 17:43
    Nymph
    У кого вывод кириллицы отображается как "null", просто конвертируйте votes.txt в utf и будет чудо.
  • 4 Ноября 2012 21:23
    bigpanena
    установил, все работает и шрифт русский, всё норм, НО, общий результат голосовавших не меняется, у вас тут в демо 10995 голосов стоят на месте и стало быть исходник битый иль, я чего то не понимаю. p.s. Евгений разберись пжл. ..Попова уважаю..
  • 4 Января 2013 01:18
    alsnik
    У меня тоже все работает но не добавляются голоса, как было 54 так и осталось и при переходе со страницы на страницу выводится снова голосование, а не показ результата. А так конечно все красиво.
  • 4 Января 2013 02:06
    alsnik
    Нашел проблему со счетом. Счетчик считает нормально, но для этого удалите куки из браузера и при голосовании он прибавит вам один голос но больше не будет прибавлять, запомнит ip.
  • 30 Января 2013 17:33
    belarusdds
    КОД ПОЛНОСТЬЮ РАБОЧИЙ!!! Просто есть фишка с редактированием этих 2ух txt файликов и стиранием coockie браузера. Вот решение, мне лень переводить. Добавлю лишь, что 1ый пункт действительно не важен. Hey Guys, This Poll DOES work and after fighting with it for hours, I figured out the problems and I’ll share them here so all of you can get it working. The fact that is uses a flat file (no database) and that it stores a cookie makes this one of the easiest compact polls out there which is why we’re all craving to get this working. So — here’s what I did: 1) I’m not sure if it’s really necessary, but following one of the posts above, I edited poll.php as follows: Replace: $id = $_GET['vote'] || $_POST['vote']; With: $id = isset($_GET['vote']) ? $_GET['vote'] : $_POST['vote']; and Replace: $id = $_GET['poll'] || $_POST['poll']; With: $id = isset($_GET['poll']) ? $_GET['poll'] : $_POST['poll']; Add a closing ?> tag in poll.php 2) Edit poll.php with your preferred poll questions. This is pretty obvious. 3) Edit the votes.txt file to represent your poll answers. The info here does NOT have to be the same text as your poll questions. You can abbreviate or alter if necessary, but you DO need the ID number in front of the poll answer and you MUST have a vote count as a starting place, so maybe use 1 for everything. Also, because of the way text files are encoded, use a TAB to separate your ID, answer, and vote count. Most of you should know this already, but do NOT edit this file with Microsoft word. You must use Dreamweaver, Apple’s Text Edit (in plain text mode), or Window’s notepad. For those unaware, using other text editing programs embed hidden things you can’t see which make the file difficult to read and function. Use a very basic text editor! Keep this in mind for future projects, young bucks! 4) HERE’S THE KICKER I DISCOVERED and I suspect this is the problem most of you had in not getting poll results. When you edit the vote.txt file with your ID number, answer, and vote count, be sure there are NO trailing spaces after the last entry. If you have ANYTHING after the last entry, the voting results will fail. If these answers don’t get it working for you, I suggest checking your permissions of the folders and files and see if you need to set the DATA folder to 755 or 777. Yes, you can send your Ducati’s, racing jackets, and gear to me in gratitude. lol
  • 31 Марта 2013 11:43
    yinyang
    Не могу понять где и когда создать файлы. flatfile.php что в нем должно быть? когда создаются файлы jquery.js jquery.cookie.js poll.js ?? не понимаю.
  • 1 Апреля 2014 10:25
    TonyShow
    КАК РЕШИТЬ ПРОБЛЕМУ С ОТОБРАЖЕНИЕМ РЕЗУЛЬТАТОВ?? после голосования - вместо результата ПУСТОЙ БЛОК БЛИН УЖЕ НЕ ОДИН ЧЕЛОВЕК СПРОСИЛ ОБ ЭТОЙ ПРОБЛЕМЕ - АВТОР ОТВЕТЬ ПОЖАЛУЙСТА ЗАРАНЕЕ ВЫРАЖАЮ ОГРОМНУЮ БЛАГОДАРНОСТЬ!
    • 5 Октября 2015 15:11
      nikolayzaigrin
      Пустой экран отображается потому что в файле flatfile.php ошибка в 181 строке, при открытии файлового потока $fp = fopen($this->datadir . $tablename.'.lock','w'); $this->datadir - путь к файлу результатов. (Этот путь не включает сам файл) $tablename - это имя файла, куда записываются результаты (votes.txt) .'.lock' - к файлу дописывается расширение .lock. Функция fopen, получается, пытается открыть файл votes.txt.lock, которого нет. Для того чтобы исправить эту ошибку нужно удалить это расширение, точнее .'.lock' (вместе с точкой). w - тем кому интересно, это означает то что этот файловый поток, необходим только для записи. P.S. Эту ошибку обнаружил, используя Developer Tools в хроме. (такая штука есть во всех браузерах, в мозайке firebug) > Network > XHR > и там записываются все ajax запросы к серверу. Результат файла poll.php показал именно эту ошибку. Исправил, всё заработало.
  • 5 Октября 2015 15:23
    nikolayzaigrin
    Есть ли Jquery плагин для этого всего дела? Имеется ввиду файл poll.js, там описывается вся работа опросов, но хотелось бы иметь плагин. А лепить из этого плагин, как то не получается У меня несколько опросов на одной странице в разных частях. В интернете плагина не нашёл ничего подходящего, кроме этого
  • 23 Ноября 2015 18:58
    SellerHelp
    У кого пустой экран, и не получается ничего сделать. Пишите sellerhelp@mail.ru Цена вопроса 5$ (Вы предоставляете тестовый доступ к FTP, мы настроим все сами)
^ Наверх ^