디스커스 설문조사

:discourse2: 요약 Discourse Surveys 플러그인은 간단한 Markdown 구문을 사용하여 Discourse 포럼 게시물 내에서 직접 설문 조사를 만들 수 있습니다.
:hammer_and_wrench: 레포지토리 링크 https://github.com/discourse/discourse-surveys
:open_book: 설치 가이드 Discourse에서 플러그인 설치하는 방법

Discourse Surveys 플러그인은 간단한 Markdown 구문을 사용하여 Discourse 포럼 게시물 내에서 직접 설문 조사를 만들 수 있습니다. 이 플러그인은 현재 라디오 버튼, 체크박스, 드롭다운, 숫자 입력, 텍스트 영역, 별점 평가, 엄지손가락 위/아래 평가 등 다양한 질문 유형을 지원합니다.

기능

  • 7가지 다른 필드 유형: 라디오 버튼, 체크박스, 드롭다운, 텍스트 영역, 숫자 선택, 별점 평가, 엄지손가락 위/아래

  • 필수/선택 필드: 필드를 필수로 지정하여 완료를 보장합니다

  • 이모지 지원: 설문 옵션에 이모지를 사용할 수 있습니다

  • Markdown 지원: 질문과 옵션에 풍부한 텍스트 서식을 사용할 수 있습니다

  • 사용자 인증: 익명 사용자에게 자동 로그인 프롬프트를 표시합니다

  • 응답 추적: 같은 사용자의 중복 제출을 방지합니다

  • 권한 인식: 토픽 및 카테고리 권한을 준수합니다

  • 모바일 반응형: 모든 기기에서 완벽하게 작동합니다

사용법

기본 설문 구조

모든 설문은 [survey] 태그로 감싸야 합니다:


[survey name="my-survey" title="Customer Feedback Survey"]

<!-- Survey fields go here -->

[/survey]

설문 속성

  • name: 설문의 고유 식별자 (기본값은 “survey”)

  • title: 설문 상단에 표시되는 선택적 제목

  • public: 표시 상태 설정 (향후 기능)

  • status: 설문 상태 (향후 기능)

필드 유형

1. 라디오 버튼 (단일 선택)


[radio question="What is your favorite color?"]

- Red

- Blue

- Green

- Yellow

[/radio]

2. 체크박스 (다중 선택)


[checkbox question="Which features do you use? (Select all that apply)"]

- Email notifications

- Mobile app

- Desktop notifications

- API access

[/checkbox]

3. 드롭다운 선택


[dropdown question="What is your age group?"]

- Under 18

- 18-24

- 25-34

- 35-44

- 45-54

- 55+

[/dropdown]

4. 텍스트 영역 (긴 형식 텍스트)


[textarea question="Please provide detailed feedback:" required="false"]

[/textarea]

5. 숫자 선택


[number question="Rate this feature from 1-10:" min="1" max="10"]

[/number]

6. 별점 평가


[star question="How would you rate your overall experience?"]

[/star]

7. 엄지손가락 위/아래


[thumbs question="Would you recommend this to others?"]

[/thumbs]

필드 속성

모든 필드 유형은 다음 속성을 지원합니다:

  • question: 질문 텍스트 (필수)

  • required: 필드가 채워져야 하는지 여부 (true/false, 기본값은 true)

  • min: 숫자 필드의 최소값

  • max: 숫자 필드의 최대값

완전한 예시

기본 설문 Markdown

다음은 사용 가능한 모든 필드를 포함한 기본 설문 Markdown 예시입니다:

[survey name="awesome-survey-thumbs" title="Awesome Survey"]

[radio question="Choose any one option:"]
- cat
- dog
[/radio]

[checkbox question="Choose multiple options:"]
- red
- blue
- green
[/checkbox]

[dropdown question="Gender:"]
- Male
- Female
[/dropdown]

[number question="Rate this survey from 1 to 10:"]
[/number]

[textarea question="What is your feedback about xyz?" required="false"]
[/textarea]

[star question="How would you rate overall experience?"]
[/star]

[thumbs question="Were you satisfied with our services?"]
[/thumbs]

[/survey]

설문 렌더링

아래는 위의 Markdown이 Discourse에서 어떻게 렌더링되는지 보여주는 예시입니다:

고급 사용법

옵션에 이모지 사용하기


[radio question="Choose your favorite animal:"]

- 🐈 Cat

- 🐶 Dog

- 🐦 Bird

- 🐠 Fish

[/radio]

질문에 Markdown 서식 사용하기


[radio question="Which **programming language** do you prefer?"]
- JavaScript
- Python
- Ruby
- Go
[/radio]

[checkbox question="Select your *favorite* features:"]
- Speed
- Security
- Ease of use
[/checkbox]

[textarea question="Please read our [guidelines](https://example.com) and provide feedback:"]
[/textarea]

지원되는 서식:

  • 굵게: **text**
  • 기울임: *text*
  • 취소선: ~~text~~
  • 인라인 코드: `code`
  • 링크: [text](url)

필수 및 선택 필드 혼합


[survey name="mixed-survey"]

