Опросы в Discourse

:discourse2: Краткое описание Плагин Discourse Surveys позволяет создавать опросы непосредственно в постах вашего форума Discourse, используя простой синтаксис Markdown.
:hammer_and_wrench: Ссылка на репозиторий https://github.com/discourse/discourse-surveys
:open_book: Руководство по установке Как установить плагины в Discourse

Плагин Discourse Surveys позволяет создавать опросы непосредственно в постах вашего форума Discourse, используя простой синтаксис Markdown. В настоящее время плагин поддерживает различные типы вопросов, такие как переключатели (radio buttons), флажки (checkboxes), выпадающие списки, числовые поля, текстовые области, рейтинги звездами и рейтинги «палец вверх/вниз».

Возможности

  • 7 различных типов полей: Переключатели, флажки, выпадающие списки, текстовые области, выбор числа, рейтинги звездами и рейтинги «палец вверх/вниз»

  • Обязательные/необязательные поля: Отметьте поля как обязательные, чтобы обеспечить заполнение

  • Поддержка эмодзи: Используйте эмодзи в вариантах ответов вашего опроса

  • Поддержка Markdown: Форматирование текста в вопросах и вариантах ответов

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

  • Отслеживание ответов: Предотвращение дублирования отправлений от одного и того же пользователя

  • Учет разрешений: Соблюдение прав доступа к темам и категориям

  • Адаптивность для мобильных устройств: Безупречная работа на всех устройствах

Использование

Базовая структура опроса

Все опросы должны быть обернуты в теги [survey]:


[survey name="my-survey" title="Опрос обратной связи от клиентов"]

<!-- Поля опроса размещаются здесь -->

[/survey]

Атрибуты опроса

  • name: Уникальный идентификатор опроса (по умолчанию «survey»)

  • title: Необязательный заголовок, отображаемый в верхней части опроса

  • public: Установка видимости (будущая функция)

  • status: Статус опроса (будущая функция)

Типы полей

1. Переключатели (один выбор)


[radio question="Какой ваш любимый цвет?"]

- Красный

- Синий

- Зеленый

- Желтый

[/radio]

2. Флажки (несколько выборов)


[checkbox question="Какими функциями вы пользуетесь? (Выберите все подходящие)"]

- Уведомления по электронной почте

- Мобильное приложение

- Уведомления на рабочем столе

- Доступ к API

[/checkbox]

3. Выпадающий список


[dropdown question="К какой возрастной группе вы относитесь?"]

- До 18 лет

- 18–24

- 25–34

- 35–44

- 45–54

- 55+

[/dropdown]

4. Текстовая область (развернутый текст)


[textarea question="Пожалуйста, предоставьте подробную обратную связь:" required="false"]

[/textarea]

5. Выбор числа


[number question="Оцените эту функцию от 1 до 10:" min="1" max="10"]

[/number]

6. Рейтинг звездами


[star question="Как бы вы оценили свой общий опыт?"]

[/star]

7. Палец вверх/вниз


[thumbs question="Порекомендовали бы вы это другим?"]

[/thumbs]

Атрибуты полей

Все типы полей поддерживают следующие атрибуты:

  • question: Текст вопроса (обязательно)

  • required: Должно ли поле быть заполнено (true/false, по умолчанию true)

  • min: Минимальное значение для числовых полей

  • max: Максимальное значение для числовых полей

Полный пример

Базовый Markdown опроса

Вот базовый пример Markdown опроса, включающий все доступные поля:

[survey name="awesome-survey-thumbs" title="Удивительный опрос"]

[radio question="Выберите любой один вариант:"]
- кошка
- собака
[/radio]

[checkbox question="Выберите несколько вариантов:"]
- красный
- синий
- зеленый
[/checkbox]

[dropdown question="Пол:"]
- Мужской
- Женский
[/dropdown]

[number question="Оцените этот опрос от 1 до 10:"]
[/number]

[textarea question="Что вы думаете о xyz?" required="false"]
[/textarea]

[star question="Как бы вы оценили общий опыт?"]
[/star]

[thumbs question="Вы были довольны нашими услугами?"]
[/thumbs]

[/survey]

Отрисовка опроса

Ниже приведен пример того, как вышеуказанный Markdown отображается в Discourse:

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

Использование эмодзи в вариантах ответов


[radio question="Выберите ваше любимое животное:"]

- 🐈 Кошка

- 🐶 Собака

- 🐦 Птица

- 🐠 Рыба

[/radio]

Форматирование Markdown в вопросах


[radio question="Какой **язык программирования** вы предпочитаете?"]
- JavaScript
- Python
- Ruby
- Go
[/radio]

[checkbox question="Выберите свои *любимые* функции:"]
- Скорость
- Безопасность
- Простота использования
[/checkbox]

[textarea question="Пожалуйста, прочитайте наши [правила](https://example.com) и предоставьте обратную связь:"]
[/textarea]

Поддерживаемое форматирование:

  • Жирный: **текст**
  • Курсив: *текст*
  • Зачеркнутый: ~~текст~~
  • Встроенный код: `код`
  • Ссылки: [текст](url)

Смешанные обязательные и необязательные поля


[survey name="mixed-survey"]

[radio question="Какова ваша роль?" required="true"]

- Разработчик

- Дизайнер

- Менеджер

- Другое

[/radio]

[textarea question="Есть ли дополнительные мысли?" required="false"]

[/textarea]

[/survey]

Результаты опроса

В настоящее время у этого плагина нет интерфейса на стороне сервера для просмотра результатов опроса напрямую. Вместо этого вы можете использовать запросы Data Explorer для получения и анализа ответов на опросы. Вот пример запроса:

