public static function reorder($criterion_id, $fromId = null, $fromOldPosition = null, $oldPositionId = null) { if (!is_numeric($criterion_id)) { return false; } $modelQuestion = new Model_Question(); $orderBy = 0; $where = array('CriterionId = ?' => $criterion_id); $order = array('Designation ASC'); $questions = $modelQuestion->getAll($where, $order); $newPositionRowId = null; if ($fromId) { $newPositionRow = $modelQuestion->getQuestionById($fromId); $newPositionRowId = $newPositionRow->getId() ? $newPositionRow->getId() : null; } if ($fromOldPosition) { $fromOldPosition = $fromOldPosition ? $fromOldPosition : null; } $toPositionRowId = null; if ($oldPositionId) { $toPositionRow = $modelQuestion->getQuestionById($oldPositionId); $toPositionRowId = $toPositionRow->getId() ? $toPositionRow->getId() : null; $toNewPosition = $toPositionRow->getDesignation() ? $toPositionRow->getDesignation() : null; } if (!is_object($questions) && !(count($questions) > 0)) { return false; } foreach ($questions as $questionRow) { $orderBy++; if ($questionRow->getId() == $newPositionRowId) { // não editar $newPositionRowId continue; } $data['parent_id'] = $criterion_id; $data['question_type_id'] = $questionRow->getQuestionTypeId(); $data['parent_question_id'] = $questionRow->getParentQuestionId(); $data['value'] = $questionRow->getValue(); $data['supporting_text'] = $questionRow->getSupportingText(); $data['version'] = $questionRow->getVersion(); $data['status'] = $questionRow->getStatus(); $data['designation'] = $orderBy; if ($questionRow->getId() == $toPositionRowId) { $questionRow->setId($toPositionRowId); $data['designation'] = $toNewPosition + ($fromOldPosition <= $toNewPosition ? -1 : +1); } $modelQuestion->updateQuestion($questionRow, $data); } return true; }
public function viewAction() { $id = $this->getRequest()->getParam('id'); $question = new Model_Question($id); $author = $question->getAuthor(); $answers = $question->getAnswers(); $form = new Form_Answer(); if ($this->getRequest()->isPost()) { if ($form->isValid($this->getRequest()->getPost())) { $answer = new Model_Answer(); $answer->fill($form->getValues()); $answer->created = date('Y-m-d H:i:s'); $answer->author_id = Zend_Auth::getInstance()->getIdentity()->id; $answer->question_id = $id; $answer->save(); $this->_redirect('/question/view/id/' . $id); } } $this->view->form = $form; $this->view->question = $question; $this->view->author = $author; $this->view->answers = $answers; }
public function action_index() { $view = View::factory('question/list')->bind('table', $table)->bind('total', $total)->bind('links', $links)->bind('success', $success)->bind('filter_url', $filter_url)->bind('filter_type', $filter_type)->bind('types', $types); $filter_type = (string) $this->request->param('filter_type', ''); $course_id = Session::instance()->get('course_id'); $course = ORM::factory('course', (int) $course_id); $criteria = array('filter_type' => $this->request->param('filter_type', ''), 'course_id' => $course_id); $questions = Model_Question::get_questions($criteria); $total = Model_Question::get_total_question_count($criteria); $sortables = new Sort(array('Question' => '', 'Type' => '', 'Actions' => '')); $headings = $sortables->render(); $table = array('headings' => $headings, 'data' => $questions); $types = array_combine(Model_Question::$TYPES, array_map('ucfirst', Model_Question::$TYPES)); $filter_url = URL::site('question/index'); $links = array('add' => Html::anchor('/question/add/', 'Create a question', array('class' => 'createButton l')), 'delete' => URL::site('/question/delete/')); $success = Session::instance()->get_once('success'); $this->content = $view; }
public function action_edit() { $view = View::factory('exercise/form')->bind('form', $form)->bind('questions', $questions)->bind('selected_questions', $selected_questions)->bind('exercise_questions', $exercise_questions)->bind('error_notif', $error_notif); $submitted = false; $course = ORM::factory('course', Session::instance()->get('course_id')); $error_notif = array(); $exercise_id = (int) $this->request->param('id'); $exercise = ORM::factory('exercise', $exercise_id); if ($this->request->method() === 'POST' && $this->request->post()) { $submitted = true; $safepost = Arr::map('Security::xss_clean', $this->request->post()); $validator = $exercise->validator($safepost); if ($validator->check() && $this->validate_form($safepost)) { $exercise->values(array_merge($safepost, array('course_id' => $course->id, 'slug' => Text::limit_chars(Inflector::underscore($safepost['title'])), 'modified_at' => date('Y-m-d H:i:s', time())))); $exercise->save(); $zip_ques = Arr::zip($safepost['selected'], $safepost['marks']); $exercise->delete_questions()->add_questions($zip_ques); if ($safepost['pub_status'] == '1') { $exist = ORM::factory('feed'); $exist->where('type', ' = ', 'exercise'); $exist->where('action', ' = ', 'add'); $exist->where('respective_id', ' = ', $exercise->id); $exist->where('course_id', ' = ', Session::instance()->get('course_id')); $exists = $exist->find_all(); if (count($exists) == 0) { $feed = new Feed_Exercise(); $feed->set_action('add'); $feed->set_course_id(Session::instance()->get('course_id')); $feed->set_respective_id($exercise->id); $feed->set_actor_id(Auth::instance()->get_user()->id); $feed->streams(array('course_id' => (int) Session::instance()->get('course_id'))); $feed->save(); } } Session::instance()->set('success', 'Exercise edited successfully.'); Request::current()->redirect('exercise'); exit; } else { $this->_errors = array_merge($this->_errors, $validator->errors('exercise')); $error_notif = Arr::get($this->_errors, 'questions', ''); } } $exercise_questions = $exercise->questions()->as_array('question_id', 'marks'); $selected_questions = array_keys($exercise_questions); $saved_data = $exercise->as_array(); $form = $this->form('exercise/edit/id/' . $exercise->id, $submitted, $saved_data); Breadcrumbs::add(array('Edit', '')); // set content $questions = Model_Question::get_questions(array('course_id' => $course->id)); $this->content = $view; }
public function getArrayDevolutiveReturn($questionnaireId, $userId, $programaId, $blockId = null) { $this->Questionnaire = new Model_Questionnaire(); $this->Alternative = new Model_Alternative(); $this->Question = new Model_Question(); try { $arrDevolutiveRAA = array(); $arrCriteria = array(); $arrBlocks = array(); $arrQuestionnaire = array(); $arrRadarData = array(); // Definições do Questionário //@TODO - por em cache $questionnaireDefs = $this->Questionnaire->getQuestionnaireById($questionnaireId); $arrQuestionnaire['title'] = $questionnaireDefs->getTitle(); $arrQuestionnaire['description'] = $questionnaireDefs->getDescription(); $arrQuestionnaire['long_description'] = $questionnaireDefs->getLongDescription(); $arrQuestionnaire['operation_beginning'] = Vtx_Util_Date::format_dma($questionnaireDefs->getOperationBeginning()); $arrQuestionnaire['operation_ending'] = Vtx_Util_Date::format_dma($questionnaireDefs->getOperationEnding()); // Definições da Questão $questionsDefs = $this->Question->getAllByQuestionnaireIdBlockId($questionnaireId, $blockId); $cacheQuestion = new Vtx_Cache_MPE_QuestionarioCache(); /** * - metodo criado para refatorar 2 metodos que faziam a mesma coisa e estavam dentro do foreach * - metodo que retorna todas alternativas de todas as questoes de um bloco que um Usuario respondeu * - a utilizacao deste metodo reduziu media de 25% a qtd de queries chamadas pelo BD. * - no meu exemplo reduziu de 320 para 235. * - chamada: $isAnswered = $this->Question->setaQuestionResp($QuestionRespDbTable, $questionId); * @author esilva */ $QuestionRespDbTable = $this->Question->getAnswerByBlockId($blockId, $userId, $programaId); //var_dump ($QuestionRespDbTable); exit; /** * * Recupera dados de cada questao de um Bloco: * - enunciado questao * - alternativas * - resposta * - resultado anual * */ foreach ($questionsDefs as $question_def) { $idBlock = ""; $idCriterion = ""; $questionId = $question_def->getId(); $question_value = $question_def->getQuestao(); // Grava a questão no array de devolutiva $arrDevolutiveRAA[$questionId]['designation'] = $question_def->getDesignacao(); $arrDevolutiveRAA[$questionId]['value'] = $question_value; $arrDevolutiveRAA[$questionId]['text'] = $question_def->getTexto(); // Verifica se existe Bloco válido e grava nos arrays de blocos e devolutiva $idBlock = $question_def->getBloco(); if ($idBlock != "" && $idBlock != 0) { $arrBlocks[$idBlock] = $question_def->getBlocoTitulo(); $arrDevolutiveRAA[$questionId]['block'] = $question_def->getBloco(); } // Verifica se existe Critério válido e grava nos arrays de critérios e devolutiva $idCriterion = $question_def->getCriterio(); if ($idCriterion != "" && $idCriterion != 0) { $arrCriteria[$idCriterion] = $idCriterion . ". " . $question_def->getCriterioTitulo(); $arrDevolutiveRAA[$questionId]['criterion'] = $question_def->getCriterio(); } $isAnswered['answerResult'] = null; //se empresa respondeu a questao //$isAnswered = $this->Question->isAnsweredByEnterprise($questionId,$userId, true); $isAnswered = $this->Question->setaQuestionResp($QuestionRespDbTable, $questionId); //var_dump('isAnswered',$isAnswered); if ($isAnswered['status']) { // Recupera a resposta //$answer = $this->Question->getQuestionAnswer($questionId,$userId); //refatorado para otimizar queries executadas $answer = $isAnswered['answerResult']; $alternative_id = $answer['alternative_id']; $arrDevolutiveRAA[$questionId]['alternative_id'] = $alternative_id; $arrDevolutiveRAA[$questionId]['write_answer'] = isset($answer['answer_value']) ? $answer['answer_value'] : ""; if (count($answer['annual_result']) > 0) { $arrDevolutiveRAA[$questionId]['annual_result'] = $answer['annual_result']; $arrDevolutiveRAA[$questionId]['annual_result_unit'] = $answer['annual_result_unit']; } else { $arrDevolutiveRAA[$questionId]['annual_result'] = ""; $arrDevolutiveRAA[$questionId]['annual_result_unit'] = ""; } // Recupera o feedback da alternativa escolhida #$alternative = $this->Alternative->getAlternativeById($alternative_id); //recupera do cache $alternative = $cacheQuestion->alternative($alternative_id, $this->Alternative); $arrDevolutiveRAA[$questionId]['alternative_designation'] = $alternative->getDesignation(); $arrDevolutiveRAA[$questionId]['alternative_feedback'] = $alternative->getFeedbackDefault(); // Recupera os comentarios 1 do avaliador da resolução da questão //REFACTORING //$arrDevolutiveRAA[$questionId]['answer_feedback'] = $this->Question->getAnswerFeedback( $isAnswered['objAnswered']['AnswerIdValue'] );//$isAnswered['objAnswered']->getAnswerId()); $arrDevolutiveRAA[$questionId]['answer_feedback'] = $answer['AnswerFeedback']; // Recupera os comentarios 2 do avaliador da resolução da questão //REFACTORING //$arrDevolutiveRAA[$questionId]['answer_feedback_improve'] = $this->Question->getAnswerFeedbackImprove($isAnswered['objAnswered']['AnswerIdValue']); $arrDevolutiveRAA[$questionId]['answer_feedback_improve'] = $answer['AnswerFeedbackImprove']; //AdditionalInfo $arrDevolutiveRAA[$questionId]['additional_info'] = $answer['AdditionalInfo']; } // Recupera as alternativas da questão //$alternativesDefs = $this->Alternative->getAllByQuestionId($questionId); //recupera do cache $alternativesDefs = $cacheQuestion->alternativasEQuestoes($questionId, $this->Alternative); //var_dump ('alternativesDefs: ', $alternativesDefs); //echo "<br><Br>"; foreach ($alternativesDefs as $alternative_def) { if (is_object($alternative_def)) { $arr_alternative[$alternative_def->getDesignation()] = $alternative_def->getValue(); } else { $arr_alternative[$alternative_def['Designation']] = $alternative_def['Value']; } } $arrDevolutiveRAA[$questionId]['alternatives'] = $arr_alternative; } return array($arrDevolutiveRAA, $arrBlocks, $arrCriteria, $arrQuestionnaire); } catch (Vtx_UserException $e) { DbTable_Questionnaire::getInstance()->getAdapter()->rollBack(); return array('status' => false, 'messageError' => $e->getMessage()); } catch (Exception $e) { DbTable_Questionnaire::getInstance()->getAdapter()->rollBack(); throw new Exception($e); } }
public function configureData() { // Configure top block $top = new Block_Top(); $top->configure(); $profile = new Model_User($_GET['login']); Globals::$tpl->assignVar(array('profile_id' => $profile->getId(), 'profile_login' => $profile->getLogin(), 'profile_sex' => $profile->getGender(false), 'profile_avatar' => $profile->getAvatarURL('large'), 'profile_region' => $profile->getZipName(), 'profile_gender' => $profile->getGender())); // Get stats on friends $profileFriendsStats = $profile->getGuessFriendsStats(); // If a user is logged if ($user = Model_User::getLoggedUser()) { // If I'm on my profile if ($user->getId() == $profile->getId()) { Globals::$tpl->assignSection('private'); // Get pending friend requests $pendingFriends = $user->getPendingFriends(); // Assign friends infos foreach ($pendingFriends as $friend) { Globals::$tpl->assignLoopVar('request', array('id' => $friend->getId(), 'login' => $friend->getLogin(), 'avatar' => $friend->getAvatarURL('medium'))); } } } $profileTotalVotes = $profile->getTotalVotes(); Globals::$tpl->assignVar(array('profile_totalVote' => $profileTotalVotes, 'profile_totalPredictionWon' => 0, 'profile_totalPredictionLost' => 0, 'profile_predictionAccuracy' => 0, 'profile_global_distance' => 0, 'profile_friend_distance' => 0)); // Get stats on profil's user guesses according to global votes $profileGGS = $profile->getGuessGlobalStats(); if ($profileGGS['guesses'] != 0) { Globals::$tpl->assignVar(array('profile_totalPredictionWon' => $profileGGS['goodGuesses'], 'profile_totalPredictionLost' => $profileGGS['badGuesses'], 'profile_predictionAccuracy' => round($profileGGS['goodGuesses'] / $profileGGS['guesses'] * 100))); } // List all friends $friends = $profile->getFriends(); foreach ($friends as $friend) { Globals::$tpl->assignLoopVar('friend', array('id' => $friend->getId(), 'login' => $friend->getLogin(), 'avatar_medium' => $friend->getAvatarURL('medium'), 'avatar_small' => $friend->getAvatarURL('small'))); foreach ($profileFriendsStats as $stat) { // Get stats on profil's user gusses if ($friend->getId() == $stat['user']->getId()) { Globals::$tpl->assignLoopVar('friend.stat', array('predictionAccuracy_his' => round($stat['his_guesses'] == 0 ? 0 : $stat['his_goodGuesses'] / $stat['his_guesses'] * 100), 'predictionAccuracy_my' => round($stat['my_guesses'] == 0 ? 0 : $stat['my_goodGuesses'] / $stat['my_guesses'] * 100))); } } } // If profile's user already voted if ($profileTotalVotes != 0) { $totalQuestions = Model_Question::getTotalQuestions(); // Get stats on profil's user votes according to global votes $profileAGS = $profile->getAnswerGlobalStats(); if ($profileAGS['votes'] != 0) { Globals::$tpl->assignVar(array('profile_global_distance' => round(($profileAGS['votes'] - $profileAGS['goodVotes']) / $profileAGS['votes'] * $totalQuestions))); } // Get stats on profil's user votes according to his friends votes $profileAFS = $profile->getAnswerFriendStats(); if ($profileAFS['votes'] != 0) { Globals::$tpl->assignVar(array('profile_friend_distance' => round(($profileAFS['votes'] - $profileAFS['goodVotes']) / $profileAFS['votes'] * $totalQuestions))); } } // Compute user's feelings $profileFeelings = $profile->getFeelings(); $maxFeelingScore = 0; foreach ($profileFeelings as $total) { $maxFeelingScore = $maxFeelingScore < $total ? $total : $maxFeelingScore; } $feelings = array('Personalité', 'Environement', 'Savoir', 'Experience', 'Réflexion', 'Sensibilité'); $colors = Conf::get('GRAPH_COLORS'); $data = array(); foreach ($feelings as $id => $label) { Globals::$tpl->assignLoopVar('feeling', array('label' => $label, 'percent' => round($maxFeelingScore == 0 ? 0 : $profileFeelings[$id + 1] / $maxFeelingScore * 100))); $data[] = array('value' => ($maxFeelingScore ? 1 - $profileFeelings[$id + 1] / $maxFeelingScore : 0) * 0.95 + 0.05, 'label' => $label, 'color' => $colors[$id]); } Globals::$tpl->assignVar('feeling_data', json_encode($data)); // No friends ? if (count($friends) == 0 && (!isset($pendingFriends) || count($pendingFriends) == 0)) { Globals::$tpl->assignSection('noFriends'); } }