Esempio n. 1
0
 public function ajaxResponder()
 {
     if (!OW::getAuthorization()->isUserAuthorized(OW::getUser()->getId(), 'admin') || empty($_POST["command"]) || !OW::getRequest()->isAjax()) {
         throw new Redirect404Exception();
     }
     $command = (string) $_POST["command"];
     switch ($command) {
         case 'deleteQuestion':
             $questionId = (int) $_POST['questionId'];
             $question = $this->questionService->findQuestionById($questionId);
             if (empty($question)) {
                 echo json_encode(array('result' => false));
                 exit;
             }
             $parent = null;
             if (!empty($question->parent)) {
                 $parent = $this->questionService->findQuestionByName($question->parent);
             }
             if ($question->base == 1 || !$question->removable || !empty($parent)) {
                 echo json_encode(array('result' => false));
                 exit;
             }
             $childList = $this->questionService->findQuestionChildren($question->name);
             $deleteList = array();
             $deleteQuestionNameList = array();
             foreach ($childList as $child) {
                 $deleteList[] = $child->id;
                 $deleteQuestionNameList[$child->name] = $child->name;
             }
             if (!empty($deleteList)) {
                 $this->questionService->deleteQuestion($deleteList);
             }
             if ($this->questionService->deleteQuestion(array((int) $_POST['questionId']))) {
                 echo json_encode(array('result' => "success", 'message' => OW::getLanguage()->text('admin', 'questions_question_was_deleted'), 'deleteList' => $deleteQuestionNameList));
                 exit;
             }
             echo json_encode(array('result' => false));
             exit;
             break;
         case 'findNearestSection':
             $sectionName = $_POST['sectionName'];
             if (!empty($sectionName)) {
                 $section = $this->questionService->findSectionBySectionName($sectionName);
                 if (empty($section)) {
                     echo json_encode(array('result' => false));
                     exit;
                 }
                 $nearSection = $this->questionService->findNearestSection($section);
                 if (empty($nearSection)) {
                     echo json_encode(array('result' => false));
                     exit;
                 }
                 echo json_encode(array('result' => "success", 'message' => OW::getLanguage()->text('admin', 'questions_delete_section_confirmation_with_move_questions', array('sectionName' => BOL_QuestionService::getInstance()->getSectionLang($nearSection->name)))));
                 exit;
             }
             echo json_encode(array('result' => false));
             exit;
             break;
         case 'deleteSection':
             if (!empty($_POST['sectionName']) && mb_strlen($_POST['sectionName']) > 0) {
                 /*@var $nearSection BOL_QuestionSection*/
                 $nearSection = $this->questionService->findSectionBySectionName($_POST['sectionName']);
                 $moveQuestionsToSection = null;
                 if (!empty($nearSection) && $nearSection->isDeletable && $this->questionService->deleteSection(htmlspecialchars($_POST['sectionName']), $moveQuestionsToSection)) {
                     $result = array('result' => "success", 'message' => OW::getLanguage()->text('admin', 'questions_section_was_deleted'));
                     if (!empty($moveQuestionsToSection)) {
                         $result['moveTo'] = $moveQuestionsToSection->name;
                     }
                     echo json_encode($result);
                     exit;
                 }
             }
             echo json_encode(array('result' => "false"));
             exit;
             break;
         case 'DeleteQuestionValue':
             $result = false;
             $questionId = htmlspecialchars($_POST["questionId"]);
             $question = $this->questionService->findQuestionById($questionId);
             $value = (int) $_POST["value"];
             if (empty($question) || empty($value) && $value !== 0) {
                 echo json_encode(array('result' => $result));
                 return;
             }
             if ($this->questionService->deleteQuestionValue($question->name, $value)) {
                 $result = true;
             }
             echo json_encode(array('result' => $result));
             break;
         case 'deleteAccountType':
             if (!empty($_POST['accountType']) && mb_strlen($_POST['accountType']) > 0) {
                 $accountTypes = $this->questionService->findAllAccountTypes();
                 $accountTypeList = array();
                 foreach ($accountTypes as $key => $account) {
                     if ($account->name != $_POST['accountType']) {
                         $accountTypeList[$account->name] = $account->name;
                     }
                 }
                 if (empty($accountTypeList)) {
                     echo json_encode(array('result' => "false", 'message' => OW::getLanguage()->text('admin', 'questions_cant_delete_last_account_type')));
                     exit;
                 } else {
                     if ($this->questionService->deleteAccountType($_POST['accountType'])) {
                         echo json_encode(array('result' => "success", 'message' => OW::getLanguage()->text('admin', 'questions_account_type_was_deleted')));
                         exit;
                     }
                 }
             }
             echo json_encode(array('result' => "false"));
             exit;
             break;
         case 'AddQuestionValues':
             $result = false;
             $questionId = (int) $_POST["questionId"];
             $question = $this->questionService->findQuestionById($questionId);
             $values = !empty($_POST["values"]) && is_array($_POST["values"]) ? $_POST["values"] : array();
             if (empty($question) || empty($values)) {
                 echo json_encode(array('result' => $result));
                 return;
             }
             if ($this->questionService->updateQuestionValues($question, $values)) {
                 $result = true;
             }
             echo json_encode(array('result' => $result));
             break;
         case 'AddAccountType':
             $result = false;
             $name = htmlspecialchars($_POST["accountTypeName"]);
             $roleId = (int) $_POST["role"];
             $accountType = new BOL_QuestionAccountType();
             $accountType->name = $name;
             $accountType->roleId = $roleId;
             $form = new ADMIN_CLASS_AddAccountTypeForm($accountType);
             $result = false;
             if ($form->isValid($_POST)) {
                 $result = $form->process($_POST);
             }
             echo json_encode(array('result' => $result, 'accountTypeName' => $name, 'roleId' => $roleId));
             break;
         case 'sortAccountType':
             $sortAccountType = json_decode($_POST['accountTypeList'], true);
             $result = false;
             if (isset($sortAccountType) && is_array($sortAccountType) && count($sortAccountType) > 0) {
                 $result = $this->questionService->reOrderAccountType($sortAccountType);
             }
             echo json_encode(array('result' => $result));
             break;
         case 'sortQuestions':
             $sectionName = htmlspecialchars($_POST['sectionName']);
             $sectionQuestionOrder = json_decode($_POST['questionOrder'], true);
             $check = true;
             if (!isset($sectionName)) {
                 $check = false;
             }
             if (!isset($sectionQuestionOrder) || !is_array($sectionQuestionOrder) || !count($sectionQuestionOrder) > 0) {
                 $check = false;
             }
             if ($sectionName === 'no_section') {
                 $sectionName = null;
             }
             $result = false;
             if ($check) {
                 $result = $this->questionService->reOrderQuestion($sectionName, $sectionQuestionOrder);
             }
             echo json_encode(array('result' => $result));
             break;
         case 'sortSection':
             $sectionOrder = json_decode($_POST['sectionOrder'], true);
             if (!isset($sectionOrder) || !is_array($sectionOrder) || !count($sectionOrder) > 0) {
                 return false;
             }
             $result = $this->questionService->reOrderSection($sectionOrder);
             echo json_encode(array('result' => $result));
             break;
         case 'questionPages':
             $question = $_POST['question'];
             $required = $_POST['required'] == 'true';
             $onJoin = $_POST['onJoin'] == 'true';
             $onEdit = $_POST['onEdit'] == 'true';
             $onView = $_POST['onView'] == 'true';
             $onSearch = $_POST['onSearch'] == 'true';
             $changed = !empty($_POST['changed']) ? $_POST['changed'] : null;
             if (empty($question)) {
                 echo json_encode(array('result' => false));
                 exit;
             }
             $questionDto = $this->questionService->findQuestionByName($question);
             if (!empty($questionDto)) {
                 $disableActionList = BOL_QuestionService::getInstance()->getQuestionDisableActionList($questionDto);
                 switch ($changed) {
                     case 'required':
                         if (!$disableActionList['disable_required']) {
                             $questionDto->required = $required;
                         }
                         break;
                     case 'onJoin':
                         if (!$disableActionList['disable_on_join']) {
                             $questionDto->onJoin = $onJoin;
                         }
                         break;
                     case 'onEdit':
                         if (!$disableActionList['disable_on_edit']) {
                             $questionDto->onEdit = $onEdit;
                         }
                         break;
                     case 'onSearch':
                         if (!$disableActionList['disable_on_search']) {
                             $questionDto->onSearch = $onSearch;
                         }
                         break;
                     case 'onView':
                         if (!$disableActionList['disable_on_view']) {
                             $questionDto->onView = $onView;
                         }
                         break;
                     default:
                         if (!$disableActionList['disable_required']) {
                             $questionDto->required = $required;
                         }
                         if (!$disableActionList['disable_on_join']) {
                             $questionDto->onJoin = $onJoin;
                         }
                         if (!$disableActionList['disable_on_edit']) {
                             $questionDto->onEdit = $onEdit;
                         }
                         if (!$disableActionList['disable_on_view']) {
                             $questionDto->onView = $onView;
                         }
                         if (!$disableActionList['disable_on_search']) {
                             $questionDto->onSearch = $onSearch;
                         }
                         break;
                 }
             }
             $this->questionService->saveOrUpdateQuestion($questionDto);
             echo json_encode(json_encode(array('result' => true)));
             break;
         case 'questionAccountTypes':
             $question = $_POST['question'];
             $data = $_POST['data'];
             if (empty($question) || empty($data)) {
                 echo json_encode(array('result' => false));
                 exit;
             }
             $questionDto = $this->questionService->findQuestionByName($question);
             if (!empty($questionDto)) {
                 $disableActionList = BOL_QuestionService::getInstance()->getQuestionDisableActionList($questionDto);
                 if (!$disableActionList['disable_account_type']) {
                     $add = array();
                     $delete = array();
                     foreach ($data as $accountType => $value) {
                         if ($value === "true") {
                             $add[] = $accountType;
                         } else {
                             $delete[] = $accountType;
                         }
                     }
                     if (!empty($delete)) {
                         BOL_QuestionService::getInstance()->deleteQuestionToAccountType($questionDto->name, $delete);
                     }
                     if (!empty($add)) {
                         BOL_QuestionService::getInstance()->addQuestionToAccountType($questionDto->name, $add);
                     }
                 }
             }
             echo json_encode(json_encode(array('result' => true)));
             break;
         case 'addSection':
             if (empty($_POST['section_name'])) {
                 echo json_encode(array('result' => false, 'message' => ''));
                 exit;
             }
             $sectionName = $_POST['section_name'];
             $questionSection = new BOL_QuestionSection();
             $questionSection->name = md5(uniqid());
             $questionSection->sortOrder = $this->questionService->findLastSectionOrder() + 1;
             $this->questionService->saveOrUpdateSection($questionSection);
             BOL_LanguageService::getInstance()->addOrUpdateValue(OW::getLanguage()->getCurrentId(), 'base', 'questions_section_' . $questionSection->name . '_label', htmlspecialchars($sectionName));
             if (OW::getDbo()->getAffectedRows() > 0) {
                 echo json_encode(array('result' => true, 'message' => OW::getLanguage()->text('admin', 'questions_section_was_added')));
             }
             break;
         case 'addQuestion':
             /* @var $form ADMIN_CLASS_AddQuestionForm */
             $form = OW::getClassInstance('ADMIN_CLASS_AddQuestionForm', 'qst_add_form', '');
             $form->process();
             break;
         case 'editQuestion':
             if (empty($_POST['questionId'])) {
                 echo json_encode(array('result' => false, 'errors' => array(), 'message' => OW::getLanguage()->text('admin', 'questions_not_found')));
                 exit;
             }
             $question = BOL_QuestionService::getInstance()->findQuestionById($_POST['questionId']);
             if (empty($question) || !$question instanceof BOL_Question) {
                 echo json_encode(array('result' => false, 'errors' => array(), 'message' => OW::getLanguage()->text('admin', 'questions_not_found')));
                 exit;
             }
             $form = OW::getClassInstance('ADMIN_CLASS_EditQuestionForm', 'qst_edit_form', '');
             $form->loadQuestionData($question);
             $form->process();
             break;
         default:
     }
     exit;
 }
