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

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


Довольно часто требуется провести какие-нибудь опросы пользователей. Когда мы работали в CMS Etomite, для организации хорошей системы голосования пришлось немало потрудиться. В MODx для таких целей используются модуль EasyPoll и сниппет EasyPoll.

Вот как чтитаешь это "Easy", так  сразу же вспоминается цитата "меня терзают смутные подозрения...."

 

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

Модуль  EasyPoll

Устанавливается точно в соответствии с документацией. Русского языка в нем нет, но можно просто скопировать english.inc.php в ruccian-UTF8.inc.php и перевести несколько десятков строчек. А можно и не переводить - эти строки видит только администратор сайта.

Сниппет EasyPoll

Устанавливается в обычном порядке. Для русского языка нужно создать lang.ru.php и перевести в нем 6 строк. Эти строки видны пользователю. 

Более интересным является использование сниппета. Разумеется, как и всякий приличный сниппет MODx, EasyPoll имеет массу параметров. Традиционно мы обратим внимание на нас касающиеся. Особенно интересуют такие критические места:

а) Возможно ли голосование за несколько вариантов ответа? 

б) Возможно ли графическое отображение результатов?

На вопрос а) ответ -  нет. Это резко снижает ценность сниппета. Смутные подозрения оправдались. Нет в коде упоминания о checkbox - есть только radio. Это означает, что можно выбрать только один вариант ответа, а нам непременно, кроме такого варианта, нужна возможность проголосовать за несколько вариантов. Так надо. Придется, видимо, влезать в код сниппета или портировать свой сниппет из Etomite в MODx.

На вопрос б) ответ - можно. Только надо разобраться и научиться. Это не страшно.


 Первая проба

Попытка использовать сниппет без собственных настроек дает такие результаты:

а) Процедура голосования:

 Голосование

б) Результаты:

 Результат

  Это нас не устраивает. Будем разбираться в выводом результатов. Анализ показывает, что для отображения графики нужно подключить дополнительные стили. Включаем в свою таблицу стилей файл poll.css из комплекта сниппета - пока без правки. Видим такие результаты:

1. В Firefox:

 Результаты в Firefox

2. В Safari:

 Результаты в Safari

3. В IntenetExplorer:

  Результаты в IE

Результаты в IE

Да, давненько мы не видели столь разных результатов в браузерах! Обычно выделяется (в худшую сторону) IE, но чтобы Firefox и Safari... Боимся и поглядеть в Opera.

Конечно, кое-что мы можем исправить в CSS,  нас не устраивают сами принципы. Нам нужно еще и разными цветами выделять голоса. Придется, видимо радиально перерабатывать сниппет, возможно - и модуль. Впрочем, попробуем сначала штатными средствами сниппета.

Доработка сниппета


В результате многочисленных корректоровок таблиц стилей, шаблонов и функции-шаблона нам удалось добиться приемлемого вида результатов опроса:

Вид результатов опроса

Вид результатов опроса

Подобный опрос формируется вызовом сниппета:

[ !EasyPoll? &lang=`ru` &multi=`1` &pollid=`2`&noajax=`0` &css=`assets/templates/yaml/epoll.css` &tplResultOuter=`PollResultOuter` &tplVoteOuter=`PollVoteOuter` &tplResult=`@FUNCTIONCHUNK PollFunction`! ] 

Мы использовали аргументы:

&lang=`ru`. Язык сниппета. По умолчанию en, но нам проще изменить в коде сниппета на ru.

&multi (1 или 0) - возможность многовариантного голосования. Этот аргумент мы сами добавили - в сниппете его не было. Как это сделать - в следующей заметке.

&pollid=`2`. Здесь указывается  ID опроса. Если не задан, то используется последний активный и полностью доступный опрос. А сами опросы, напомним, создаются с помощью модуля easyPoll.

&noajax=`0`.  Разрешает или запрещает использование AJAX. Если установить 1, то вся дополнительная функциональность JavaScript будет отключена.  В принципе этого не требуется, так как сниппет всё равно работает в браузерах, не поддерживающих  JavaScript, а эта опция поможет как бы смоделировать отключение JavaScript.

&css=`assets/templates/yaml/epoll.css`. Подгружаем дополнительную таблицу стилей только для страницы с опросом. Это позволит не включать лишние стили в общую таблицу. Например такую:

@CHARSET "UTF-8";
.pollresults li {clear:both; width:95%;}
.easypoll fieldset {border:0px; margin:0px; padding:0px;}
.easypoll_bar {height:20px; background-color:#DCDCDC; float:left; width:95%;    border: 1px solid #000; padding:0px;}
.easypoll_bar strong {float:left; display:block; padding:4px;font-size:10px;}
.easypoll_inner {height:100%; float:left; background-color:#000;}
  &tplResultOuter=`PollResultOuter`. Это чанк, в котором определен шаблон результатов голосования, например такой:

<div class="light_box" align="left">
    <h3>[ +question+ ]</h3>
    <div>[ +choices+ ]</div>
    <br /> <br /> <br />
    <div>[ +totaltext+ ]:<strong> [ +totalvotes+ ]</strong></div>
</div>

&tplVoteOuter=`PollVoteOuter` Это чанк, в котором определен шаблон вопросов для голосования, например такой:

<div class="light_box">
    <h3>[ +question+ ]</h3>
    <ul>[ +choices+ ]</ul>  
    [ +submit+ ] [ +results+ ]
</div>

&tplResult=`@FUNCTIONCHUNK PollFunction`. А это самый интересный параметр. Здесь может быть задан чанк шаблона для вывода результата по каждому отдельному вопросу. Но вместо шаблона может использоваться функция. В данном случае мы ссылаемся на функцию с именем PollFunction. Где она определена и что делает?

PollFunction - это имя чанка. В коде чанка определена функция EasyPoll_PrintResult. И еще есть вспомогательная функция HSB2HEX. Мы их просто нагло позаимствовали из документации, и в результате имеем отображение результата в виде разноцветных графиков.

Результаты

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

А вот два опроса на одной странице заставить работать не получилось, хоть мы и следовали рекомендациям автора.

Впрочем, такого лучше не делать вообще.

 

 

15-02-2009 14:43:19



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

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


 
zergerenok
Комментарий
Дизайн порадовал
Реплика №1: 07.09.2009, 13:13:19
Дизайн порадовал ) только вот в Опера 10 чуток смазанно смотрится ...