HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/apklausos/application/controllers/QuestionGroupsAdministrationController.php
<?php

use LimeSurvey\Models\Services\{
    QuestionGroupService,
    Exception\NotFoundException
};

class QuestionGroupsAdministrationController extends LSBaseController
{
    /**
     * It's import to have the accessRules set (security issue).
     * Only logged in users should have access to actions. All other permissions
     * should be checked in the action itself.
     *
     * @return array
     */
    public function accessRules()
    {
        return array(
            array(
                'allow',
                'actions' => array(),
                'users' => array('*'), //everybody
            ),
            array(
                'allow',
                'actions' => array(
                    'view',
                    'delete',
                    'add',
                    'getQuestionGroupTopBar',
                    'getQuestionsForGroup',
                    'import',
                    'importView',
                    'loadQuestionGroup',
                    'saveQuestionGroupData',
                    'updateOrder'
                ),
                'users' => array('@'), //only login users
            ),
            array('deny'), //always deny all actions not mentioned above
        );
    }

    /**
     * This part comes from renderWrappedTemplate
     *
     * @param string $view
     * @return bool
     */
    protected function beforeRender($view)
    {
        // Set topbar type if not already set
        if (!isset($this->aData['topBar']) || !isset($this->aData['topBar']['type'])) {
            $this->aData['topBar']['type'] = 'group';
        }
        if (empty($this->aData['topBar']['showCloseButton'])) {
            $this->aData['topBar']['showCloseButton'] = false;
        }

        if (isset($this->aData['surveyid'])) {
            if (!array_key_exists('oSurvey', $this->aData)) {
                $this->aData['oSurvey'] = Survey::model()->findByPk($this->aData['surveyid']);
            }
            // Needed to evaluate EM expressions in question summary
            // See bug #11845
            LimeExpressionManager::SetSurveyId($this->aData['surveyid']);
            LimeExpressionManager::StartProcessingPage(false, true);

            $this->layout = 'layout_questioneditor';
        }

        // Used in question editor (pjax).
        App()->getClientScript()->registerPackage('ace');
        App()->getClientScript()->registerPackage('jquery-ace');

        return parent::beforeRender($view);
    }

    /**
     * Renders the html for the question group view.
     *
     * @param int $surveyid    survey ID is important here for new questiongroups without groupid
     * @param int $gid
     * @param string $landOnSideMenuTab
     * @param string $mode  either 'overview' or 'auto'. The 'overview' mode ignores the 'noViewMode' user setting
     *
     * * @return void
     */
    public function actionView(int $surveyid, int $gid, $landOnSideMenuTab = 'structure', $mode = 'auto')
    {
        if (!in_array($landOnSideMenuTab, ['settings', 'structure', ''])) {
            $landOnSideMenuTab = 'structure';
        }
        if ($mode != 'overview' && SettingsUser::getUserSettingValue('noViewMode', App()->user->id)) {
            $this->redirect(
                App()->createUrl(
                    'questionGroupsAdministration/edit/',
                    [
                        'surveyid' => $surveyid,
                        'gid' => $gid,
                        'landOnSideMenuTab' => 'structure'
                    ]
                )
            );
        }

        if (!Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'read')) {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(App()->request->urlReferrer);
        }
        $aData = $this->setSurveyIdAndObject([], $surveyid);
        $aData['gid'] = $gid;
        $aData['condarray'] = getGroupDepsForConditions($surveyid, "all", $gid, "by-targgid");
        //check if group with the gid exists
        try {
            $questionGroupService = $this->getQuestionGroupServiceClass();
            $aData['oQuestionGroup'] = $oQuestionGroup = $questionGroupService->getQuestionGroupObject($surveyid, $gid);
        } catch (NotFoundException $e) {
            App()->user->setFlash('error', gT("Question group does not exists"));
            $this->redirect(App()->request->urlReferrer);
        }
        $grow = $oQuestionGroup->attributes;
        $grow['group_name'] = $oQuestionGroup->questiongroupl10ns[$aData['oSurvey']->language]->group_name ?? '';
        $grow['description'] = $oQuestionGroup->questiongroupl10ns[$aData['oSurvey']->language]->description ?? '';
        $aData['grow'] = array_map('flattenText', $grow);
        $aData['title_bar']['title'] = $aData['oSurvey']->currentLanguageSettings->surveyls_title
            . " (" . gT("ID") . ":" . $surveyid . ")";
        $topbarData = array_merge(
            TopbarConfiguration::getGroupTopbarData($surveyid),
            TopbarConfiguration::getSurveyTopbarData($surveyid),
            $aData
        );
        $aData['topbar']['middleButtons'] = $this->renderPartial(
            'partial/topbarBtns/groupTopbarLeft_view',
            $topbarData,
            true
        );
        $aData['topbar']['rightButtons'] = $this->renderPartial(
            'partial/topbarBtns/groupTopbarRight_view',
            $topbarData,
            true
        );
        $aData = $this->setSidemenuData($aData, $oQuestionGroup, $landOnSideMenuTab);
        $this->aData = $aData;

