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