v1.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?php
  2. namespace zin;
  3. requireWg('thinkQuestion');
  4. class thinkMulticolumn extends thinkQuestion
  5. {
  6. /**
  7. * @var mixed[]
  8. */
  9. protected static $defineProps = array
  10. (
  11. 'fields?: array', // 列标题
  12. 'requiredCols?: array', // 必填列
  13. 'supportAdd?: int=1', // 是否支持用户添加行
  14. 'canAddRows: int', // 可添加行数
  15. 'linkColumn?: array', // 关联区块的列
  16. 'setOption?: bool=false', // 选项配置方式
  17. 'quoteTitle?: string', // 列标题
  18. 'quoteQuestions?: array', // 引用问题
  19. 'citation?: int=1', // 引用方式
  20. 'selectColumn?: string', // 选择列
  21. 'modeClass?: string', // 弹窗样式名称
  22. );
  23. public static function getPageJS()
  24. {
  25. return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
  26. }
  27. public static function getPageCSS()
  28. {
  29. $baseCss = file_get_contents(dirname(__FILE__, 2) . DS . 'thinkstepbase' . DS . 'css' . DS . 'v1.css');
  30. return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css') . $baseCss;
  31. }
  32. /**
  33. * @param string $label
  34. * @param int $index
  35. */
  36. protected function buildFormBatchItem($label, $index, $isRun, $quotedQuestions, $hasResult)
  37. {
  38. $step = $this->prop('step');
  39. $key = $index + 1;
  40. $requiredCols = isset($step->options->requiredCols) ? $step->options->requiredCols : array();
  41. $runDisabled = $isRun && !empty($quotedQuestions) && $hasResult;
  42. $preViewDisabled = !$isRun && $hasResult;
  43. return formBatchItem
  44. (
  45. set::label($label),
  46. set::name("result[col$key]"),
  47. set::width('110px'),
  48. set::disabled($runDisabled || $preViewDisabled),
  49. set::required(!empty($step->options->required) && empty($step->options->fields) ? true : in_array($key, $requiredCols))
  50. );
  51. }
  52. /**
  53. * @param mixed[] $data
  54. */
  55. protected function processResult($data)
  56. {
  57. if(empty($data)) return array();
  58. $result = array();
  59. for($i = 1; $i <= count(get_object_vars($data['col1'])); $i++)
  60. {
  61. $item = new stdClass();
  62. foreach($data as $key => $values)
  63. {
  64. $values = json_decode(json_encode($values), true);
  65. $name = "result[$key]";
  66. $item->$name = isset($values[$i]) ? $values[$i] : '';
  67. }
  68. $result[$i] = $item;
  69. }
  70. $filterData = array_filter($result, function($resultItem)
  71. {
  72. return array_filter((array)$resultItem);
  73. });
  74. return array_values($filterData);
  75. }
  76. protected function buildDetail()
  77. {
  78. global $lang;
  79. $detailWg = parent::buildDetail();
  80. list($step, $fields, $canAddRows, $mode, $isRun, $quotedQuestions, $isResult, $modeClass) = $this->prop(array('step', 'fields', 'canAddRows', 'mode', 'isRun', 'quotedQuestions', 'isResult', 'modeClass'));
  81. if($mode != 'detail') return array();
  82. $result = array();
  83. if($step)
  84. {
  85. $fields = $step->options->fields;
  86. $canAddRows = $step->options->supportAdd == 1 ? $step->options->canAddRows : 0;
  87. $answer = $step->answer;
  88. $result = isset($answer->result) && !empty($answer->result) ? (array) $answer->result : array();
  89. }
  90. $runDisabled = $isRun && !empty($quotedQuestions) && !empty($result);
  91. $preViewDisabled = !$isRun && !empty($result);
  92. jsVar('canAddRowsOfMulticol', $canAddRows + 5);
  93. jsVar('addRowsTips', $lang->thinkrun->tips->addRow);
  94. jsVar('addLang', $lang->thinkrun->add);
  95. jsVar('disabled', $runDisabled || $preViewDisabled);
  96. $fields = array_values((array)$fields);
  97. $batchItems = array();
  98. $defalutField = $lang->thinkstep->columnReference;
  99. if(empty($fields)) $fields = array($defalutField, $defalutField, $defalutField, $defalutField);
  100. foreach($fields as $key => $field) $batchItems[] = $this->buildFormBatchItem($field, (int)$key, $isRun, $quotedQuestions, !empty($result));
  101. if($isResult || $isRun || !empty($result)) $result = $this->processResult($result);
  102. $detailWg[] = formBatch
  103. (
  104. setClass('think-form-batch'),
  105. set::minRows(5),
  106. set::mode($isResult ? 'edit' : 'add'),
  107. set::actions(array()),
  108. set::onRenderRow(jsRaw('renderRowData')),
  109. $isRun ? formHidden('status', '') : null,
  110. set::data($result),
  111. setData('modeClass', !empty($modeClass) ? '.' . $modeClass : ''),
  112. $batchItems
  113. );
  114. return $detailWg;
  115. }
  116. protected function buildFormItem()
  117. {
  118. global $lang, $app;
  119. $app->loadLang('thinkstep');
  120. $formItems = parent::buildFormItem();
  121. list($step, $questionType, $required, $fields, $supportAdd, $canAddRows, $quotedQuestions, $linkColumn, $setOption, $requiredCols, $quoteQuestions) = $this->prop(array('step', 'questionType', 'required', 'fields', 'supportAdd', 'canAddRows', 'quotedQuestions', 'linkColumn','setOption', 'requiredCols', 'quoteQuestions'));
  122. $requiredOptions = array();
  123. $linkColumn = !empty($linkColumn) ? $linkColumn : array();
  124. if($step)
  125. {
  126. $required = isset($step->options->required) ? $step->options->required : 1;
  127. if(!empty($step->options->fields)) $step->options->fields = is_string($step->options->fields) ? explode(', ', $step->options->fields) : array_values((array)$step->options->fields);
  128. $fields = $step->options->fields;
  129. $linkColumn = !empty($step->link) ? json_decode($step->link)->column : array();
  130. $requiredCols = $required && isset($step->options->requiredCols) ? $step->options->requiredCols : '';
  131. $setOption = isset($step->options->setOption) ? $step->options->setOption : false;
  132. $supportAdd = $step->options->supportAdd;
  133. $canAddRows = $supportAdd && isset($step->options->canAddRows) ? $step->options->canAddRows : '';
  134. foreach($fields as $key => $field) $requiredOptions[] = array('value' => $key + 1, 'text' => $field);
  135. $fields = !empty($step->options->fields) ? $step->options->fields : array('', '', '', '');
  136. }
  137. $requiredTip = !empty($quotedQuestions) ? $lang->thinkstep->tips->required : $lang->thinkstep->tips->multicolumnRequired;
  138. jsVar('canAddRowsOfMulticol', (int)$canAddRows + 5);
  139. jsVar('addRowsTips', $lang->thinkrun->tips->addRow);
  140. jsVar('addLang', $lang->thinkrun->add);
  141. jsVar('tipQuestion', $lang->thinkstep->tips->question);
  142. jsVar('requiredColTip', $lang->thinkstep->tips->requiredCol);
  143. $formItems[] = array(
  144. formHidden('options[questionType]', $questionType),
  145. thinkStepQuote(set::step($step), set::questionType($questionType), set::quoteQuestions($quoteQuestions), set::quotedQuestions($quotedQuestions)),
  146. formGroup
  147. (
  148. set::label($lang->thinkstep->label->columnTitle),
  149. setClass('think-options-field', $setOption == 1 ? 'hidden' : ''),
  150. setStyle(array('padding-bottom' => 'calc(4 * var(--space))')),
  151. thinkMatrixOptions(set::colName('options[fields]'), set::cols($fields), set::quotedQuestions($quotedQuestions), set::linkColumn($linkColumn))
  152. ),
  153. formRow
  154. (
  155. formGroup
  156. (
  157. setClass('step-required'),
  158. set::width('1/2'),
  159. set::label($lang->thinkstep->label->required),
  160. set::labelClass('required-tip'),
  161. set::labelHint($requiredTip),
  162. set::labelHintClass(empty($setOption) ? 'hidden' : ''),
  163. radioList
  164. (
  165. set::name('options[required]'),
  166. set::inline(true),
  167. set::value($required),
  168. set::items($lang->thinkstep->requiredList),
  169. set::disabled(!empty($quotedQuestions)),
  170. on::change()->do("hiddenRequiredCols()")
  171. )
  172. ),
  173. formGroup
  174. (
  175. set::width('1/2'),
  176. set::label($lang->thinkstep->label->requiredCol),
  177. set::required(true),
  178. setClass('required-options', $required && empty($setOption)? '' : 'hidden'),
  179. setData('quotedQuestions', $quotedQuestions),
  180. setData('requiredCols', $requiredCols),
  181. picker
  182. (
  183. set::name('options[requiredCols][]'),
  184. set::items($requiredOptions),
  185. set::value($requiredCols),
  186. set::multiple(true),
  187. bind::change('changeRequiredCols()')
  188. )
  189. )
  190. ),
  191. formRow
  192. (
  193. formGroup
  194. (
  195. setClass('w-1/2'),
  196. set::label($lang->thinkstep->label->isSupportAdd),
  197. set::labelHint($lang->thinkstep->tips->supportAdd),
  198. radioList
  199. (
  200. set::name('options[supportAdd]'),
  201. set::inline(true),
  202. set::items($lang->thinkstep->requiredList),
  203. set::value(is_null($supportAdd) ? 1 : $supportAdd),
  204. on::change()->toggleClass('.can-add-rows', 'hidden', 'target.value == 0')
  205. )
  206. ),
  207. formGroup
  208. (
  209. setClass('w-1/2 can-add-rows', (is_null($supportAdd) || $supportAdd) ? '' : 'hidden'),
  210. set::label($lang->thinkstep->label->canAddRows),
  211. set::required(true),
  212. input
  213. (
  214. set::type('number'),
  215. set::name('options[canAddRows]'),
  216. set::value($canAddRows),
  217. set::placeholder($lang->thinkstep->placeholder->inputContent),
  218. set::min(1),
  219. on::input('changeRows')
  220. )
  221. )
  222. )
  223. );
  224. return $formItems;
  225. }
  226. }