[radio question="What is your role?" required="true"]

- Developer

- Designer

- Manager

- Other

[/radio]

[textarea question="Any additional thoughts?" required="false"]

[/textarea]

[/survey]

설문 결과

현재 이 플러그인은 설문 결과를 직접 보기 위한 백엔드 UX가 없습니다. 대신 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개의 좋아요

이 문제를 다루고 계신 건 맞지만, 실제 우선순위는 낮게 설정되어 있는 건지 여쭤봐도 될까요?

이것이 지속적으로 개발되어 나간다면 정말 좋을 것 같아요 — 잠재력이 무궁무진하니까요.

위 SQL이 결과를 가져오긴 했지만, 다루기 쉬운 형식이 아니었습니다. 유용한 분석을 하려면 스프레드시트 수준에서 상당한 변환 작업이 필요했습니다.

하지만 Gen AI의 도움으로 매우 유용한 Data Explorer 쿼리를 작성할 수 있었습니다. Data Explorer의 몇 가지 제한 사항으로 인해 다양한 설문을 처리할 만큼 동적으로 만들기는 어렵습니다. 기본적으로 설문마다 맞춤형 쿼리가 필요합니다.

다행히 Gen AI를 사용하면 이를 비교적 쉽게 해결할 수 있습니다. 대부분의 Gen AI 서비스에서 작동할 가능성이 높은 샘플 프롬프트를 공유합니다 (AI 플러그인이 활성화되지 않은 경우) - 설문 마크다운을 그대로 붙여넣으면 됩니다:

특정 설문을 위한 맞춤형 SQL 쿼리를 생성하는 Gen AI 프롬프트

마크다운 형식으로 정의된 설문이 있으며, Data Explorer 플러그인을 사용하여 Discourse 데이터베이스에서 설문 결과를 추출하는 SQL 쿼리가 필요합니다. 설문에는 라디오, 드롭다운, 별점, 체크박스, 텍스트 영역, 엄지, 숫자 등 다양한 유형의 질문이 포함됩니다. 쿼리는 각 사용자가 한 행을 가지도록 하고, 각 질문이 자체 컬럼을 가지도록 결과를 출력해야 합니다. 체크박스 질문의 경우, 여러 응답을 하나의 문자열로 연결해야 합니다.

설문 마크다운은 다음과 같습니다:

여기에 설문 마크다운을 붙여넣으세요

설문 결과를 얻기 위해 사용된 원래 쿼리는 다음과 같습니다:

-- [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 쿼리를 생성해 주세요:

  • 설문 이름을 하드코딩합니다.
  • 각 질문을 컬럼으로 사용하기 위해 조건부 집계(conditional aggregation)를 사용하여 데이터를 피벗합니다.
  • 체크박스 질문의 여러 응답을 처리하기 위해 STRING_AGG를 사용합니다.
  • 출력이 user_id별로 그룹화되고 user_id 순으로 정렬되도록 합니다.
  • 가독성을 위해 포맷을 정리하고, 필요한 경우 로직을 설명하는 주석을 포함합니다.

Data Explorer 플러그인에 대한 추가 가이드:

  • 쿼리는 Discourse Data Explorer 플러그인과 호환되어야 하므로 세미콜론으로 끝나면 안 됩니다.
  • Data Explorer 내에서 자동 링크 기능을 활용하기 위해 user_id와 같은 컬럼 이름을 사용합니다.
  • 플러그인이 동적 SQL을 지원하지 않으므로 동적 SQL을 사용하지 않습니다.
  • 대규모 데이터셋에서 실행될 수 있으므로 쿼리가 효율적이고 성능이 최적화되도록 합니다.
9개의 좋아요

이것은 놀라울 정도로 다양한 기능을 갖춘 훌륭한 작은 플러그인입니다. 만들어 주셔서 감사합니다.

@nathank 결과를 빠르게 구축하는 가이드를 잘 만들어 주셨네요. 덕분에 전체적으로 훨씬 더 유용해졌습니다 :rocket: (OP로 옮기는 것이 좋을 것 같아요)

4개의 좋아요

셀프호스팅 사이트에 설치해서 직접 사용해 봤는데, 정말 괜찮네요!

이건 discourse의 기본 철학과는 정반대일 수 있지만, 로그인 없이 익명으로 완료할 수 있는 설문조사를 만들 수 있으면 좋겠습니다. 아니면 적어도 결과를 특정 사용자와 연결하지 않고 익명화할 수 있으면 좋겠네요.

물론, 데이터 익스플로러를 사용하지 않고도 투표처럼 결과를 바로 볼 수 있는 기능이 있다면 정말 훌륭할 것입니다.

8개의 좋아요

네, 저도 같은 문제를 겪었습니다. 해결책이 있길 바랍니다.

3개의 좋아요

설문 기능에 대한 업데이트가 있나요?

1개의 좋아요

참고로 어떤 업데이트를 기대하고 계셨나요?

간단하게 우리 커뮤니티에서 어떻게 작동하는지 테스트해 볼 수 있도록 이제 배포해도 될 것 같습니다 :slight_smile:

1개의 좋아요