Esempio n. 2
0
 public function index($params = array())
 {
     $this->addContentMenu();
     $accountType = null;
     if (isset($_GET['accountType'])) {
         OW::getSession()->set(self::SESSION_VAR_ACCIUNT_TYPE, trim($_GET['accountType']));
     }
     if (OW::getSession()->get(self::SESSION_VAR_ACCIUNT_TYPE)) {
         $accountType = OW::getSession()->get(self::SESSION_VAR_ACCIUNT_TYPE);
     }
     $serviceLang = BOL_LanguageService::getInstance();
     $language = OW::getLanguage();
     $currentLanguageId = OW::getLanguage()->getCurrentId();
     // get available account types from DB
     $accountTypes = $this->questionService->findAllAccountTypesWithQuestionsCount();
     /* @var $value BOL_QuestionAccount */
     foreach ($accountTypes as $key => $value) {
         $accounts[$value['name']] = $language->text('base', 'questions_account_type_' . $value['name']);
     }
     $accountsKeys = array_keys($accounts);
     $accountType = !isset($accountType) || !in_array($accountType, $accountsKeys) ? $accountsKeys[0] : $accountType;
     // -- Select account type form --
     $accountTypeSelectForm = new Form('qst_account_type_select_form');
     $accountTypeSelectForm->setMethod(Form::METHOD_GET);
     $qstAccountType = new Selectbox('accountType');
     $qstAccountType->addAttribute('id', 'qst_account_type_select');
     $qstAccountType->setLabel($language->text('admin', 'questions_account_type_label'));
     $qstAccountType->setOptions($accounts);
     $qstAccountType->setValue($accountType);
     $qstAccountType->setHasInvitation(false);
     $accountTypeSelectForm->addElement($qstAccountType);
     $this->addForm($accountTypeSelectForm);
     $script = '
                     $("#qst_account_type_select").change( function(){
                             $(this).parents("form:eq(0)").submit();
                     } );
                 ';
     OW::getDocument()->addOnloadScript($script);
     $this->assign('accountTypes', $accountTypes);
     $this->assign('editAccountTypeUrl', OW::getRouter()->urlFor('ADMIN_CTRL_Questions', 'editAccountType'));
     $addSectionForm = new Form('qst_add_section_form');
     $qstSectionName = new TextField('section_name');
     $qstSectionName->addAttribute('class', 'ow_text');
     $qstSectionName->addAttribute('style', 'width: auto;');
     $qstSectionName->setRequired();
     $qstSectionName->setLabel($language->text('admin', 'questions_new_section_label'));
     $addSectionForm->addElement($qstSectionName);
     if (OW::getRequest()->isPost() && isset($_POST['section_name'])) {
         if ($addSectionForm->isValid($_POST)) {
             $data = $addSectionForm->getValues();
             $questionSection = new BOL_QuestionSection();
             $questionSection->name = md5(uniqid());
             $questionSection->sortOrder = $this->questionService->findLastSectionOrder() + 1;
             $this->questionService->saveOrUpdateSection($questionSection);
             $this->questionService->updateQuestionsEditStamp();
             $serviceLang->addValue($currentLanguageId, 'base', 'questions_section_' . $questionSection->name . '_label', htmlspecialchars($data['section_name']));
             if (OW::getDbo()->getAffectedRows() > 0) {
                 OW::getFeedback()->info($language->text('admin', 'questions_section_was_added'));
             }
             $this->redirect(OW::getRequest()->getRequestUri());
         }
     }
     $this->addForm($addSectionForm);
     // -- Get all section, questions and question values --
     $questions = $this->questionService->findAllQuestionsWithSectionForAccountType($accountType);
     $section = null;
     $questionArray = array();
     $questionNameList = array();
     $sectionDeleteUrlList = array();
     $parentList = array();
     foreach ($questions as $sort => $question) {
         if ($section !== $question['sectionName']) {
             $section = $question['sectionName'];
             $sectionDeleteUrlList[$section] = OW::getRouter()->urlFor('ADMIN_CTRL_Questions', 'deleteSection', array("sectionName" => $section));
             $questionArray[$section] = array();
         }
         if (isset($questions[$sort]['id'])) {
             $questionArray[$section][$sort] = $questions[$sort];
             $questionArray[$section][$sort]['questionEditUrl'] = OW::getRouter()->urlFor('ADMIN_CTRL_Questions', 'edit', array("questionId" => $questions[$sort]['id']));
             $questionArray[$section][$sort]['questionDeleteUrl'] = OW::getRouter()->urlFor('ADMIN_CTRL_Questions', 'deleteQuestion', array("questionId" => $questions[$sort]['id']));
             if (!empty($question['parent'])) {
                 $parent = $this->questionService->findQuestionByName($question['parent']);
                 if (!empty($parent)) {
                     $questionArray[$section][$sort]['parentUrl'] = OW::getRouter()->urlFor('ADMIN_CTRL_Questions', 'edit', array("questionId" => $parent->id));
                     $questionArray[$section][$sort]['parentLabel'] = $this->questionService->getQuestionLang($parent->name);
                     $parentList[$question['parent']][] = array('name' => $question['name'], 'editUrl' => $questionArray[$section][$sort]['questionEditUrl']);
                 } else {
                     $questionArray[$section][$sort]['parent'] = '';
                 }
             }
             $questionNameList[] = $questions[$sort]['name'];
         }
     }
     foreach ($questions as $sort => $question) {
         $text = $language->text('admin', 'questions_delete_question_confirmation');
         if (array_key_exists($question['name'], $parentList)) {
             $questionStringList = array();
             foreach ($parentList[$question['name']] as $child) {
                 $questionStringList[] = BOL_QuestionService::getInstance()->getQuestionLang($child['name']);
             }
             $text = $language->text('admin', 'questions_delete_question_parent_confirmation', array('questions' => implode(', ', $questionStringList)));
         }
         $text = json_encode($text);
         OW::getDocument()->addOnloadScript("OW.registerLanguageKey('admin', 'questions_delete_question_confirmation_" . (int) $question['id'] . "', {$text});");
     }
     $questionValues = $this->questionService->findQuestionsValuesByQuestionNameList($questionNameList);
     $this->assign('questionsBySections', $questionArray);
     $this->assign('questionValues', $questionValues);
     $this->assign('sectionDeleteUrlList', $sectionDeleteUrlList);
     $language->addKeyForJs('admin', 'questions_delete_section_confirmation');
     $script = ' window.indexQuest = new indexQuestions( ' . json_encode(array('questionAddUrl' => OW::getRouter()->urlFor("ADMIN_CTRL_Questions", "add"), 'ajaxResponderUrl' => $this->ajaxResponderUrl)) . ' )';
     //' . json_encode( array( 'questionEditUrl' => $questionEditUrl ) ) . ' ); ';
     OW::getDocument()->addOnloadScript($script);
     $jsDir = OW::getPluginManager()->getPlugin("admin")->getStaticJsUrl();
     OW::getDocument()->addScript($jsDir . "questions.js");
     $baseJsDir = OW::getPluginManager()->getPlugin("base")->getStaticJsUrl();
     OW::getDocument()->addScript($baseJsDir . "jquery-ui.min.js");
 }