В ДЛЕ в случае если посетитель проголосовал повторно его голос неучитываестя, однако форма голосовани на сайте ему выводится как обычно, вот это мы и будем править, чесно говоря не думаю что в этом есть смысл, так как голос то всеравно не защитывается, а лишний запрос к БД нам явно не нужен.
Собсно раз уж это кому-то нужно то вперед.
Файл голосования как и положено зовется vote.php, лежит этот файл в папке engine/modules/
Открываем его и смотрим, файл то не такой и сложный, но если вы всеравно не фига не понимаете что значат эти английские слова, значки и прочее, то это и не обязательно, так как ниже инструкция как и что туда добавить.
Собсно смотрим как этот скрипт проверяет голосовал ли посетитель, видим что поверка идет через БД, сиречь скрипт просто смотрит голосовал посетитель или нет, сверяя или логин или ip (для гостей).
Собсно этого достаточно, вто только проверяет это только при самом голосовании, в принципе этого достаточно и можно дальше не читать, а просто забить, подумаешь выводиться форма, всеравно ведь дважды прголосовать не выйдет.
Я бы так и сделал, но как оказалось некоторым важно чтобы пользователь видел что уже голосовал, собсно так конечно лучше :)
Тогда нам нужно просто это проверку перенести внезависимости от того голосует посетитель или просто смотрит страницу.
Только вот тогда то будет еще один запрос к БД, а нафиг нам это нужно.
Тут напомощь придут cookie, мы будем делать запрос к бд (всеравно без него никак) но после получения результатов, вешать cookie, сиречь что запрос на одного посетилея будет только один.
Вроди бы не мало, но представьте себе если у вас будет посещаемость хотябы 5000 посетителей в день, это уже 5000 лишних запросов к БД.
Еще не передумали?
тогда вперед, мы не будем изобретать велосипед, мы его только погнем :)
В вашеназванном файле.
найти строку
$max = $vote_info[$rid]['vote_num'];
ниже вставить:
if($_COOKIE['vote_'.$rid] == 'n'){$is_voted = false;}
elseif ($_COOKIE['vote_'.$rid] == 'y') {$is_voted = true;$flag = 1;}
elseif($_COOKIE['vote_'.$rid] != 'y') {
$_IP = $db->safesql($_SERVER['REMOTE_ADDR']);
if (isset($member_id['name'])) $nick = $member_id['name']; else $nick = '';
if ($is_logged)
$row = $db->super_query("SELECT count(*) as count FROM ".PREFIX."_vote_result WHERE vote_id='$rid' AND name='$nick'");
else
$row = $db->super_query("SELECT count(*) as count FROM ".PREFIX."_vote_result WHERE vote_id='$rid' AND ip='$_IP'");
if ($row['count'] == 0) {$is_voted = false;setCookie("vote_".$rid, 'n', time()+31536000, "/", "site.ru");}
else {$is_voted = true; $flag = 1;setCookie("vote_".$rid, 'y', time()+31536000, "/", "site.ru");}
}
Как видете тут мы только перенесли проверку внезависимости от того голосует ли посетитель, ну еще добавили cookie.
Идем дальше.
найти
@unlink(ENGINE_DIR.'/cache/system/vote.php');
ниже вставить
@unlink(ENGINE_DIR.'/cache/vote.tmp'); // Удаление кеша
setCookie("vote_".$rid, 'y', time()+31536000, "/", "site.ru");
найти чуть ниже
$max++;
}
}
ниже встаавить
$vote = dle_cache("vote");//чтение кеша
if(!$vote){
чуть ниже найти
$db->free();
}
ниже встаивить
}
найти
$entry = "<div id=\"dle-vote\">$entry</div>";
$tpl->load_template('vote.tpl');
$tpl->set('{list}', $entry);
Замениь
$entry = "<div id=\"dle-vote\">$entry</div>";
if(!$vote){$vote = $entry; create_cache ("vote", $entry);} // создание кеша
$tpl->load_template('vote.tpl');
$tpl->set('{list}', $vote);
файл engine/ajax/vote.php
найти
if (!$row['count'] AND count(explode(".", $_IP)) == 4) $is_voted = false;
else $is_voted = true;
if ($is_voted == false) {
if (!$is_logged) $nick = "guest";
$db->query("INSERT INTO ".PREFIX."_vote_result (ip, name, vote_id, answer) VALUES ('$_IP', '$nick', '$rid', '$vote_check')");
$db->query("UPDATE ".PREFIX."_vote set vote_num=vote_num+1 where id='$rid'");
@unlink(ENGINE_DIR.'/cache/system/vote.php');
}
замениь
if (!$row['count'] AND count(explode(".", $_IP)) == 4){ $is_voted = false;}
else {$is_voted = true;setCookie("vote_".$rid, 'y', time()+31536000, "/", "site.ru");}
if ($is_voted == false) {
if (!$is_logged) $nick = "guest";
$db->query("INSERT INTO ".PREFIX."_vote_result (ip, name, vote_id, answer) VALUES ('$_IP', '$nick', '$rid', '$vote_check')");
$db->query("UPDATE ".PREFIX."_vote set vote_num=vote_num+1 where id='$rid'");
@unlink(ENGINE_DIR.'/cache/system/vote.php');
@unlink(ENGINE_DIR.'/cache/vote.php');
}
собсно все, результат работы можете видеть на этом блоге.
p.s.
везде по тексту изменить строку:
31536000, "/", "site.ru"
на свои данные
31536000 - это время жизни cookie в секундах
"/" папка из которой будет доступно чтение cookie (можно не менять)
"site.ru" - замените на ваш домен