iT邦幫忙

0

Limesurvey進階應用--改造Multiple choice with comments題型

  • 分享至 

  • xImage
  •  

帶有文字欄位的複選題並不常見,但可應用於較複雜的特殊情形。由於系統預設的情況是每個選項後面都會連帶一個文字欄位(類似以下的情形)。
https://ithelp.ithome.com.tw/upload/images/20241103/20142528bHOY9X5WYn.png
而實際的情形下,並非每個選項都一定需要文字欄位。像上面的例子中,「有就學,但沒有上述支出」、「未就學」、「不知道」、「拒答」其實都不需要後面的文字欄位。另外,文字欄位可輸入任何內容,也會增加後續資料處理的難度,像此例中就會希望限制輸入內容為數字。因此,我們想要對Multiple choice with comments題型做四點改造:

  1. 移除部分選項的文字欄位。
  2. 設定複選題選項間的互斥。
  3. 對文字欄位可填寫的內容做一些限制。
  4. 為文字欄位加上前綴(prefix)或後置(suffix)文字。

移除部分選項的文字欄位

此功能可透過javascript處理,語法如下:

    $('#question{QID} ul.ls-answers li:eq(3) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(4) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(5) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(6) .comment-item').remove();

其中{QID}為Limesurvey的語法,會帶入該題的題代號。li:eq()則是指定要隱藏的選項,此處是從0開始起算,因此在上面的例子中,我要隱藏的是第4-7個選項,eq中的編號就是3-6。

設定複選題選項互斥

此例子中的選項間的關係相對單純,其中前三個選項可能同時發生,因此可複選;而後面4個選項則應各自單獨選擇。此情形可使用Limesurvey內建的Exclusive option功能,在其對話框內填入後四個選項的代號(以分號分隔)"04;05;06;07"即可。如果遇到比較複雜的選項間兩兩互斥的情形,則可參考我之前另一篇文章Limesurvey進階應用--複選題選項間互斥,以javascript進行設定。

對文字欄位可填寫的內容做一些限制

此處,我們則會使用Limesurvey的內建函數regexMatch,以正則表示的方式處理。regexMatch(pattern,input)函數包含兩個參數,第一個參數是正則表示式,第二個參數是比對的欄位(變數)。函數會回傳true or false。
我們分別在Question validation equation欄位中設定可接受的範圍,並於Question validation tip欄位中加入數值輸入錯誤時的提示。

Question validation equation設定可接受數值範圍

假設我們預定可接受的範圍為1000-9900000,另外也增加96代表不知道,98代表拒答。則正則表示式為"^(95|96|98|[1-9][0-9]{3,6})$"。我們講對前三個選項附帶的文字欄位在Question validation equation進行設定,語法如下:

(is_empty(self.sq_01comment) || regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_01comment)) && 
(is_empty(self.sq_02comment) || regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_02comment)) && 
(is_empty(self.sq_03comment) || regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_03comment))

三段語法基本上是相同的。"self.sq_01comment"是Limesurvey的語法,代表 "本題選項01的文字欄位"。由於該選項有可能沒有被選擇,此時文字欄位就會是空的,因此在規則中我們可接受該欄位是空值,但如果有內容時,則必須符合後面的正則表示規則。

於Question validation tip欄位中加入錯誤提示

在此我們使用Limesurvey內建的if函數,為輸入內容錯誤時加入錯誤提示。語法如下:

{if((!is_empty(self.sq_01comment) && !regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_01comment)), "<span style='color:red'>補習支出金額錯誤。</span><br>", "")}
{if((!is_empty(self.sq_02comment) && !regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_02comment)), "<span style='color:red'>才藝課程支出金額錯誤。</span><br>", "")}
{if((!is_empty(self.sq_03comment) && !regexMatch('/^(95|96|98|[1-9][0-9]{3,6})$/', self.sq_03comment)), "<span style='color:red'>其他教育支出金額錯誤。</span>", "")}

三段語法基本上也是類似的。我們的邏輯條件是,當文字欄位有內容,且內容不符合正則表示時,顯示錯誤訊息。

為文字欄位加上前綴(prefix)或後置(suffix)文字

此部分同樣透過javascript來處理,作法與Limesurvey進階應用--多重數值題設定不同前後文字及填答範圍類似。語法如下:

   $('#question{QID} .comment-item').each(function(index) {
      $(this).prepend('<span class="comment-prefix">去年總共</span>');
      $(this).append('<span class="comment-suffix">元</span>'); 
    });

由於這次我們是要幫所有的文字欄位都加上前綴及後置文字,因此我們使用.each來讓城市更為簡潔。
另外,為了讓加上的文字與題目的字體顏色相符,我們也可透過css調整。

<style type="text/css">#question{QID} input[type="text"] {
    width: auto;
    display: inline-block;
  }
    .comment-prefix, .comment-suffix {
    color:  #6c757d;       /* 設置文字顏色為灰色 */
  }
  /* 調整前綴和後綴的顯示位置 */
  .comment-prefix {
    margin-right: 5px; /* 控制前綴和文字框的距離 */
  }
  .comment-suffix {
    margin-left: 5px; /* 控制文字框和後綴的距離 */
  }
</style>

整體效果

綜合1及4,我們要插入題目原始碼的完整語法如下:

<script type="text/javascript" charset="utf-8">
 
  $(document).on('ready pjax:scriptcomplete',function(){
 
    // Remove the first comment box
    $('#question{QID} ul.ls-answers li:eq(3) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(4) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(5) .comment-item').remove();
    $('#question{QID} ul.ls-answers li:eq(6) .comment-item').remove();
 
    // Insert comment suffixes
    $('#question{QID} .comment-item').each(function(index) {
      $(this).prepend('<span class="comment-prefix">去年總共</span>'); 
      $(this).append('<span class="comment-suffix">元</span>');
    });
  });
</script>
<style type="text/css">#question{QID} input[type="text"] {
    width: auto;
    display: inline-block;
  }
    .comment-prefix, .comment-suffix {
    color:  #6c757d;
  }
 
  .comment-prefix {
    margin-right: 5px;
  }
  .comment-suffix {
    margin-left: 5px; 
  }
</style>

成果如下:
https://ithelp.ithome.com.tw/upload/images/20241103/201425288MZCEuBbow.png

這次的改造應用了之前其他題型的類似作法。但這個題型相對少見,不知道對大家是否有幫助??


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言