| Server IP : 162.214.74.102 / Your IP : 216.73.217.114 Web Server : Apache System : Linux dedi-4363141.lrsys.com.br 3.10.0-1160.119.1.el7.tuxcare.els25.x86_64 #1 SMP Wed Oct 1 17:37:27 UTC 2025 x86_64 User : lrsys ( 1015) PHP Version : 5.6.40 Disable Function : exec,passthru,shell_exec,system MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /home/lrsys/www/lrsys_apps/leo/application/plugins/module_forms/controllers/ |
Upload File : |
<?php
require_once 'Controller.php';
require_once __DIR__ . '/../models/QuestionsModel.php';
require_once __DIR__ . '/../models/ChoicesModel.php';
require_once __DIR__ . '/../models/QuestionsformsModel.php';
/**
*
*/
class QuestionsController extends Controller
{
/**
* @var
*/
protected $model;
/**
* @var ChoicesModel
*/
protected $modelChoices;
/**
* @var QuestionsformsModel
*/
protected $modelQuestionsforms;
/**
* @var string
*/
protected $controller = 'questions';
/**
* QuestionsController constructor.
* @param $ui
* @param $_L
* @param $config
* @param $_pd
*/
public function __construct($ui, $_L, $config, $_pd)
{
parent::__construct($ui, $_L, $config, $_pd);
$this->model = new QuestionsModel();
$this->modelChoices = new ChoicesModel();
$this->modelQuestionsforms = new QuestionsformsModel();
}
/**
* Método de Criação de perguntas
*/
public function create()
{
$this->validate();
$form_id = $this->data['form_id'];
$question_data = [];
$question_data['type_id'] = $this->data['type_id'];
$question_data['question'] = $this->data['question'];
$question_data['multi_selections'] = isset($this->data['multi_selections']) ? true : false; // Multipla seleção
$question_data['multiple_choice'] = isset($this->data['multi_selections']) ? true : false; // Multipla escolha
$question_data['description'] = $this->data['description'];
$question_data['max_characters'] = $this->data['max_characters'];
$question_data['range_value'] = $this->data['opinion-scale'];
$question_data['required'] = (isset($this->data['required'])) ? true : false;
$question_data['variable'] = (isset($this->data['variable']) && !empty($this->data['variable'])) ? $this->data['variable'] : null;
$question_data['webservice_field_id'] = (isset($this->data['webservice_field']) && !empty($this->data['webservice_field'])) ? $this->data['webservice_field'] : null;
// Busca a última questão baseada pelo 'sorder'
$last_question = ORM::for_table('module_forms_questions')
->table_alias('q')
->select('q.id')
->select('q.question')
->select('q.sorder')
->join('module_forms_questions_forms', 'q.id = qf.question_id', 'qf')
->where('qf.form_id', $form_id)
->order_by_desc('sorder')
->find_one();
if ($last_question) {
$question_data['sorder'] = $last_question->sorder + 1;
}
// Insere a pergunta
$question = $this->model->createQuestion($question_data);
$data_questions_forms = [];
$data_questions_forms['form_id'] = $form_id;
$data_questions_forms['question_id'] = $question->id;
// Insere a questão na tabela N:N
$this->modelQuestionsforms->createQuestionform($data_questions_forms);
if (isset($this->data['choices']) && count($this->data['choices']) > 0) {
foreach ($this->data['choices'] as $choice) {
$choices_data = [];
$choices_data['question_id'] = $question->id;
$choices_data['name'] = $choice;
// Insere as opções da pergunta
$this->modelChoices->createChoice($choices_data);
}
}
header('Content-Type: application/json');
echo json_encode(['status' => true, 'msg' => $this->_L['module_forms_question_created_msg']]);
die();
}
/**
* Método de edição de perguntas
*/
public function update()
{
$question = $this->validate('update');
$form_id = $this->data['form_id'];
$question_id = $this->data['question_id'];
$question_data = [];
$question_data['type_id'] = $this->data['type_id'];
$question_data['question'] = $this->data['question'];
$question_data['multi_selections'] = ($question_data['type_id'] == 14) ? true : false; // Multipla escolha
$question_data['description'] = $this->data['description'];
$question_data['max_characters'] = $this->data['max_characters'];
$question_data['range_value'] = $this->data['opinion-scale'];
$question_data['required'] = (isset($this->data['required']) && $this->data['required'] == 'Yes') ? true : false;
$question_data['variable'] = (isset($this->data['variable']) && !empty($this->data['variable'])) ? $this->data['variable'] : null;
$question_data['webservice_field_id'] = (isset($this->data['webservice_field']) && !empty($this->data['webservice_field'])) ? $this->data['webservice_field'] : null;
// Insere a pergunta
$this->model->updateQuestion($question_data, $question);
// Remove as choices antigas antes de adicionar as choices atualizadas
ORM::for_table('module_forms_choices')->where('question_id', $question_id)->delete_many();
if (isset($this->data['choices']) && count($this->data['choices']) > 0) {
foreach ($this->data['choices'] as $choice) {
if (strlen($choice) > 0) {
$choices_data = [];
$choices_data['question_id'] = $question->id;
$choices_data['name'] = $choice;
// Insere as opções da pergunta
$this->modelChoices->createChoice($choices_data);
}
}
}
header('Content-Type: application/json');
echo json_encode(['status' => true, 'msg' => $this->_L['module_forms_question_edit_msg']]);
die();
}
public function delete()
{
if (!isset($this->routes[3]) || !is_numeric($this->routes[3])) {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['Invalid ID']);
}
// Verifica se a questão existe
$question = $this->model->getOne($this->routes[3]);
if (!$question) {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['Not_Found']);
}
// Remove da tabela N:N
$questions_forms = $this->modelQuestionsforms->getByParam('question_id', $question->id);
if ($questions_forms) {
foreach ($questions_forms as $item) {
$this->modelQuestionsforms->delete($item->id);
}
}
// Remove as múltiplas escolhas
ORM::for_table('module_forms_choices')
->where('question_id', $question->id)
->delete_many();
// Remove os jumps lógicos
ORM::for_table('module_forms_logic_jumps')
->where('question_id', $question->id)
->delete_many();
$this->model->delete($question->id);
header('Content-Type: application/json');
echo json_encode(['status' => true, 'msg' => $this->_L['module_forms_question_delete_msg']]);
exit;
}
public function validate($action = 'create')
{
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['Method'] .' '. $this->_L['Not Permited']);
}
if (!isset($_POST['form_id']) || empty($_POST['form_id'])) {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['module_forms_form_id_required']);
}
$this->data = $_POST;
if ($action == "update") {
if (!isset($_POST['question_id']) || empty($_POST['question_id'])) {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['module_forms_question_id_required']);
}
$question = ORM::for_table('module_forms_questions')->find_one($_POST['question_id']);
if (!$question) {
r2($_SERVER['HTTP_REFERER'], 'e', $this->_L['Not_Found']);
}
return $question;
}
}
/**
* Carrega o template do Modal de Questões
*/
public function modalAddQuestion()
{
$form_id = '';
$question_id = '';
if (isset($this->routes['3'])) {
$form_id = filter_var($this->routes['3'], FILTER_SANITIZE_NUMBER_INT);
}
if (isset($this->routes['4'])) {
$question_id = filter_var($this->routes['4'], FILTER_SANITIZE_NUMBER_INT);
}
if (!empty($form_id)) {
$this->ui->assign('form_id', $form_id);
$form = ORM::for_table('module_forms_forms')->find_one($form_id);
$this->ui->assign('form', $form);
if (!empty($question_id)) {
$question = ORM::for_table('module_forms_questions')
->table_alias('q')
->select('q.*')
->select('qf.form_id')
->select('qf.question_id')
->select('t.name', 'type')
->select('t.alias', 'alias')
->join('module_forms_questions_forms', 'q.id = qf.question_id', 'qf')
->join('module_forms_forms', 'f.id = qf.form_id', 'f')
->join('module_forms_types', 'q.type_id = t.id', 't')
->where('qf.form_id', $form_id)
->where('qf.question_id', $question_id)
->find_one();
$this->ui->assign('question', $question);
}
$questions = ORM::for_table('module_forms_questions')
->table_alias('q')
->select('q.id')
->select('q.question')
->select('q.parent_id')
->select('q.sorder')
->select('t.name', 'type')
->select_expr('(SELECT COUNT(quest.id) FROM module_forms_questions quest WHERE q.id = quest.parent_id)', 'has_child')
->join('module_forms_questions_forms', 'q.id = qf.question_id', 'qf')
->join('module_forms_forms', 'qf.form_id = f.id', 'f')
->join('module_forms_types', 'q.type_id = t.id', 't')
->where('qf.form_id', $form_id)
->order_by_asc('q.sorder')
->find_array();
$this->ui->assign('questions', $questions);
$webservices_fields = ORM::for_table('module_forms_webservices')
->table_alias('w')
->select('w.id', 'webservice_id')
->select('w.title', 'webservice')
->select('wf.id', 'webservice_field_id')
->select('wf.label', 'label')
->select('wf.name', 'name')
->join('module_forms_webservices_fields', 'w.id = wf.webservice_id', 'wf')
->where('w.id', $form->webservice_id)
->find_many();
$this->ui->assign('webservices_fields', $webservices_fields);
}
if (!empty($question_id))
$_st = $this->_L['module_forms_edit_question'];
else if (!empty($form_id))
$_st = $this->_L['module_forms_new_question'];
$assets_css = Asset::css(['modal', 's2/css/select2.min', 'toggle/bootstrap-toggle.min']);
$assets_css .= Asset::css('/../../../' . $this->_pd . '/assets/css/questions');
$this->ui->assign('xheader', $assets_css);
$assets_js = Asset::js(['modal', 's2/js/select2.min', 'toggle/bootstrap-toggle.min', 'dp/dist/datepicker.min']);
$assets_js .= Asset::js_external($this->_pd . '/assets/js/forms.js');
$assets_js .= Asset::js_external($this->_pd . '/assets/js/questions.js');
$this->ui->assign('xfooter', $assets_js);
$this->ui->assign('_st', $_st);
$this->ui->display($this->_pd . '/views/questions/modal_add.tpl');
}
/**
* Método que retorna um json com todas as quesões
*/
public function listAjax()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$form_id = null;
if (isset($_POST['form_id']) && !empty($_POST['form_id'])) {
$form_id = filter_var($_POST['form_id'], FILTER_SANITIZE_NUMBER_INT);
}
if ($form_id) {
$questions = ORM::for_table('module_forms_questions')
->table_alias('q')
->select('q.id')
->select('q.question')
->select('q.parent_id')
->select('q.sorder')
->select('q.type_id')
->select('t.name', 'type')
->select_expr('(SELECT COUNT(quest.id) FROM module_forms_questions quest WHERE q.id = quest.parent_id)', 'has_child')
->join('module_forms_questions_forms', 'q.id = qf.question_id', 'qf')
->join('module_forms_forms', 'qf.form_id = f.id', 'f')
->join('module_forms_types', 'q.type_id = t.id', 't')
->where('qf.form_id', $form_id)
->order_by_asc('q.sorder')
->find_array();
header('Content-Type: application/json');
echo json_encode($questions);
exit;
}
}
header('Content-Type: application/json');
echo json_encode(['status' => false, 'msg' => 'Error']);
exit;
}
/**
* Método para salvar o ID da questão pai
*/
public function addParent()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$parent_id = (isset($_POST['parent_id'])) ? filter_var($_POST['parent_id'], FILTER_SANITIZE_NUMBER_INT) : null;
$question_id = (isset($_POST['question_id'])) ? filter_var($_POST['question_id'], FILTER_SANITIZE_NUMBER_INT) : null;
$question = ORM::for_table('module_forms_questions')->find_one($question_id);
if ($question) {
$question->parent_id = $parent_id;
$question->save();
header('Content-Type: application/json');
echo '{"status": true, "msg": "OK"}';
exit;
}
}
}
/**
* Carrega o template do Modal de Jumps Lógicos
*/
public function modalAddLogicJump()
{
if (isset($this->routes['3'])) {
$this->ui->assign('question_id', $this->routes['3']);
}
$question = $this->model->getOne($this->routes['3']);
$this->ui->assign('question', $question);
$logic_jumps = ORM::for_table('module_forms_logic_jumps')
->where('question_id', $question->id)
->find_many();
$this->ui->assign('logic_jumps', $logic_jumps);
$questions = $this->model->all();
$this->ui->assign('questions', $questions);
$conditions = ORM::for_table('module_forms_conditions')
->table_alias('c')
->select('c.id')
->select('c.condition')
->select('c.operator')
->join('module_forms_types_conditions', 'tc.condition_id = c.id', 'tc')
->where('tc.type_id', $question->type_id)
->order_by_asc('c.condition')
->find_array();
$this->ui->assign('conditions', $conditions);
$this->ui->assign('_st', $this->_L['module_forms_logic_jump']);
$this->ui->display($this->_pd . '/views/questions/modal_logic_jumps.tpl');
}
/**
* Adiciona os Jumps lógicos as perguntas
*/
public function createLogicJump()
{
if (isset($_POST['question']) && count($_POST['question']) > 0) {
$data = array();
$result = false;
if (isset($_POST['id']) && is_numeric($_POST['id'])) {
// Antes de inserir os novos registros, remove os registros antigos.
ORM::for_table('module_forms_logic_jumps')->where('question_id', (int) $_POST['id'])->delete_many();
// Faz update adicionando o valor do 'default_jump_to'
if (isset($_POST['default_jump_to']) && is_numeric($_POST['default_jump_to'])) {
$default_jump_to = (isset($_POST['default_jump_to'])) ? filter_var($_POST['default_jump_to'], FILTER_SANITIZE_NUMBER_INT) : null;
$question = ORM::for_table('module_forms_questions')->find_one((int) $_POST['id']);
$question->default_jump_to = $default_jump_to;
$question->save();
}
}
foreach($_POST['question'] as $i => $item) {
$data['question_id'] = (isset($_POST['question'][$i])) ? filter_var($_POST['question'][$i], FILTER_SANITIZE_NUMBER_INT) : null;
$data['condition_id'] = (isset($_POST['condition'][$i])) ? filter_var($_POST['condition'][$i], FILTER_SANITIZE_NUMBER_INT) : null;
$data['value'] = (isset($_POST['condition_value'][$i])) ? filter_var($_POST['condition_value'][$i], FILTER_SANITIZE_STRING) : null;
$data['jump_to'] = (isset($_POST['jump_to'][$i])) ? filter_var($_POST['jump_to'][$i], FILTER_SANITIZE_NUMBER_INT) : null;
// Insere os Jumps
$result = ORM::for_table('module_forms_logic_jumps')->create($data)->save();
}
if ($result) {
header('Content-Type: application/json');
echo json_encode(['status' => true, 'msg' => 'Jump Lógico Adicionado com sucesso']);
exit;
}
}
}
/**
*
*/
public function validateLoginJump()
{
if (!isset($_POST['question']) || empty($_POST['question'])) {
r2(U . "module_forms/{$this->controller}/listQuestions", 'e', '');
}
}
/**
* Método para clonar a questão
*/
public function cloneQuestion()
{
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset($_POST['question_id']) || empty($_POST['question_id'])) {
r2(U . "module_forms/{$this->controller}/listQuestions", 'e', '');
}
if (!isset($_POST['question_id']) || empty($_POST['question_id'])) {
r2(U . "module_forms/{$this->controller}/listQuestions", 'e', '');
}
// Busca os dados da questão que será clonada
$question = ORM::for_table('module_forms_questions')->find_one((int) $_POST['question_id']);
$data = $question->as_array();
unset($data['id']);
// Cria a nova questão
$new_question = $this->model->createQuestion($data);
// Faz o relacionamento com o form
$question_forms = [
'form_id' => $_POST['form_id'],
'question_id' => $new_question->id
];
ORM::for_table('module_forms_questions_forms')->create($question_forms)->save();
echo json_encode(['status' => true, 'msg' => $this->_L['Clone question succesfully']]);
exit;
}
}
/**
*
*/
public function findChoices()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$question_id = (isset($_POST['question_id'])) ? $_POST['question_id'] : false;
$statement = ORM::for_table('module_forms_choices');
if ($question_id) {
$statement->where('question_id', $question_id);
}
$question_choices = $statement->find_array();
header('Content-Type: application/json');
echo json_encode($question_choices);
exit;
}
}
/**
*
*/
public function reorderPost()
{
$action = $_POST['action'];
$updateRecordsArray = $_POST['recordsArray'];
$listingCounter = 1;
foreach ($updateRecordsArray as $recordIDValue) {
$d = ORM::for_table($action)->find_one($recordIDValue);
$d->sorder = $listingCounter;
$d->save();
$listingCounter = $listingCounter + 1;
}
echo '<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
'.$_L[' <strong>Success!</strong> New Positions are updated in database'].'
</div>';
}
}