Наши заметки о MODx
В этом разделе мы будем собирать небольшую копилку секретов по работе с системой управления контентом сайта (CMS) MODx. Эти заметки ни в коем случае не претендуют на лавры документации. На нашем сайте тема MODx вообще занимает небольшой уголок, и эти материалы мы размещаем только потому, что по роду основной работы нам приходится оказывать техническую поддержку нескольким десяткам организаций, использующих наши прототипы сайтов. В то же время кое-что может пригодиться и другим людям.
Мы не претендуем на изложение "истины в последней инстанции". Наверняка в этих заметках гуру MODx найдут неточности и ошибки. Мы будем очень благодарны, если на это нам укажут в комментариях.
В заметках мы стараемся не просто сразу приводить готовое правильное решение, но и показываем, как мы набивали шишки в процессе поиска.

Как сделать многовариантный запрос


Как мы указывали в предыдущей заметке, нам необходимы и многовариантные опросы - когда посетитель может проголосовать за несколько вариантов.

Сниппет EasyPoll, который мы применили, не предусматривает многовариантного голосования. Для нас это существенный недостаток, который мы попытаемся исправить.

Менеджер опросов мы трогать не будем - он к вариантам не имеет отношения. А вот в сниппет EasyPoll придется влезать. Прежде всего, очевидно, необходимо предусмотреть дополнительный параметр. Назовем его multi и вставим в код сниппета (показываем только кусочек кода):

$config['showexception']    = isset($showexception) ? $showexception == true : false;
// Дополнительный параметр 
$config['multi']             = isset($multi) ? $multi == true : false;
 

  Весь функционал сниппета находится в файле easypoll.class.php. Поковыряемся в его кишочках. Нам ведь немного надо, всего-то:

1. Для варианта multi вместо radio-переключателя поставить checkbox-ы.

2. При щелчке по кнопке Голосовать для всех отмеченных вариантов должно быть добавлено по одному голосу.

Решаем задачи в порядке поступления.

1. Находим в   файле easypoll.class.php код, создающий форму. Вместо

 $values = array(
'answer' => htmlentities($row['title'], ENT_COMPAT, 'UTF-8'),
'select' => '<input name="poll_choice" type="radio" value="' . $row['choiceid'] . '" />'
); 

записываем:

if ( $this->config['multi'] ) {
$values = array(
'answer' => htmlentities($row['title'], ENT_COMPAT, 'UTF-8'),
'select' => '<input name="poll_choice[]" type="checkbox" value="' . $row['choiceid'] . '" />'
);
} else {
$values = array(
'answer' => htmlentities($row['title'], ENT_COMPAT, 'UTF-8'),
'select' => '<input name="poll_choice" type="radio" value="' . $row['choiceid'] . '" />'
);      
}

Обратите внимание на выделенное жирным.

Теперь, если при вызове сниппета указать параметр &multi=`1`, форма опроса будет выглядеть так:

Многовариантное голосование

Многовариантное голосование

2. Добиваемся добавления результата к нескольким вариантам. Для этого нам придется в файле easypoll.class.php организовать цикл в функции generateOutput. Вместо кода:

  $success = $this->submitVote(intval($_POST['poll_choice']));

  записываем:        if ( $this->config['multi'] ) {
          foreach ($_POST['poll_choice'] as $choice)
           {
            $success = $this->submitVote($choice);       
           }
        } else {

            $success = $this->submitVote(intval($_POST['poll_choice']));
        } 
   Мы добавили выделенное жирным. И это всё, что нужно.                

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

Результаты голосования

Результаты голосования

Впрочем, они и раньше так же отображались.

Итак, мы добились требуемого - и многовариантное голосование сделали, и отображение результатов в приличном виде.

16-02-2009 15:31:35



    Содержание раздела «Многовариантный опрос»:
Комментарии любых посетителей

Написать комментарий


 
ShaggyDoc
Комментарий
Защита от накрутки
Реплика №2: 25.10.2009, 10:04:58
Надо параметр &onevote включить. Тогда проголосовашему с какого-то IP повторно голосовать не дает. Но 100% защиты от накруток, конечно, не существует...
Александр
Комментарий
защита от накрутки
Реплика №1: 25.10.2009, 04:24:21
поставил это голосование, но нет защиты от накрутки, вы не интересовались этим?