-- [params]
-- text :survey_name = survey

SELECT
  s.id,
  s.name,
  s.post_id,
  sf.question,
  COALESCE(sr.value, sfo.html) AS value,
  sr.user_id,
  sr.created_at AS responded_at
FROM
  surveys s
  JOIN survey_fields sf ON sf.survey_id = s.id
  JOIN survey_responses sr ON sr.survey_field_id = sf.id
  LEFT JOIN survey_field_options sfo ON sfo.id = sr.survey_field_option_id
WHERE
  s.name = :survey_name
ORDER BY
  s.id DESC

Разрешения и безопасность

  • Требуется вход: Анонимные пользователи должны войти в систему перед отправкой ответов

  • Один ответ на пользователя: Каждый пользователь может отправить только один ответ на опрос

  • Разрешения по темам: Пользователи должны иметь право на чтение темы, чтобы просматривать опросы

  • Разрешения на публикацию: Пользователи должны иметь право на публикацию в теме, чтобы отправлять ответы

  • Архивированные темы: Опросы в архивированных темах не могут принимать новые ответы

  • Удаленные посты: Опросы в удаленных постах больше недоступны

Ограничения

  • В одном посте разрешен только один опрос

  • Структура опроса не может быть изменена после получения ответов

  • Все вопросы полей опроса должны быть уникальными в рамках одного опроса

  • Вопросы полей опроса не могут быть пустыми

Технические детали

Схема базы данных

Плагин создает четыре основные таблицы базы данных:

  • surveys: Основные записи опросов

  • survey_fields: Отдельные поля внутри опросов

  • survey_field_options: Варианты ответов для полей с выбором

  • survey_responses: Ответы пользователей на поля опроса

Стилизация

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

  • .survey - Основной контейнер опроса

  • .survey-field - Обертка отдельного поля

  • .field-[type] - Контейнеры для конкретных типов полей

  • .submit-response - Кнопка отправки

32 лайка

So users can’t see results (unless they have rights to use query) and this is totally for admins/background staff?

3 лайка

Yes, that is correct.

7 лайков

It doesn’t feel very practical :cry:

3 лайка

Need option to publish survey results. Otherwise better to use multiple polls.

3 лайка

Hello

The sample Markdown renders in a new Topic as per below. My Discourse is updated to the latest version.

What could the the problem?

Regards

Hey @ppcole,

The above is what is shown in composer preview when you’re creating the survey. Once you create the topic it will render properly as expected.

Thanks Arpit. It worked. Looking forward to enhancements

1 лайк

May I know if you folks are working on this but not with actual priority?

It would be great to have this continue to be developed - it has masses of potential.

I found that the SQL above did pull out the results, but it wasn’t in an easy to work with format; basically it would require a tonne of transformation at the spreadsheet level to enable useful analysis.

However, with a bit of Gen AI help, I was able to produce a very sweet Data Explorer query. Due to some limitations of Data Explorer, it isn’t possible to make it dynamic enough to cope with a variety of surveys; basically you need a bespoke query per survey.

Fortunately, Gen AI can make that pretty straight forward. Here is a sample prompt that will probably work in most Gen AI services (if you don’t have the AI plugin active) - just plugin in your survey markdown and you should be away:

Gen AI Prompt to Produce Tailored SQL Query for a Specific Survey

I have a survey defined in markdown format, and I need a SQL query to extract the survey results from a Discourse database using the Data Explorer Plugin. The survey includes various types of questions such as radio, dropdown, star, checkbox, textarea, thumbs, and number. I want the query to output results with each user having a single row and each question having its own column. For checkbox questions, multiple responses should be concatenated into a single string.

Here is the survey markdown:

Paste your survey markdown here

Here is the original query used to obtain survey results:

-- [params]
-- text :survey_name = survey

SELECT s.id, s.name, s.post_id, sf.question, COALESCE(sr.value, sfo.html) AS value, sr.user_id, sr.created_at as responded_at
FROM surveys s
JOIN survey_fields sf ON sf.survey_id = s.id
JOIN survey_responses sr ON sr.survey_field_id = sf.id
LEFT JOIN survey_field_options sfo ON sfo.id = sr.survey_field_option_id
WHERE s.name = :survey_name
ORDER BY s.id DESC

Please generate a SQL query that:

  • Hardcodes the survey name.
  • Uses conditional aggregation to pivot the data, with each question as a column.
  • Utilizes STRING_AGG for checkbox questions to handle multiple responses.
  • Ensures the output is grouped by user_id and ordered by user_id.
  • Is formatted for readability and includes comments explaining the logic where necessary.

Additional Guidance for Data Explorer Plugin:

  • The query should be compatible with the Discourse Data Explorer Plugin, which means it should not end with a semicolon.
  • Use column names like user_id to leverage automatic linking features within the Data Explorer.
  • Avoid using dynamic SQL, as the plugin does not support it.
  • Ensure the query is efficient and optimized for performance, as it may be run on large datasets.
8 лайков

This is an excellent little plugin that is surprisingly feature rich. Thanks for making it.

@nathank great job on guide to quickly building results query. That makes the whole thing even more useful :rocket: (and should be moved to the OP)

4 лайка

I installed this on my self-hosted site to take it for a spin, and it’s quite nice indeed!

I realize this is anathema to discourse, but it would be helpful if it were possible to create surveys that can be completed anonymously, without logging in. Or at least to anonymize the results so they are not associated with specific users.

And of course yes the ability to look at the results like you can with polls without having to resort to data explorer would be fantastic.

5 лайков

Yes I faced the same issue. Hopefully there is a solution.

3 лайка