Skip to content

Commit

Permalink
Merge pull request #215 from NetCommons3/speedup
Browse files Browse the repository at this point in the history
Speedup
  • Loading branch information
ohga21 committed Aug 30, 2018
2 parents 7877eaa + 7bdff25 commit c40f19b
Show file tree
Hide file tree
Showing 21 changed files with 286 additions and 193 deletions.
12 changes: 7 additions & 5 deletions Controller/QuestionnaireBlocksController.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,12 @@ public function index() {
),
'recursive' => -1,
));
$frame = Hash::combine($frame,
'{n}.QuestionnaireFrameDisplayQuestionnaire.questionnaire_key',
'{n}.QuestionnaireFrameDisplayQuestionnaire.questionnaire_key');
$this->request->data['QuestionnaireFrameDisplayQuestionnaire'] = $frame;
$frameInfo = [];
foreach ($frame as $item) {
$item = $item['QuestionnaireFrameDisplayQuestionnaire'];
$frameInfo[$item['questionnaire_key']] = $item['questionnaire_key'];
}
$this->request->data['QuestionnaireFrameDisplayQuestionnaire'] = $frameInfo;
$this->set('questionnaires', $questionnaire);
}

Expand Down Expand Up @@ -298,4 +300,4 @@ public function export() {
// 出力
return $zipWrapperFile->download(rawurlencode($exportFileName));
}
}
}
11 changes: 7 additions & 4 deletions Controller/QuestionnaireEditController.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public function beforeRender() {
//ウィザード
foreach ($this->helpers['NetCommons.Wizard']['navibar'] as &$actions) {
$urlParam = $actions['url'];
$urlParam = Hash::merge($urlParam, $this->request->params['named']);
$urlParam += $this->request->params['named'];
foreach ($this->request->params['pass'] as $passParam) {
$urlParam[$passParam] = null;
}
Expand Down Expand Up @@ -502,16 +502,19 @@ private function __setupViewParameters($questionnaire, $backUrl) {

$this->set('questionTypeOptions', $this->Questionnaires->getQuestionTypeOptionsWithLabel());
$this->set('isPublished', $isPublished);
$this->set('questionnaireKey', Hash::get($questionnaire, 'Questionnaire.key'));
$this->set('questionnaireKey', isset($questionnaire['Questionnaire']['key'])
? $questionnaire['Questionnaire']['key']
: null);

$isMailSetting = $this->MailSetting->getMailSetting(
array(
'plugin_key' => 'questionnaires',
'block_key' => Current::read('Block.key')
)
);
$isMailSetting = Hash::get($isMailSetting, 'MailSetting.is_mail_send');
$this->set('isMailSetting', $isMailSetting);
$this->set('isMailSetting', isset($isMailSetting['MailSetting']['is_mail_send'])
? $isMailSetting['MailSetting']['is_mail_send']
: null);

$this->request->data = $questionnaire;
$this->request->data['Frame'] = Current::read('Frame');
Expand Down
36 changes: 2 additions & 34 deletions Controller/QuestionnairesAppController.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -46,38 +46,6 @@ class QuestionnairesAppController extends AppController {
'Questionnaires.QuestionnairesOwnAnswer',
);

/**
* _sorted method
* to sort a given array by key
*
* @param array $obj data array
* @return array ソート後配列
*/
protected function _sorted($obj) {
// シーケンス順に並び替え、かつ、インデックス値は0オリジン連番に変更
// ページ配列もないのでそのまま戻す
if (!Hash::check($obj, 'QuestionnairePage.{n}')) {
return $obj;
}
$obj['QuestionnairePage'] =
Hash::sort($obj['QuestionnairePage'], '{n}.page_sequence', 'asc', 'numeric');

foreach ($obj['QuestionnairePage'] as &$page) {
if (Hash::check($page, 'QuestionnaireQuestion.{n}')) {
$page['QuestionnaireQuestion'] =
Hash::sort($page['QuestionnaireQuestion'], '{n}.question_sequence', 'asc', 'numeric');

foreach ($page['QuestionnaireQuestion'] as &$question) {
if (Hash::check($question, 'QuestionnaireChoice.{n}')) {
$question['QuestionnaireChoice'] =
Hash::sort($question['QuestionnaireChoice'], '{n}.choice_sequence', 'asc', 'numeric');
}
}
}
}
return $obj;
}

/**
* changeBooleansToNumbers method
* to change the Boolean value of a given array to 0,1
Expand Down Expand Up @@ -142,8 +110,8 @@ protected function _changeBoolean($orig) {
* @return void
*/
protected function _decideSettingLayout() {
$isSetting = Hash::get($this->request->params, 'named.q_mode');
if ($isSetting == 'setting') {
if (isset($this->request->params['named']['q_mode']) &&
$this->request->params['named']['q_mode'] == 'setting') {
if (Current::permission('block_editable')) {
$this->layout = 'NetCommons.setting';
}
Expand Down
4 changes: 2 additions & 2 deletions Model/ActionQuestionnaireAdd.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class ActionQuestionnaireAdd extends QuestionnairesAppModel {
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function beforeValidate($options = array()) {
$this->validate = Hash::merge($this->validate, array(
$this->validate = array_merge($this->validate, array(
'create_option' => array(
'rule' => array(
'inList', array(
Expand Down Expand Up @@ -215,7 +215,7 @@ protected function _createFromReuse() {
*/
protected function _getDefaultQuestionnaire($addData) {
$questionnaire = array();
$questionnaire['Questionnaire'] = Hash::merge(
$questionnaire['Questionnaire'] = array_merge(
array(
'block_id' => Current::read('Block.id'),
'title' => '',
Expand Down
30 changes: 17 additions & 13 deletions Model/Behavior/QuestionnaireAnswerBehavior.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,13 @@ public function afterFind(Model $model, $results, $primary = false) {
$val['QuestionnaireAnswer']['answer_value'],
QuestionnairesComponent::ANSWER_DELIMITER));
// valuesエリアに分割したデータを保存
$val['QuestionnaireAnswer']['answer_values'] = Hash::combine(
array_map(
'explode',
array_fill(0, count($answers), QuestionnairesComponent::ANSWER_VALUE_DELIMITER),
$answers),
'{n}.0',
'{n}.1');
$val['QuestionnaireAnswer']['answer_values'] = [];
foreach ($answers as $answer) {
$arr = explode(QuestionnairesComponent::ANSWER_VALUE_DELIMITER, $answer);
$val['QuestionnaireAnswer']['answer_values'][$arr[0]] = isset($arr[1])
? $arr[1]
: null;
}
// answer_valueは画面で回答してもらうための変数なので、画面に見合った形に整形
$val['QuestionnaireAnswer']['answer_value'] = array_map(
array($this, 'setDelimiter'),
Expand Down Expand Up @@ -163,14 +163,18 @@ protected function _decomposeAnswerValue(&$dst, $src) {
* @return void
*/
protected function _setupOtherAnswerValue(Model $model, $question) {
$choice = Hash::extract(
$question['QuestionnaireChoice'],
'{n}[other_choice_type!=' . QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED . ']');
$choice = [];
foreach ($question['QuestionnaireChoice'] as $item) {
if ($item['other_choice_type'] != QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) {
$choice = $item;
break;
}
}
if (! $choice) {
return;
}
$key = $choice[0]['key'];
if (! Hash::check($model->data, 'QuestionnaireAnswer.answer_values.' . $key) &&
$key = $choice['key'];
if (! isset($model->data['QuestionnaireAnswer']['answer_values'][$key]) &&
$model->data['QuestionnaireAnswer']['matrix_choice_key'] != $key) {
$model->data['QuestionnaireAnswer']['other_answer_value'] = '';
}
Expand All @@ -195,4 +199,4 @@ public function answerRequire(&$model, $data, $question) {
}
}

}
}
25 changes: 16 additions & 9 deletions Model/Behavior/QuestionnaireAnswerMatrixSingleChoiceBehavior.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,10 @@ public function answerMatrixValidation(&$model, $data, $question, $allAnswers) {
}
$ret = true;
if (isset($model->data['QuestionnaireAnswer']['matrix_answer_values'])) {
$list = Hash::combine($question['QuestionnaireChoice'], '{n}.key', '{n}.key');
$list = [];
foreach ($question['QuestionnaireChoice'] as $item) {
$list[$item['key']] = $item['key'];
}
if (! $this->checkMatrixAnswerInList(
$model,
$model->data['QuestionnaireAnswer']['matrix_answer_values'],
Expand Down Expand Up @@ -126,7 +129,7 @@ public function answerMatrixValidation(&$model, $data, $question, $allAnswers) {
*
* @param object &$model use model
* @param string $answers answer value
* @param int $list choice list ( choice key list)
* @param array $list choice list ( choice key list)
* @return bool
*/
public function checkMatrixAnswerInList(&$model, $answers, $list) {
Expand Down Expand Up @@ -161,14 +164,18 @@ public function checkMatrixOtherAnswer(&$model, $question, $answers, $otherAnswe
// 選択肢を何も選択しなかったらAnswerデータが飛んでこないからチェックにかからないか?
$rowIds = array_keys($answers);

$checkOtherChoiceArr = [];
foreach ($question['QuestionnaireChoice'] as $choice) {
$hasOtherChoice = false;
if ($choice['other_choice_type'] != QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) {
$hasOtherChoice = true;
}
$checkOtherChoiceArr[$choice['key']] = $hasOtherChoice;
}
foreach ($rowIds as $matrixRowId) {

$results = Hash::extract(
$question['QuestionnaireChoice'],
'{n}[key=' . $matrixRowId . ']');

if ($results &&
$results[0]['other_choice_type'] != QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) {
if (isset($checkOtherChoiceArr[$matrixRowId]) &&
$checkOtherChoiceArr[$matrixRowId]) {
if (empty($otherAnswer['other_answer_value'])) {
$model->validationErrors['answer_value'][] =
__d('questionnaires', 'Please enter something in other item');
Expand Down Expand Up @@ -216,4 +223,4 @@ public function checkMatrixAnswerFill(&$model, $question, $answers, $allAnswers)
return true;
}

}
}
27 changes: 19 additions & 8 deletions Model/Behavior/QuestionnaireAnswerSingleListBehavior.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ public function beforeValidate(Model $model, $options = array()) {
* @param array $question 回答データに対応する質問
* @param array $allAnswers 入力された回答すべて
* @return bool
*
* 速度改善の修正に伴って発生したため抑制
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function answerChoiceValidation(&$model, $data, $question, $allAnswers) {
if (! in_array($question['question_type'], $this->_choiceValidateType)) {
Expand All @@ -91,22 +94,30 @@ public function answerChoiceValidation(&$model, $data, $question, $allAnswers) {
return true;
}
// 質問に設定されている選択肢を配列にまとめる
$list = Hash::combine($question['QuestionnaireChoice'], '{n}.id', '{n}.key');
$list = [];
$checkOtherChoiceArr = [];
foreach ($question['QuestionnaireChoice'] as $choice) {
$list[$choice['id']] = $choice['key'];
$hasOtherChoice = false;
if ($choice['other_choice_type'] != QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) {
$hasOtherChoice = true;
}
$checkOtherChoiceArr[$choice['key']] = $hasOtherChoice;
}

$ret = true;
// 選択された選択肢IDすべてについて調査する
$choiceIds = array_keys($model->data['QuestionnaireAnswer']['answer_values']);
foreach ($choiceIds as $choiceId) {
$choiceKeys = array_keys($model->data['QuestionnaireAnswer']['answer_values']);
foreach ($choiceKeys as $choiceKey) {
// 選択されたIDは、ちゃんと用意されている選択肢の中のひとつであるか
if ($choiceId != '' && !Validation::inList(strval($choiceId), $list)) {
if ($choiceKey != '' && !Validation::inList(strval($choiceKey), $list)) {
$ret = false;
$model->validationErrors['answer_value'][] =
__d('questionnaires', 'Invalid choice');
}
// チェックされている選択肢が「その他」の項目である場合は
$choice = Hash::extract($question['QuestionnaireChoice'], '{n}[key=' . $choiceId . ']');
if ($choice &&
$choice[0]['other_choice_type'] != QuestionnairesComponent::OTHER_CHOICE_TYPE_NO_OTHER_FILED) {
if (isset($checkOtherChoiceArr[$choiceKey]) &&
$checkOtherChoiceArr[$choiceKey]) {
// 具体的なテキストが書かれていないといけない
if (empty($model->data['QuestionnaireAnswer']['other_answer_value'])) {
$ret = false;
Expand All @@ -118,4 +129,4 @@ public function answerChoiceValidation(&$model, $data, $question, $allAnswers) {
return $ret;
}

}
}
27 changes: 16 additions & 11 deletions Model/Questionnaire.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@

/**
* Summary for Questionnaire Model
*
* 速度改善の修正に伴って発生したため抑制
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
*/
class Questionnaire extends QuestionnairesAppModel {

Expand Down Expand Up @@ -192,10 +195,11 @@ public function __construct($id = false, $table = null, $ds = null) {
public function beforeValidate($options = array()) {
// ウィザード画面中はstatusチェックをしないでほしいので
// ここに来る前にWorkflowBehaviorでつけられたstatus-validateを削除しておく
if (Hash::check($options, 'validate') == QuestionnairesComponent::QUESTIONNAIRE_VALIDATE_TYPE) {
$this->validate = Hash::remove($this->validate, 'status');
if (isset($options['validate']) &&
$options['validate'] === QuestionnairesComponent::QUESTIONNAIRE_VALIDATE_TYPE) {
unset($this->validate['status']);
}
$this->validate = Hash::merge($this->validate, array(
$this->validate = array_merge($this->validate, array(
'block_id' => array(
'numeric' => array(
'rule' => array('numeric'),
Expand Down Expand Up @@ -569,6 +573,9 @@ protected function _getPeriodConditions() {
* @param array &$questionnaire questionnaire
* @throws InternalErrorException
* @return bool
*
* 速度改善の修正に伴って発生したため抑制
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function saveQuestionnaire(&$questionnaire) {
// 設定画面を表示する前にこのルームのアンケートブロックがあるか確認
Expand All @@ -584,9 +591,8 @@ public function saveQuestionnaire(&$questionnaire) {
$questionnaire['Questionnaire']['block_id'] = Current::read('Frame.block_id');
// is_no_member_allowの値によってis_repeat_allowを決定する
$questionnaire['Questionnaire']['is_repeat_allow'] = QuestionnairesComponent::USES_NOT_USE;
if (Hash::get(
$questionnaire,
'Questionnaire.is_no_member_allow') == QuestionnairesComponent::USES_USE) {
if (isset($questionnaire['Questionnaire']['is_no_member_allow']) &&
$questionnaire['Questionnaire']['is_no_member_allow'] == QuestionnairesComponent::USES_USE) {
$questionnaire['Questionnaire']['is_repeat_allow'] = QuestionnairesComponent::USES_USE;
}
$status = $questionnaire['Questionnaire']['status'];
Expand All @@ -595,7 +601,7 @@ public function saveQuestionnaire(&$questionnaire) {
// (そうしないと既存レコードのUPDATEになってしまうから)
// (ちなみにこのカット処理をbeforeSaveで共通でやってしまおうとしたが、
// beforeSaveでIDをカットしてもUPDATE動作になってしまっていたのでここに置くことにした)
$questionnaire = Hash::remove($questionnaire, 'Questionnaire.id');
unset($questionnaire['Questionnaire']['id']);

$this->set($questionnaire);
if (!$this->validates()) {
Expand All @@ -619,10 +625,9 @@ public function saveQuestionnaire(&$questionnaire) {
$questionnaireId = $this->id;

// ページ以降のデータを登録
$questionnaire = Hash::insert(
$questionnaire,
'QuestionnairePage.{n}.questionnaire_id',
$questionnaireId);
foreach (array_keys($questionnaire['QuestionnairePage']) as $key) {
$questionnaire['QuestionnairePage'][$key]['questionnaire_id'] = $questionnaireId;
}

if (! $this->QuestionnairePage->saveQuestionnairePage($questionnaire['QuestionnairePage'])) {
throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
Expand Down

0 comments on commit c40f19b

Please sign in to comment.