        $this->render('group_view', $this->aData);
    }

    /**
     * Renders the html for the question group edit.
     *
     * @param int $surveyid    survey ID is important here if group does not exist
     * @param int $gid
     * @param string $landOnSideMenuTab
     *
     * * @return void
     */
    public function actionEdit(int $surveyid, $gid, $landOnSideMenuTab = 'structure')
    {
        if (!Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'update')) {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(App()->request->urlReferrer);
        }
        $aData = $this->setSurveyIdAndObject([], $surveyid);
        App()->session['FileManagerContext'] = "edit:group:{$surveyid}";
        App()->loadHelper('admin/htmleditor');
        App()->loadHelper('surveytranslator');

        //todo: this action should not be used for new groups, use actionAdd instead
        $aData['gid'] =  $gid = ($gid === null || $gid === '') ? null : (int)$gid;
        $questionGroupService = $this->getQuestionGroupServiceClass();
        $aData['oQuestionGroup'] = $oQuestionGroup = $questionGroupService->getQuestionGroupObject($surveyid, $gid);
        $aData = $this->setLanguageData($aData);
        $aData['action'] = $aData['display']['menu_bars']['gid_action'] = 'editgroup';
        if ($gid !== null) {
            $aData['condarray'] = getGroupDepsForConditions($surveyid, "all", $gid, "by-targgid");
        }
        $aData['title_bar']['title'] = $aData['oSurvey']->currentLanguageSettings->surveyls_title
            . " (" . gT("ID") . ":" . $surveyid . ")";
        $aData['showWhiteCloseButton'] = true;
        $aData['closeUrl'] = $this->createUrl(
            'questionGroupsAdministration/view',
            [
                'surveyid' => $surveyid,
                'gid' => $oQuestionGroup->gid,
                'landOnSideMenuTab' => $landOnSideMenuTab,
                'mode' => 'overview',
            ]
        );

        $topbarData = TopbarConfiguration::getGroupTopbarData($aData['oSurvey']->sid);
        $topbarData = array_merge($topbarData, $aData);
        $aData['topbar']['middleButtons'] = $this->renderPartial(
            'partial/topbarBtns/editGroupTopbarLeft_view',
            $topbarData,
            true
        );
        $aData['topbar']['rightButtons'] = $this->renderPartial(
            'partial/topbarBtns/editGroupTopbarRight_view',
            $topbarData,
            true
        );
        $aData = $this->setSideMenuData($aData, $oQuestionGroup, $landOnSideMenuTab);
        $this->aData = $aData;

        $this->render('editGroup_view', $this->aData);
    }

    /**
     * Render view to add new question group.
     *
     * @param int $surveyid
     * @param string $landOnSideMenuTab
     *
     * @return void
     */
    public function actionAdd(int $surveyid, string $landOnSideMenuTab = 'structure')
    {
        if (!Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'create')) {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(App()->request->urlReferrer);
        }

        $aData = $this->setSurveyIdAndObject([], $surveyid);

        App()->session['FileManagerContext'] = "create:group:{$surveyid}";
        App()->loadHelper('admin/htmleditor');
        App()->loadHelper('surveytranslator');

        $aSurveyLanguages = $aData['oSurvey']->additionalLanguages;
        $aSurveyLanguages[] = $aData['oSurvey']->language;
        $aSurveyLanguages = array_reverse($aSurveyLanguages);

        App()->getClientScript()->registerScriptFile(App()->getConfig('adminscripts') . 'questiongroup.js');

        $aData['action'] = $aData['display']['menu_bars']['gid_action'] = 'addgroup';
        $aData['grplangs'] = $aSurveyLanguages;
        $aData['baselang'] = $aData['oSurvey']->language;

        $aData['title_bar']['title'] = $aData['oSurvey']->currentLanguageSettings->surveyls_title
            . " (" . gT("ID") . ":" . $surveyid . ")";

        $aData['backUrl'] = $this->createUrl(
            'questionAdministration/listQuestions',
            [
                'surveyid' => $surveyid
            ]
        );
        $topbarData = TopbarConfiguration::getSurveyTopbarData($surveyid);
        $topbarData = array_merge($topbarData, $aData);
        $aData['topbar']['middleButtons'] = $this->renderPartial(
            'partial/topbarBtns/addGroupTopbarLeft_view',
            $topbarData,
            true
        );
        $aData['topbar']['rightButtons'] = $this->renderPartial(
            'partial/topbarBtns/addGroupTopbarRight_view',
            $topbarData,
            true
        );
        $aData['sidemenu']['state'] = false;
        $aData['sidemenu']['landOnSideMenuTab'] = $landOnSideMenuTab;

        $this->aData = $aData;

        $this->render('addGroup_view', $this->aData);
    }

    /**
     * Function responsible to import a question group.
     *
     * @access public
     * @return void
     */
    public function actionImport()
    {
        $action = App()->request->getPost('action', '');
        $aData = $this->setSurveyIdAndObject([], (int) App()->request->getPost('sid', null));
        if (
            !Permission::model()->hasSurveyPermission(
                $aData['surveyid'],
                'surveycontent',
                'import'
            )
        ) {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(
                $this->createUrl(
                    'questionAdministration/listQuestions/',
                    ['surveyid' => $aData['surveyid'], 'activeTab' => 'groups']
                )
            );
        }

        if ($action == 'importgroup') {
            $questionGroupService = $this->getQuestionGroupServiceClass();
            $aImportResults = $questionGroupService->importQuestionGroup(
                $aData['surveyid'],
                App()->getConfig('tempdir'),
                App()->request->getPost('translinksfields', '')
            );

            if (isset($aImportResults['fatalerror'])) {
                App()->user->setFlash('error', $aImportResults['fatalerror']);
                $this->redirect(array('questionGroupsAdministration/importview/surveyid/' . $aData['surveyid']));
            }

            $aData['aImportResults'] = $aImportResults;
            $aData['sExtension'] = $aImportResults['extension'];
            $aData['sidemenu']['state'] = false;

            $aData['title_bar']['title'] = $aData['oSurvey']->currentLanguageSettings->surveyls_title
                . " (" . gT("ID") . ":" . $aData['surveyid'] . ")";

            $this->aData = $aData;
            $this->render('/questionAdministration/import', [
                'aImportResults' => $this->aData['aImportResults'],
                'sExtension' => $this->aData['sExtension'],
                'sid' => $this->aData['surveyid']
            ]);
        }
    }

    /**
     * Import a question group. If user has no permission for that, it redirects to
     * list of questionGroupsAdministration
     *
     * @param integer $surveyid
     *
     * @return void
     */
    public function actionImportView(int $surveyid, $landOnSideMenuTab = 'structure')
    {
        $aData = $this->setSurveyIdAndObject([], sanitize_int($surveyid));

        if (Permission::model()->hasSurveyPermission($aData['surveyid'], 'surveycontent', 'import')) {
            $aData['action'] = $aData['display']['menu_bars']['gid_action'] = 'addgroup';
            $aData['display']['menu_bars']['surveysummary'] = 'addgroup';
            $aData['sidemenu']['state'] = false;
            $aData['sidemenu']['questiongroups'] = true;
            $aData['sidemenu']['landOnSideMenuTab'] = $landOnSideMenuTab;

            $aData['topbar']['rightButtons'] = $this->renderPartial(
                'partial/topbarBtns/importGroupTopbarRight_view',
                [],
                true
            );

            $aData['title_bar']['title'] = $aData['oSurvey']->currentLanguageSettings->surveyls_title
                . " (" . gT("ID") . ":" . $aData['surveyid'] . ")";

            $this->aData = $aData;
            $this->render('importGroup_view', $aData);
        } else {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(
                $this->createUrl(
                    'questionAdministration/listQuestions/',
                    ['surveyid' => $aData['surveyid'], 'activeTab' => 'groups']
                )
            );
        }
    }

    /**
     * Action to delete a question group.
     * Could be an ajaxRequest OR a redirect to list question groups
     *
     * @access public
     *
     * @param boolean $asJson    Value of to Render as JSON
     *
     * @return void
     * @throws CHttpException if not authorized or invalid question group
     */
    public function actionDelete(bool $asJson = false)
    {
        if (!App()->getRequest()->isPostRequest) {
            throw new CHttpException(405, gT("Invalid action"));
        }

        $iGroupId = App()->getRequest()->getPost('gid');
        if ($iGroupId === null) {
            throw new CHttpException(401, gT("Invalid question group id"));
        }
        $iGroupId = sanitize_int($iGroupId);
        $oQuestionGroup = QuestionGroup::model()->find("gid = :gid", array(":gid" => $iGroupId));
        $iSurveyId = $oQuestionGroup->sid;
        $questionGroupService = $this->getQuestionGroupServiceClass();
        $iGroupsDeleted = $questionGroupService->deleteGroup($iGroupId, $iSurveyId);

        //this is only important for massaction ... (do we have massaction for survey groups?)
        if ($asJson !== false) {
            $success = $iGroupsDeleted > 0;
            $this->renderJSON(
                [
                    'success' => $success,
                    'deletedGroups' => $iGroupsDeleted,
                    'message' => ($success ? gT('The question group was deleted.') : gT('Group could not be deleted')),
                    'redirect' => $this->createUrl(
                        'questionAdministration/listQuestions/',
                        ['surveyid' => $iSurveyId, 'activeTab' => 'groups']
                    )

                ]
            );
            return;
        }

        if ($iGroupsDeleted > 0) {
            App()->setFlashMessage(gT('The question group was deleted.'));
        } else {
            App()->setFlashMessage(gT('Group could not be deleted'), 'error');
        }

        $survey = Survey::model()->findByPk($iSurveyId);
        // Make sure we have the latest groups data
        $survey->refresh();
        $landOnSideMenuTab = App()->request->getPost('landOnSideMenuTab');
        if ($landOnSideMenuTab == 'structure' && !empty($survey->groups)) {
            $this->redirect(
                App()->createUrl(
                    'questionGroupsAdministration/view/',
                    [
                        'surveyid' => $iSurveyId,
                        'gid' => $survey->groups[0]->gid,
                        'landOnSideMenuTab' => 'structure'
                    ]
                )
            );
        } else {
            $this->redirect($this->createUrl('questionAdministration/listQuestions', ['surveyid' => $iSurveyId , 'activeTab' => 'groups']));
        }
    }

    /**
     * Ajax request
     *
     * Returns the data for a question group. If question group
     * does not exists a new question group will be returned (not saved)
     *
     * todo: is this function still in use?
     *
     * @param int $surveyid
     * @param null $iQuestionGroupId
     */
    public function actionLoadQuestionGroup($surveyid, $iQuestionGroupId = null)
    {
        $surveyid = sanitize_int($surveyid);
        //permission check
        if (!Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'update')) {
            $this->renderJSON([
                'success' => false,
                'message' => 'No permission'
            ]);
        }

        $oQuestionGroup = QuestionGroup::model()->findByPk($iQuestionGroupId);
        $oSurvey = Survey::model()->findByPk($surveyid);

        $aLanguages = [];
        $aAllLanguages = getLanguageData(false, App()->session['adminlang']);
        $aSurveyLanguages = $oSurvey->getAllLanguages();

        array_walk($aSurveyLanguages, function ($lngString) use (&$aLanguages, $aAllLanguages) {
            $aLanguages[$lngString] = $aAllLanguages[$lngString]['description'];
        });

        if ($oQuestionGroup == null) {
            $oQuestionGroup = new QuestionGroup();
            $oQuestionGroup->sid = $oSurvey->sid;
            $i10N = [];
            array_walk($aSurveyLanguages, function ($sLanguage) use (&$i10N) {
                $i10N[$sLanguage] = [
                    'language' => $sLanguage,
                    'group_name' => '',
                    'group_name_expression' => '',
                    'description' => '',
                    'description_expression' => '',
                ];
            });
        } else {
            $i10N = [];
            foreach ($oQuestionGroup->questiongroupl10ns as $lng => $oQuestionGroupi10n) {
                $i10N[$lng] = $oQuestionGroupi10n->attributes;

                templatereplace(
                    $oQuestionGroupi10n->group_name,
                    array(),
                    $aReplacementData,
                    'Unspecified',
                    false,
                    null
                );
                $i10N[$lng]['group_name_expression'] = viewHelper::stripTagsEM(
                    LimeExpressionManager::GetLastPrettyPrintExpression()
                );

                templatereplace(
                    $oQuestionGroupi10n->description,
                    array(),
                    $aReplacementData,
                    'Unspecified',
                    false,
                    null
                );
                $i10N[$lng]['description_expression'] = viewHelper::stripTagsEM(
                    LimeExpressionManager::GetLastPrettyPrintExpression()
                );
            }
        }

        $aPermissions = [
            "read" => Permission::model()->hasSurveyPermission($oSurvey->sid, 'survey', 'read'),
            "update" => Permission::model()->hasSurveyPermission($oSurvey->sid, 'survey', 'update'),
            "editorpreset" => App()->session['htmleditormode'],
        ];

        $aQuestionGroup = $oQuestionGroup->attributes;
        LimeExpressionManager::ProcessString('{' . $aQuestionGroup['grelevance'] . '}');
        $aQuestionGroup['grelevance_expression'] = viewHelper::stripTagsEM(
            LimeExpressionManager::GetLastPrettyPrintExpression()
        );
        $this->renderJSON([
            'questionGroup' => $aQuestionGroup,
            'permissions' => $aPermissions,
            'questonGroupI10N' => $i10N,
            'languages' => $aLanguages
        ]);
    }

    /**
     * Ajax request
     * todo: is this function still in use?
     *
     * Returns all questions that belong to the group.
     *
     * @param $iQuestionGroupId integer ID of question group
     *
     * @return void
     */
    public function actionGetQuestionsForGroup($iQuestionGroupId)
    {
        $iQuestionGroupId = (int) $iQuestionGroupId;
        $oQuestionGroup = QuestionGroup::model()->findByPk($iQuestionGroupId);
        if ($oQuestionGroup == null || (!Permission::model()->hasSurveyPermission($oQuestionGroup->sid, 'surveycontent', 'read'))) {
            $this->renderJSON([]);
        }
        $aQuestions = [];
        $aAllQuestions = $oQuestionGroup->questions;
        array_walk($aAllQuestions, function ($oQuestion) use (&$aQuestions) {
            $aQuestions[$oQuestion->qid] = array_merge($oQuestion->attributes, $oQuestion->questionl10ns);
        });

        $this->renderJSON(['questions' => $aQuestions]);
    }

    /**
     * Ajax request
     *
     * Creates and updates question groups
     *
     * @param integer $sid ID of survey
     *
     * @throws CException
     *
     * @return void
     *
     */
    public function actionSaveQuestionGroupData(int $sid)
    {
        $questionGroupData = App()->request->getPost('questionGroup', []);
        $wholeQuestionGroupDataset = ['questionGroup'     => $questionGroupData,
                                      'questionGroupI10N' => App()->request->getPost('questionGroupI10N', [])
        ];
        $sScenario = App()->request->getPost('scenario', '');
        $iSurveyId = (int)$sid;

        $oQuestionGroup = isset($questionGroupData['gid']) ? QuestionGroup::model()->findByPk($questionGroupData['gid']) : null;

        //permission check ...
        if ($oQuestionGroup == null) {
            if (!Permission::model()->hasSurveyPermission($sid, 'surveycontent', 'create')) {
                App()->user->setFlash('error', gT("Access denied"));
                $this->redirect(App()->request->urlReferrer);
            }
        } elseif (!Permission::model()->hasSurveyPermission($sid, 'surveycontent', 'update')) {
            App()->user->setFlash('error', gT("Access denied"));
            $this->redirect(App()->request->urlReferrer);
        }

        $questionGroupService = $this->getQuestionGroupServiceClass();
        if ($oQuestionGroup == null) {
            $isNewGroup = true;
            $oQuestionGroup = $questionGroupService->createGroup($iSurveyId, $wholeQuestionGroupDataset);
        } else {
            $oQuestionGroup = $questionGroupService->updateGroup($iSurveyId, $oQuestionGroup->gid, $wholeQuestionGroupDataset);
        }

        $landOnSideMenuTab = 'structure';
        if (empty($sScenario)) {
            if (App()->request->getPost('close-after-save', '')) {
                $sScenario = 'save-and-close';
            } elseif (App()->request->getPost('saveandnew', '')) {
                $sScenario = 'save-and-new';
            } elseif (App()->request->getPost('saveandnewquestion', '')) {
                $sScenario = 'save-and-new-question';
            } elseif (!empty($isNewGroup)) {
                $sScenario = 'save-and-close';
            }
        }
        switch ($sScenario) {
            case 'save-and-new-question':
                $sRedirectUrl = $this->createUrl(
                    'questionAdministration/create/',
                    [
                        'surveyid' => $iSurveyId,
                        'gid' => $oQuestionGroup->gid,
                    ]
                );
                break;
            case 'save-and-new':
                $sRedirectUrl = $this->createUrl(
                    'questionGroupsAdministration/add/',
                    [
                        'surveyid' => $iSurveyId,
                    ]
                );
                break;
            case 'save-and-close':
                $sRedirectUrl = $this->createUrl(
                    'questionGroupsAdministration/view/',
                    [
                        'surveyid' => $iSurveyId,
                        'gid' => $oQuestionGroup->gid,
                        'landOnSideMenuTab' => $landOnSideMenuTab,
                        'mode' => 'overview',
                    ]
                );
                break;
            default:
                $sRedirectUrl = $this->createUrl(
                    'questionGroupsAdministration/edit/',
                    [
                        'surveyid' => $iSurveyId,
                        'gid' => $oQuestionGroup->gid,
                        'landOnSideMenuTab' => $landOnSideMenuTab
                    ]
                );
        }

        App()->setFlashMessage(gT("Question group successfully stored"));

        $this->redirect($sRedirectUrl);
    }

    /**
     * Reorder the questiongroups based on the new order in the adminsidepanel (structure tab).
     * @param integer $surveyid
     *
     * @return false|null|string|string[]
     * @throws CException
     */
    public function actionUpdateOrder(int $surveyid)
    {
        //permission check
        if (!Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'update')) {
            return $this->renderPartial(
                '/admin/super/_renderJson',
                array(
                    'data' => [
                        'success' => false,
                        'message' => gT("Access denied"),
                        'DEBUG'   => ['POST' => $_POST, 'grouparray' => []]
                    ],
                ),
            );
        }
        $groupArray = App()->request->getPost('grouparray', []);
        $questionGroupService = $this->getQuestionGroupServiceClass();
        $aResult = $questionGroupService->reorderQuestionGroups($surveyid, $groupArray);
        if ($aResult['success']) {
            return $this->renderPartial(
                '/admin/super/_renderJson',
                array(
                    'data' => [
                        'success' => true,
                        'DEBUG'   => ['POST' => $_POST, 'grouparray' => $groupArray]
                    ],
                ),
            );
        } else {
            return $this->renderPartial(
                '/admin/super/_renderJson',
                array(
                    'data' => [
                        'success' => false,
                        'message' => $aResult['message'],
                        'DEBUG'   => ['POST' => $_POST, 'grouparray' => $groupArray]
                    ],
                ),
            );
        }
    }

    /**
     * Returns the QuestionGroupService class which is created with dependency injection
     * @return QuestionGroupService
     * @throws \DI\DependencyException
     * @throws \DI\NotFoundException
     */
    private function getQuestionGroupServiceClass()
    {
        $diContainer = \LimeSurvey\DI::getContainer();

        return $diContainer->get(
            LimeSurvey\Models\Services\QuestionGroupService::class
        );
    }

    /**
     * Sets survey ID and object into passed array
     * @param array $aData
     * @return array
     */
    private function setSurveyIdAndObject(array $aData, $surveyId)
    {
        $aData['surveyid'] = $aData['sid'] = $surveyId;
        $aData['oSurvey'] = Survey::model()->findByPk($surveyId);

        return $aData;
    }

    /**
     * Sets sidemenu parameters to aData array before returning it.
     * @param array $aData
     * @param QuestionGroup $questionGroup
     * @param string $landOnSideMenuTab
     * @return array
     */
    private function setSidemenuData(array $aData, QuestionGroup $questionGroup, string $landOnSideMenuTab)
    {
        $survey = $aData['oSurvey'];
        $baselang = $survey->language;
        $aData['sidemenu']['state'] = true;
        $aData['sidemenu']['questiongroups'] = true;
        $aData['sidemenu']['group_name'] = $questionGroup->questiongroupl10ns[$baselang]->group_name ?? '';
        $aData['sidemenu']['explorer']['state'] = true;
        $aData['sidemenu']['explorer']['gid'] = $aData['gid'] ?? false;
        $aData['sidemenu']['explorer']['qid'] = false;
        $aData['sidemenu']['landOnSideMenuTab'] = $landOnSideMenuTab;

        return $aData;
    }

    /**
     * Sets language related data of question group into passed array before returning it.
     * @param array $aData
     * @return array
     */
    private function setLanguageData(array $aData)
    {
        /**
         *  TODO: check integrity of the group languages?
         *
         *  In LS3, group languages are checked here to make sure they match the survey languages:
         *  If language exists in group but not in survey, remove from group.
         *  If language exists in survey but not in group, create based on survey's base language.
         *
         *  Reference: https://github.com/LimeSurvey/LimeSurvey/blob/85cc864e2624b5c9c6daecce3c75af3c8701a237/application/controllers/admin/questiongroups.php#L349
         *
         *  It doesn't seem necessary here. And, if it's needed, it probably better in the Model.
         *
         */
        $additionalLanguages = $aData['oSurvey']->additionalLanguages;
        $languages = array_merge(array($aData['oSurvey']->language), $additionalLanguages);
        foreach ($languages as $sLanguage) {
            if (isset($aData['oQuestionGroup']->questiongroupl10ns[$sLanguage])) {
                $aGroupData = $aData['oQuestionGroup']->questiongroupl10ns[$sLanguage];
                $aData['aGroupData'][$sLanguage] = $aGroupData->attributes;
                $aTabTitles[$sLanguage] = getLanguageNameFromCode($sLanguage, false);
                if ($sLanguage == $aData['oSurvey']->language) {
                    $aTabTitles[$sLanguage] .= ' (' . gT("Base language") . ')';
                }
            }
        }
        $aData['tabtitles'] = $aTabTitles;

        return $aData;
    }
}