Опросы в 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 лайка

Значит, пользователи не видят результаты (если у них нет прав на использование запроса), и это полностью для администраторов или фоновых сотрудников?

3 лайка

Да, всё верно.

7 лайков

Это не кажется очень практичным :cry:

3 лайка

Нужна возможность публиковать результаты опроса. В противном случае лучше использовать несколько опросов.

3 лайка

Здравствуйте

Пример Markdown отображается в новой теме, как показано ниже. Мой Discourse обновлён до последней версии.

В чём может быть проблема?

С уважением

Привет, @ppcole,

Выше показано, что отображается в предпросмотре композитора при создании опроса. Как только вы создадите тему, она отобразится корректно, как и ожидалось.

Спасибо, Арпит. Всё сработало. Жду улучшений.

1 лайк

Подскажите, пожалуйста, вы работаете над этим, но без реального приоритета?

Было бы здорово, если бы это продолжали разрабатывать — у этого проекта огромный потенциал.

Я обнаружил, что приведенный выше SQL-запрос действительно извлекает результаты, но они не представлены в удобном для работы формате; по сути, это потребовало бы огромного количества преобразований на уровне электронных таблиц для проведения полезного анализа.

Однако с небольшой помощью генеративного ИИ мне удалось создать очень удобный запрос для Data Explorer. Из-за некоторых ограничений Data Explorer невозможно сделать его достаточно динамичным для обработки различных опросов; по сути, для каждого опроса требуется индивидуальный запрос.

К счастью, генеративный ИИ может сделать это довольно просто. Вот пример промпта, который, вероятно, сработает в большинстве сервисов генеративного ИИ (если у вас не активирован плагин ИИ) — просто вставьте свой опрос в формате Markdown, и вы сможете начать работу:

Промпт для генеративного ИИ для создания индивидуального SQL-запроса для конкретного опроса

У меня есть опрос, определенный в формате Markdown, и мне нужен SQL-запрос для извлечения результатов опроса из базы данных Discourse с использованием плагина Data Explorer. Опрос включает различные типы вопросов, такие как радио-кнопки, выпадающие списки, звезды, флажки, текстовые области, оценки большим пальцем и числа. Я хочу, чтобы запрос выдавал результаты, где у каждого пользователя одна строка, а у каждого вопроса — свой столбец. Для вопросов с флажками несколько ответов должны быть объединены в одну строку.

Вот опрос в формате Markdown:

Вставьте сюда ваш опрос в формате Markdown

Вот исходный запрос, использованный для получения результатов опроса:

-- [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

Пожалуйста, сгенерируйте SQL-запрос, который:

  • Задаёт название опроса в виде константы.
  • Использует условную агрегацию для поворота данных, где каждый вопрос становится столбцом.
  • Использует STRING_AGG для вопросов с флажками для обработки нескольких ответов.
  • Гарантирует, что выходные данные сгруппированы по user_id и отсортированы по user_id.
  • Отформатирован для удобства чтения и включает комментарии, объясняющие логику там, где это необходимо.

Дополнительные рекомендации для плагина Data Explorer:

  • Запрос должен быть совместим с плагином Data Explorer для Discourse, что означает, что он не должен заканчиваться точкой с запятой.
  • Используйте имена столбцов, такие как user_id, чтобы использовать функции автоматической ссылки внутри Data Explorer.
  • Избегайте использования динамического SQL, так как плагин его не поддерживает.
  • Убедитесь, что запрос эффективен и оптимизирован для производительности, так как он может выполняться на больших наборах данных.
9 лайков

Это отличный маленький плагин, который удивительно богат на функции. Спасибо за его создание.

@nathank, отличная работа над руководством по быстрому созданию запросов результатов. Это делает весь плагин ещё более полезным :rocket: (и его стоит перенести в первое сообщение).

4 лайка

Я установил это на свой самохостинговый сайт, чтобы попробовать, и это действительно здорово!

Я понимаю, что это противоречит философии Discourse, но было бы полезно иметь возможность создавать опросы, которые можно заполнить анонимно, без входа в систему. Или хотя бы анонимизировать результаты, чтобы они не были связаны с конкретными пользователями.

И, конечно же, возможность просматривать результаты, как это делается с голосованием, без необходимости обращаться к Data Explorer, была бы замечательной.

7 лайков

Да, я столкнулся с той же проблемой. Надеюсь, решение найдётся.

3 лайка