/** * Método que verifica se existem questões suficientes para a * realização dos minetestes por tópico. * Método intimamente ligado ao modelo de mine teste do estudo online. * * @return boolean Retorna TRUE caso tenha o número mímino de questões * para realizar o teste ou FALSE caso não tenha */ public function temParaTopico(Topico $topico) { $teste = new TesteTopico(); $query = "SELECT count(pk_questao) as total FROM testes.questao " . "inner join testes.questao_vin_topico on pk_questao = questao_vin_topico_pk_questao " . "WHERE questao_vin_topico_pk_conteudo={$topico->getId()}"; $prepare = $this->tg->getPDO()->prepare($query); $prepare->execute(); $stdClass = $prepare->fetchObject(); return $stdClass->total >= $teste->getMaxQuestoes(); }
/** * Método que retorna questões associadas ao capítulo informado e diferentes * das informadas * @param Model $model O capítulo associado as questões * @param array $questoes As questões já definidas * @return ResultSetHydrator Um objeto contendo o resultado da consulta */ public function questoesAdicionais(ConteudoInterno $model, array $questoes) { if ($model instanceof Capitulo) { $tipoTeste = new TesteCapitulo(); $fk = "fk_capitulo"; } else { $tipoTeste = new TesteTopico(); $fk = "fk_conteudo"; } $limit = $tipoTeste->getMaxQuestoes() - count($questoes); $where = " {$fk}={$model->getId()} "; foreach ($questoes as $questao) { $where .= "and pk_questao!={$questao->getId()} "; } $query = "SELECT distinct on(pk_questao) * FROM testes.questao " . "inner join testes.questao_vin_topico on " . "pk_questao=questao_vin_topico_pk_questao " . "inner join apostilas.conteudo on " . "pk_conteudo=questao_vin_topico_pk_conteudo " . "where {$where} limit {$limit}"; return $this->tg->querySelect($query); }
/** * Método que gera um novo teste e o retorna para o aluno. */ private function get_novo_teste() { try { $this->filtro->initGets('topico'); $usrValidar = new Usuarios(); $sqlQuestao = new SqlQuestaoService(); $sqlTurma = new SqlTurma(); $sqlTopico = new SqlTopico(); $sqlAcomp = new SqlAcompanhamento(); $aluno = $usrValidar->getAluno(false); $topico = $sqlTopico->get($this->filtro->get('topico')); $capitulo = $topico->getCapitulo(); $acomp = $sqlAcomp->deTopico($topico); $tipo = filter_input(INPUT_GET, "testePara"); if ($tipo == "capitulo") { $sqlTeste = new SqlTesteCapitulo(); $novoTeste = new TesteCapitulo(); $novoDe = $capitulo; } elseif ($tipo == "topico") { $sqlTeste = new SqlTesteTopico(); $novoTeste = new TesteTopico(); $novoDe = $topico; } else { throw new Exception("O alvo do teste não é permitido"); } if ($acomp->getStatus() != Acompanhamento::STATUS_CONCLUIDO && $acomp->getStatus() != Acompanhamento::STATUS_REVISADO) { throw new Exception('O tópico informado ainda não ' . 'foi concluído. Tente outro.'); } $teste = $sqlTeste->porAlunoTopico($aluno, $topico); if ($teste) { //Caso já exista um teste if (!$teste->podeRefazer()) { //O teste já foi feito e não pode ser refeito throw new Exception('Você já realizou o teste. ' . 'Sua nota não permite refazer o teste. Que pena.'); } } else { //Caso ainda não exista um teste $turma = $sqlTurma->deALuno($aluno); $q1 = $sqlQuestao->semTurma($novoDe, $turma); $questoes = $q1->fetchAll(); if (count($questoes) < $novoTeste->getMaxQuestoes()) { $q2 = $sqlQuestao->questoesAdicionais($capitulo, $questoes); $questoes = array_merge($questoes, $q2->fetchAll()); } $teste = $novoTeste; $teste->setAluno($aluno); $teste->setAlvo($novoDe); $teste->setQuestoes($questoes); $sqlTeste->insert($teste); } $arrayTmp = array(); foreach ($teste->getQuestoes() as $questao) { $tmp = new stdClass(); $tmp->idQuestao = $questao->getId(); $tmp->questao = $questao->getQuestao(); $tmp->tipo = $questao->getTipo(); $tmp->tipoTexto = $questao->getTipoInsert(); $tmp->qtAlternativas = $questao->getNumAlternativas(); array_push($arrayTmp, $tmp); } //Gerando a resposta $this->setMensagem('Teste gerado com sucesso'); $this->appendResposta($arrayTmp); $this->statusTrue(); } catch (SqlException $sql) { $this->setMensagem('Ocorreu um erro interno. ' . 'Tente novamente mais tarde.'); } catch (Exception $exc) { $this->setMensagem($exc->getMessage()); } $this->printResposta(); }