BxFdbFormQuestion.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup Feedback Feedback
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. class BxFdbFormQuestionCheckerHelper extends BxDolFormCheckerHelper
  12. {
  13. static public function checkAvailAnswers ($s)
  14. {
  15. $iCountMin = 2;
  16. if(self::_isEmptyArray($s) || count($s) < $iCountMin)
  17. return false;
  18. $iCount = 0;
  19. foreach($s as $k => $v)
  20. if(!empty($v))
  21. $iCount += 1;
  22. return $iCount >= $iCountMin;
  23. }
  24. }
  25. class BxFdbFormQuestion extends BxBaseModTextFormEntry
  26. {
  27. protected $_sJsObject;
  28. public function __construct($aInfo, $oTemplate = false)
  29. {
  30. $this->MODULE = 'bx_feedback';
  31. parent::__construct($aInfo, $oTemplate);
  32. $this->_sJsObject = $this->_oModule->_oConfig->getJsObject('question');
  33. }
  34. function initChecker ($aValues = array (), $aSpecificValues = array())
  35. {
  36. $CNF = &$this->_oModule->_oConfig->CNF;
  37. if(isset($this->aInputs[$CNF['FIELD_ANSWERS']]) && !empty($aValues['id'])) {
  38. $aAnswers = $this->_oModule->_oDb->getAnswers(array(
  39. 'type' => 'question_id',
  40. 'question_id' => $aValues['id']
  41. ));
  42. $this->aInputs[$CNF['FIELD_ANSWERS']] = array_merge($this->aInputs[$CNF['FIELD_ANSWERS']], array(
  43. 'value' => array(),
  44. 'value_ids' => array(),
  45. 'value_imps' => array()
  46. ));
  47. foreach($aAnswers as $aAnswer) {
  48. $this->aInputs[$CNF['FIELD_ANSWERS']]['value'][] = $aAnswer['title'];
  49. $this->aInputs[$CNF['FIELD_ANSWERS']]['value_ids'][] = $aAnswer['id'];
  50. if((int)$aAnswer['important'] == 1)
  51. $this->aInputs[$CNF['FIELD_ANSWERS']]['value_imps'][] = $aAnswer['title'];
  52. }
  53. }
  54. return parent::initChecker($aValues, $aSpecificValues);
  55. }
  56. public function insert ($aValsToAdd = array(), $isIgnore = false)
  57. {
  58. $CNF = &$this->_oModule->_oConfig->CNF;
  59. $iContentId = parent::insert($aValsToAdd, $isIgnore);
  60. if(!empty($iContentId))
  61. $this->processAnswersAdd($CNF['FIELD_ANSWERS'], $iContentId);
  62. return $iContentId;
  63. }
  64. public function update ($iContentId, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
  65. {
  66. $CNF = &$this->_oModule->_oConfig->CNF;
  67. $iResult = parent::update($iContentId, $aValsToAdd, $aTrackTextFieldsChanges);
  68. $this->processAnswersUpdate($CNF['FIELD_ANSWERS'], $iContentId);
  69. return $iResult;
  70. }
  71. public function processAnswersAdd ($sField, $iContentId = 0)
  72. {
  73. $CNF = &$this->_oModule->_oConfig->CNF;
  74. if(!isset($this->aInputs[$sField]))
  75. return true;
  76. $aAnswers = $this->getCleanValue($sField);
  77. if(empty($aAnswers) || !is_array($aAnswers))
  78. return true;
  79. $aAnswersImps = $this->getCleanValue($sField . '_imps');
  80. $bAnswersImps = !empty($aAnswersImps) && is_array($aAnswersImps);
  81. foreach($aAnswers as $iIndex => $sAnswer)
  82. if($sAnswer != '' && get_mb_len($sAnswer) > 0)
  83. $this->_oModule->_oDb->insertAnswer(array(
  84. 'question_id' => $iContentId,
  85. 'title' => bx_process_input($sAnswer),
  86. 'important' => $bAnswersImps && in_array($sAnswer, $aAnswersImps) ? 1 : 0,
  87. 'order' => $iIndex
  88. ));
  89. return true;
  90. }
  91. public function processAnswersUpdate($sField, $iContentId = 0)
  92. {
  93. $CNF = &$this->_oModule->_oConfig->CNF;
  94. if(!isset($this->aInputs[$sField]))
  95. return true;
  96. $aAnswersValues = $this->getCleanValue($sField);
  97. $aAnswersIds = $this->getCleanValue($sField . '_ids');
  98. if(empty($aAnswersIds) || !is_array($aAnswersIds))
  99. $aAnswersIds = array();
  100. $aAnswersImps = $this->getCleanValue($sField . '_imps');
  101. if(empty($aAnswersImps) || !is_array($aAnswersImps))
  102. $aAnswersImps = array();
  103. //--- Remove deleted
  104. $aAnswersDb = $this->_oModule->_oDb->getAnswers(array('type' => 'question_id_pairs', 'question_id' => $iContentId));
  105. $this->_oModule->_oDb->deleteAnswerById(array_diff(array_keys($aAnswersDb), $aAnswersIds));
  106. //--- Update existed and remove empty
  107. foreach($aAnswersIds as $iIndex => $iAnswerId) {
  108. $sAnswersValue = $aAnswersValues[$iIndex];
  109. if($sAnswersValue != '' && get_mb_len($sAnswersValue) > 0)
  110. $this->_oModule->_oDb->updateAnswer(array(
  111. 'title' => bx_process_input($sAnswersValue),
  112. 'important' => in_array($sAnswersValue, $aAnswersImps) ? 1 : 0
  113. ), array('id' => (int)$iAnswerId));
  114. else
  115. $this->_oModule->_oDb->deleteAnswer(array('id' => (int)$iAnswerId));
  116. }
  117. //--- Add new
  118. $iAnswersIds = count($aAnswersIds);
  119. $iAnswersValues = count($aAnswersValues);
  120. if($iAnswersValues > $iAnswersIds) {
  121. $iMaxOrder = (int)$this->_oModule->_oDb->getAnswers(array('type' => 'question_id_max_order', 'question_id' => $iContentId));
  122. $aAnswersValues = array_slice($aAnswersValues, $iAnswersIds);
  123. foreach($aAnswersValues as $sAnswersValue)
  124. if($sAnswersValue != '' && get_mb_len($sAnswersValue) > 0)
  125. $this->_oModule->_oDb->insertAnswer(array(
  126. 'question_id' => $iContentId,
  127. 'title' => bx_process_input($sAnswersValue),
  128. 'important' => in_array($sAnswersValue, $aAnswersImps) ? 1 : 0,
  129. 'order' => ++$iMaxOrder
  130. ));
  131. }
  132. return true;
  133. }
  134. protected function genCustomInputAnswers(&$aInput)
  135. {
  136. if(!empty($aInput['value']) && is_array($aInput['value'])) {
  137. $aAnswersImp = array();
  138. if(!empty($aInput['value_imps']) && is_array($aInput['value_imps']))
  139. $aAnswersImp = $aInput['value_imps'];
  140. $aTmplVarsAnswers = array();
  141. foreach($aInput['value'] as $iIndex => $sValue) {
  142. $sInputText = $this->genCustomInputAnswersText($aInput, $sValue);
  143. if(!empty($aInput['value_ids'][$iIndex]))
  144. $sInputText .= $this->genCustomInputAnswersHidden($aInput, (int)$aInput['value_ids'][$iIndex]);
  145. $sInputCheckbox = $this->genCustomInputAnswersCheckbox($aInput, $sValue, in_array($sValue, $aAnswersImp));
  146. $aTmplVarsAnswers[] = array(
  147. 'js_object' => $this->_sJsObject,
  148. 'input_text' => $sInputText,
  149. 'input_checkbox' => $sInputCheckbox
  150. );
  151. }
  152. }
  153. else {
  154. $aAnswer = array(
  155. 'js_object' => $this->_sJsObject,
  156. 'input_text' => $this->genCustomInputAnswersText($aInput),
  157. 'input_checkbox' => $this->genCustomInputAnswersCheckbox($aInput)
  158. );
  159. $aTmplVarsAnswers = array($aAnswer, $aAnswer);
  160. }
  161. return $this->_oModule->_oTemplate->parseHtmlByName('form_answers.html', array(
  162. 'bx_repeat:answers' => $aTmplVarsAnswers,
  163. 'btn_add' => $this->genCustomInputAnswersButton($aInput)
  164. ));
  165. }
  166. protected function genCustomInputAnswersText($aInput, $mixedValue = '')
  167. {
  168. $aInput['type'] = 'text';
  169. $aInput['name'] .= '[]';
  170. $aInput['value'] = $mixedValue;
  171. if(!is_array($aInput['attrs']))
  172. $aInput['attrs'] = array();
  173. $sJsMethod = 'javascript:' . $this->_sJsObject . '.answerOnType(event)';
  174. $aInput['attrs'] = array_merge($aInput['attrs'], array(
  175. 'class' => 'bx-def-margin-sec-top-auto',
  176. 'onkeyup' => $sJsMethod,
  177. 'onpaste' => $sJsMethod,
  178. 'onblur' => $sJsMethod
  179. ));
  180. return $this->genInput($aInput);
  181. }
  182. protected function genCustomInputAnswersCheckbox($aInput, $mixedValue = '', $bChecked = false)
  183. {
  184. $aInput['type'] = 'checkbox';
  185. $aInput['name'] .= '_imps[]';
  186. $aInput['caption'] = _t('_bx_feedback_form_question_input_answers_imp');
  187. $aInput['value'] = $mixedValue;
  188. $aInput['required'] = 0;
  189. if($bChecked)
  190. $aInput['checked'] = 'checked';
  191. return $this->genRow($aInput);
  192. }
  193. protected function genCustomInputAnswersHidden($aInput, $mixedValue = '')
  194. {
  195. $aInput['type'] = 'hidden';
  196. $aInput['name'] .= '_ids[]';
  197. $aInput['value'] = $mixedValue;
  198. return $this->genInput($aInput);
  199. }
  200. protected function genCustomInputAnswersButton($aInput)
  201. {
  202. $sName = $aInput['name'];
  203. $aInput['type'] = 'button';
  204. $aInput['name'] .= '_add';
  205. $aInput['value'] = _t('_bx_feedback_form_question_input_answers_add');
  206. $aInput['attrs']['class'] = 'bx-def-margin-sec-top';
  207. $aInput['attrs']['onclick'] = $this->_oModule->_oConfig->getJsObject('question') . ".answerAdd(this, '" . $sName . "');";
  208. return $this->genInputButton($aInput);
  209. }
  210. }
  211. /** @} */