/** * Save questions data. * * @param array $data * @param int $userId */ public function saveQuestionsData(array $data, $userId) { if ($data === null || !is_array($data)) { return false; } $user = null; if ((int) $userId > 0) { $user = $this->userService->findUserById($userId); if ($user === null) { return false; } } else { return false; } $oldUserEmail = $user->email; $event = new OW_Event('base.questions_save_data', array('userId' => $userId), $data); OW::getEventManager()->trigger($event); $data = $event->getData(); $dataFields = array_keys($data); $questions = $this->questionDao->findQuestionsByQuestionNameList($dataFields); $questionsData = $this->dataDao->findByQuestionsNameList($dataFields, $userId); $questionsUserData = array(); foreach ($questionsData as $questionData) { $questionsUserData[$questionData->questionName] = $questionData; } $questionDataArray = array(); foreach ($questions as $key => $question) { $value = null; if (isset($data[$question->name])) { switch ($question->type) { case self::QUESTION_VALUE_TYPE_TEXT: $value = $question->presentation !== self::QUESTION_PRESENTATION_PASSWORD ? $this->questionTextFormatter(trim($data[$question->name])) : BOL_UserService::getInstance()->hashPassword($data[$question->name]); if ((int) $question->base === 1 && in_array($question->name, $dataFields)) { $property = new ReflectionProperty('BOL_User', $question->name); $property->setValue($user, $value); } else { if (isset($questionsUserData[$question->name])) { $questionData = $questionsUserData[$question->name]; } else { $questionData = new BOL_QuestionData(); $questionData->userId = $userId; $questionData->questionName = $question->name; } $questionData->textValue = $value; if ($question->presentation === self::QUESTION_PRESENTATION_URL && !empty($value)) { $questionData->textValue = $this->urlFilter($value); } $questionDataArray[] = $questionData; //$this->dataDao->save($questionData); } break; case self::QUESTION_VALUE_TYPE_DATETIME: $date = UTIL_DateTime::parseDate($data[$question->name], UTIL_DateTime::DEFAULT_DATE_FORMAT); if (!isset($date)) { $date = UTIL_DateTime::parseDate($data[$question->name], UTIL_DateTime::MYSQL_DATETIME_DATE_FORMAT); } if (isset($date)) { if (UTIL_Validator::isDateValid($date[UTIL_DateTime::PARSE_DATE_MONTH], $date[UTIL_DateTime::PARSE_DATE_DAY], $date[UTIL_DateTime::PARSE_DATE_YEAR])) { $value = $date[UTIL_DateTime::PARSE_DATE_YEAR] . '-' . $date[UTIL_DateTime::PARSE_DATE_MONTH] . '-' . $date[UTIL_DateTime::PARSE_DATE_DAY]; if ((int) $question->base === 1 && in_array($question->name, $dataFields)) { $property = new ReflectionProperty('BOL_User', $question->name); $property->setValue($user, $value); } else { if (isset($questionsUserData[$question->name])) { $questionData = $questionsUserData[$question->name]; } else { $questionData = new BOL_QuestionData(); $questionData->userId = $userId; $questionData->questionName = $question->name; } $questionData->dateValue = $value; $questionDataArray[] = $questionData; } } } break; case self::QUESTION_VALUE_TYPE_MULTISELECT: if (!empty($data[$question->name]) && is_array($data[$question->name])) { $value = array_sum($data[$question->name]); } case self::QUESTION_VALUE_TYPE_SELECT: if (!isset($value)) { $value = (int) $data[$question->name]; } if ((int) $question->base === 1 && in_array($question->name, $dataFields)) { $property = new ReflectionProperty('BOL_User', $question->name); $property->setValue($user, $value); } else { if (isset($questionsUserData[$question->name])) { $questionData = $questionsUserData[$question->name]; } else { $questionData = new BOL_QuestionData(); $questionData->userId = $userId; $questionData->questionName = $question->name; } $questionData->intValue = $value; $questionDataArray[] = $questionData; //$this->dataDao->save($questionData); } break; case self::QUESTION_VALUE_TYPE_BOOLEAN: $value = false; $issetValues = array('1', 'true', 'on'); if (in_array(mb_strtolower((string) $data[$question->name]), $issetValues)) { $value = true; } if ((int) $question->base === 1 && in_array($question->name, $dataFields)) { $property = new ReflectionProperty('BOL_User', $question->name); $property->setValue($user, $value); } else { if (isset($questionsUserData[$question->name])) { $questionData = $questionsUserData[$question->name]; } else { $questionData = new BOL_QuestionData(); $questionData->userId = $userId; $questionData->questionName = $question->name; } $questionData->intValue = $value; $questionDataArray[] = $questionData; //$this->dataDao->save($questionData); } break; } } } $sendVerifyMail = false; if ($user->id !== null) { if (strtolower($user->email) !== strtolower($oldUserEmail)) { $user->emailVerify = false; $sendVerifyMail = true; } if (!empty($data['accountType'])) { $accountType = $this->findAccountTypeByName($data['accountType']); $accountTypeOld = $this->findAccountTypeByName($user->accountType); if (!empty($accountType)) { $user->accountType = $accountType->name; $this->updateQuestionsEditStamp(); } } } //printVar($user); $this->userService->saveOrUpdate($user); if (count($questionDataArray) > 0) { $this->dataDao->batchReplace($questionDataArray); } if ($sendVerifyMail && OW::getConfig()->getValue('base', 'confirm_email')) { BOL_EmailVerifyService::getInstance()->sendUserVerificationMail($user); } return true; }