/** * 登録作成 * * @param array $question 項目データ * @param bool $readonly 読み取り専用 * @return string 登録HTML * @SuppressWarnings(PHPMD.BooleanArgumentFlag) */ public function answer($question, $readonly = false) { // 項目セットをもらう // 種別に応じて項目&登録の要素を作成し返す $index = $question['key']; $baseFieldName = 'RegistrationAnswer.' . $index . '.0.'; $fieldName = $baseFieldName . 'answer_value'; $ret = call_user_func_array(array($this, $this->_answerFunc[$question['question_type']]), array($index, $fieldName, $question, $readonly)); if (!RegistrationsComponent::isMatrixInputType($question['question_type'])) { $ret .= $this->_error($fieldName); $ret .= $this->NetCommonsForm->hidden($baseFieldName . 'registration_answer_summary_id'); $ret .= $this->NetCommonsForm->hidden($baseFieldName . 'registration_question_key', array('value' => $index)); $ret .= $this->NetCommonsForm->hidden($baseFieldName . 'id'); $ret .= $this->NetCommonsForm->hidden($baseFieldName . 'matrix_choice_key', array('value' => null)); } return $ret; }
/** * _getResultDisplayList * 項目種別に応じて許されるisResultDisplayの設定値 * * @param int $questionType 項目種別 * @return array */ protected function _getResultDisplayList($questionType) { if (RegistrationsComponent::isOnlyInputType($questionType)) { return array(RegistrationsComponent::USES_NOT_USE); } return array(RegistrationsComponent::USES_USE, RegistrationsComponent::USES_NOT_USE); }
/** * _getAns * * @param array $question question data * @param array $answers answer data * @return string */ protected function _getAns($question, $answers) { $retAns = ''; // 登録配列データの中から、現在指定された項目に該当するものを取り出す $ans = Hash::extract($answers, '{n}.RegistrationAnswer[registration_question_key=' . $question['key'] . ']'); // 登録が存在するとき処理 if (!$ans) { // 通常の処理ではこのような場面はありえない // 登録フォームは空登録であっても登録レコードを作成するからです // データレコード異常があった場合のみです // ただ、この登録を異常データだからといってオミットすると、サマリの合計数と // 合わなくなって集計データが狂ってしまうので空登録だったように装って処理します return $retAns; } $ans = $ans[0]; // 単純入力タイプのときは登録の値をそのまま返す if (RegistrationsComponent::isOnlyInputType($question['question_type'])) { $retAns = $ans['answer_value']; } elseif (RegistrationsComponent::isSelectionInputType($question['question_type'])) { // choice_id と choice_valueに分けられた登録選択肢配列を得る // 選択されていた数分処理 foreach ($ans['answer_values'] as $choiceKey => $dividedAns) { // idから判断して、その他が選ばれていた場合、other_answer_valueを入れる $choice = Hash::extract($question['RegistrationChoice'], '{n}[key=' . $choiceKey . ']'); if ($choice) { $choice = $choice[0]; if ($choice['other_choice_type'] != RegistrationsComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) { $retAns .= $ans['other_answer_value']; } else { $retAns .= $dividedAns; } $retAns .= RegistrationsComponent::ANSWER_DELIMITER; } } $retAns = trim($retAns, RegistrationsComponent::ANSWER_DELIMITER); } return $retAns; }
/** * getAggrigates * 集計処理の実施 * * @param array $registration 登録フォーム情報 * @return void */ public function getAggregate($registration) { $this->RegistrationAnswer = ClassRegistry::init('Registrations.RegistrationAnswer', true); // 項目データのとりまとめ //$questionsは、registration_question_keyをキーとし、registration_question配下が代入されている。 $questions = Hash::combine($registration, 'RegistrationPage.{n}.RegistrationQuestion.{n}.key', 'RegistrationPage.{n}.RegistrationQuestion.{n}'); // 集計データを集める際の基本条件 $baseConditions = $this->getResultCondition($registration); //項目毎に集計 foreach ($questions as &$question) { if (RegistrationsComponent::isOnlyInputType($question['question_type'])) { continue; } if ($question['is_result_display'] != RegistrationsComponent::EXPRESSION_SHOW) { //集計表示をしない、なので飛ばす continue; } // 戻り値の、この項目の合計登録数を記録しておく。 // skip ロジックがあるため、単純にsummaryのcountじゃない.. $questionConditions = $baseConditions + array('RegistrationAnswer.registration_question_key' => $question['key']); $question['answer_total_cnt'] = $this->RegistrationAnswer->getAnswerCount($questionConditions); if (RegistrationsComponent::isMatrixInputType($question['question_type'])) { $this->__aggregateAnswerForMatrix($question, $questionConditions); } else { $this->__aggregateAnswerForNotMatrix($question, $questionConditions); } } return $questions; }
/** * __errorMessageUnique * マトリクスの同じエラーメッセージをまとめる * * @param array $question question * @param array $errors error message * @return array */ private function __errorMessageUnique($question, $errors) { if (!RegistrationsComponent::isMatrixInputType($question['question_type'])) { return $errors; } $ret = array(); foreach ($errors as $err) { if (!in_array($err, $ret)) { $ret[] = $err; } } return $ret; }