/**
  * 登録作成
  *
  * @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;
 }