/** * 登録作成 * * @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; }
/** * _checkChoiceExists * * 適正な選択肢を持っているか * * @return bool */ protected function _checkChoiceExists() { $questionType = $this->data['RegistrationQuestion']['question_type']; // テキストタイプ、テキストエリアタイプの時は選択肢不要 if (RegistrationsComponent::isOnlyInputType($questionType)) { return true; } // 上記以外の場合は最低1つは必要 if (!Hash::check($this->data, 'RegistrationChoice.{n}')) { $this->validationErrors['question_type'][] = __d('registrations', 'please set at least one choice.'); return false; } // マトリクスタイプの時は行に1つ列に一つ必要 // マトリクスタイプのときは、行、カラムの両方ともに最低一つは必要 if (RegistrationsComponent::isMatrixInputType($questionType)) { $rows = Hash::extract($this->data['RegistrationChoice'], '{n}[matrix_type=' . RegistrationsComponent::MATRIX_TYPE_ROW_OR_NO_MATRIX . ']'); $cols = Hash::extract($this->data['RegistrationChoice'], '{n}[matrix_type=' . RegistrationsComponent::MATRIX_TYPE_COLUMN . ']'); if (empty($rows) || empty($cols)) { $this->validationErrors['question_type'][] = __d('registrations', 'please set at least one choice at row and column.'); return false; } } return true; }
/** * _getRow * * @param array $registration registration data * @param array $summary answer summary * @param array $answers answer data * @return array */ protected function _getRows($registration, $summary, $answers) { // ページ、項目のループから、取り出すべき項目のIDを順番に取り出す // question loop // 返却用配列にquestionのIDにマッチするAnswerを配列要素として追加、Answerがないときは空文字 // なお選択肢系のものはchoice_idが登録にくっついているのでそれを削除する // MatrixのものはMatrixの行数分返却行の列を加える // その他の選択肢の場合は、入力されたその他のテキストを入れる $cols = array(); $cols[] = $this->_getUserName($registration, $summary); $cols[] = $summary['RegistrationAnswerSummaryCsv']['modified']; $cols[] = $summary['RegistrationAnswerSummaryCsv']['answer_number']; foreach ($registration['RegistrationPage'] as $page) { foreach ($page['RegistrationQuestion'] as $question) { if (RegistrationsComponent::isMatrixInputType($question['question_type'])) { foreach ($question['RegistrationChoice'] as $choice) { if ($choice['matrix_type'] == RegistrationsComponent::MATRIX_TYPE_ROW_OR_NO_MATRIX) { $cols[] = $this->_getMatrixAns($question, $choice, $answers); } } } else { $cols[] = $this->_getAns($question, $answers); } } } return $cols; }
/** * 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; }