Ищу [ищу] Голосование: измененый мод

Тема в разделе "DLE", создана пользователем Moroznui, 20 июл 2008.

Информация :
Актуальная версия DataLife Engine 12.0
( Final Release v.12.0 | Скачать DataLife Engine | Скачать 12.0 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.3 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. Moroznui

    Moroznui Создатель

    Регистр.:
    2 июл 2008
    Сообщения:
    43
    Симпатии:
    2
    Ищу что-нибудь сторонее для проведения опросов.
    Что не устраивает в стандарте:
    1. Если человек проголосовал, ему все равно показываетя это голосование.
    2. Даже если он проголосовал ему дают еще раз список ответов, хотя голос уже не учитывается
    3. При нажатии на Результаты появляется результаты рандомного опроса, а не того, который был в данный момент на странице.
    4. В админке нет данных по каждому голосованию
    5. нет возможности использовать аякс, если такой не включен в основных настройках.

    Мб есть у кого-нить мод, который решает хотя бы некоторые проблемы из списка сверху? Буду признателен
     
  2. JC

    JC Бог пикселей

    Регистр.:
    4 янв 2008
    Сообщения:
    303
    Симпатии:
    401
    Есть хак который если человек проголосовал, будет выводить результат, а не список вариантов...
    Сразу говорю название не помню, попробуй через поиск или на 4дле там был...
     
  3. Max399

    Max399

    Регистр.:
    7 май 2007
    Сообщения:
    245
    Симпатии:
    26
    Если найдёш выложи сдесть ссылку чтоб народ не искал.
     
  4. kandasoft

    kandasoft Читатель

    Заблокирован
    Регистр.:
    17 окт 2007
    Сообщения:
    259
    Симпатии:
    143
    Что бы не искать выложу сдесь, заранее извиняюсь, если уже размещено...

    =====================

    Решает 2 вопроса:

    1. опрос на сайте. предлагает проголосовать второй раз, голосует, но голос не учитывается. нужно прийти к какому-то логичному решению - либо учитывать все попытки проголосовать, либо выдавать "вы уже голосовали"

    2. голосование в новости. имхо еще хуже - после голосования показывает результаты НО все еще висят две кнопки голосовать и результаты. здесь имхо лучше просто убрать эти две кнопки.


    Правим обычные голосования

    Открываем /engine/modules/vote.php

    находим
    Код:
    /////////////////////////////////////////////////////////////////////////////
      //  Проверяем проголосовал ли текущий пользователь
      /////////////////////////////////////////////////////////////////////////////
      <font color=#000080><strong>$_IP</strong></font><font color=#000000> = </font><font color=#000080><strong>$db</strong></font>->safesql(<font color=#000080><strong>$_SERVER</strong></font>['REMOTE_ADDR']);
    
      <font color=#000000><strong>if</strong></font> (<font color=#008080><strong>isset</strong></font>(<font color=#000080><strong>$member_id</strong></font>['name'])) <font color=#000080><strong>$nick</strong></font><font color=#000000> = </font><font color=#000080><strong>$member_id</strong></font>['name']; <font color=#000000><strong>else</strong></font> <font color=#000080><strong>$nick</strong></font><font color=#000000> = </font>'';
    
      <font color=#000000><strong>if</strong></font> (<font color=#000080><strong>$is_logged</strong></font>)
      <font color=#000080><strong>$row</strong></font>  = <font color=#000080><strong>$db</strong></font>->super_query("SELECT <font color=#008080><strong>count</strong></font>(*) <font color=#000000><strong>as</strong></font> <font color=#008080><strong>count</strong></font> FROM ".PREFIX."_vote_result WHERE vote_id='<font color=#000080><strong>$rid</strong></font>' AND name='<font color=#000080><strong>$nick</strong></font>'");
      <font color=#000000><strong>else</strong></font>
      <font color=#000080><strong>$row</strong></font>  = <font color=#000080><strong>$db</strong></font>->super_query("SELECT <font color=#008080><strong>count</strong></font>(*) <font color=#000000><strong>as</strong></font> <font color=#008080><strong>count</strong></font> FROM ".PREFIX."_vote_result WHERE vote_id='<font color=#000080><strong>$rid</strong></font>' AND ip='<font color=#000080><strong>$_IP</strong></font>'");
    
      <font color=#000000><strong>if</strong></font> (<font color=#000080><strong>$row</strong></font>['<font color=#008080><strong>count</strong></font>']<font color=#000000> == </font>0) <font color=#000080><strong>$is_voted</strong></font><font color=#000000> = </font><font color=#000000><strong>false</strong></font>;
      <font color=#000000><strong>else</strong></font> <font color=#000080><strong>$is_voted</strong></font><font color=#000000> = </font><font color=#000000><strong>true</strong></font>;
    вырезаем и вставляем этот код над
    Код:
    <font color=#000000><strong>if</strong></font> (<font color=#000080><strong>$vote_action</strong></font><font color=#000000> == </font>"vote")
    также над ним добавляем
    Код:
      <font color=#000000><strong>if</strong></font> ( <font color=#000080><strong>$is_voted</strong></font> )
      {
           <font color=#000080><strong>$flag</strong></font><font color=#000000> = </font>1;
      }
    Единственный минус данного фикса, это - добавление дополнительного запроса!

    Правим голосования в новостях

    1. Открываем /engine/modules/poll.php, находим
    Код:
    ajax.sendAJAX(varsString);
    ниже добавляем

    Код:
    document.getElementById('buttons').style.display<font color=#000000> = </font>'none';

    находим

    Код:
    <font color=#000080><strong>$tpl</strong></font>->compile('poll');

    выше добавляем

    Код:
        <font color=#000000><strong>if</strong></font> ( !<font color=#000080><strong>$log</strong></font>['<font color=#008080><strong>count</strong></font>']<font color=#000000> == </font>0 )
        {
              <font color=#000080><strong>$tpl</strong></font>->set ( '[hide-button]', '' );
              <font color=#000080><strong>$tpl</strong></font>->set ( '[/hide-button]', '' );
        }
        <font color=#000000><strong>else</strong></font>
        {
              <font color=#000080><strong>$tpl</strong></font>->set_block ( "'\[hide-button\](.*)\[/hide-button\]'si", "" );
        }

    2. В шаблоне poll.tpl находим код кнопок

    Код:
    <input type="button" onclick="doPoll('vote'); <font color=#000000><strong>return</strong></font> <font color=#000000><strong>false</strong></font>;" <font color=#000000><strong>class</strong></font>="bbcodes_poll" value="Голосовать" />&nbsp;<input type="button" onclick="doPoll('results'); <font color=#000000><strong>return</strong></font> <font color=#000000><strong>false</strong></font>;" <font color=#000000><strong>class</strong></font>="bbcodes_poll" value="Результаты" />

    и экранируем их

    Код:
    [hide-button]<div id="buttons">
    <input type="button" onclick="doPoll('vote'); <font color=#000000><strong>return</strong></font> <font color=#000000><strong>false</strong></font>;" <font color=#000000><strong>class</strong></font>="bbcodes_poll" value="Голосовать" />&nbsp;<input type="button" onclick="doPoll('results'); <font color=#000000><strong>return</strong></font> <font color=#000000><strong>false</strong></font>;" <font color=#000000><strong>class</strong></font>="bbcodes_poll" value="Результаты" />
    </div>[/hide-button]
    Автор: nickon
    Источник: http://4dle.ru/2008/01/13/fiks_baga_golosovanijj.html
     
    Max399 нравится это.
  5. Moroznui

    Moroznui Создатель

    Регистр.:
    2 июл 2008
    Сообщения:
    43
    Симпатии:
    2
    Решение проблемы:

    Открыть файл /engine/modules/vote.php и найти и удалить:


    Код:
     /////////////////////////////////////////////////////////////////////////////
      //  Проверяем проголосовал ли текущий пользователь
      /////////////////////////////////////////////////////////////////////////////
      $_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;
      else $is_voted = true;
    
          $flag = 1;
    
    Найти строку

    Код:
    $max   = $vote_info[$rid]['vote_num'];
    и после нее вставить:

    Код:
      /////////////////////////////////////////////////////////////////////////////
      //  Проверяем проголосовал ли текущий пользователь
      /////////////////////////////////////////////////////////////////////////////
      $_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;
            $flag = 0;
        }
      else
        {
            $is_voted = true;
            $flag = 1;
        }

    Этим мы вынесли проверку голоса за пределы голосования (т.е. она производится ВСЕГДА [при включенном голосовании] т.е. + 1 запрос)
     
Статус темы:
Закрыта.