1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/limesurvey_ynh.git synced 2024-09-03 19:36:32 +02:00
limesurvey_ynh/sources/application/extensions/Menu/MenuWidget.php

653 lines
25 KiB
PHP

<?php
class MenuWidget extends CWidget
{
public $menu = array();
public function __construct($owner = null) {
parent::__construct($owner);
Yii::import('application.helpers.surveytranslator_helper', true);
}
public $defaults = array(
'title' => '',
'alt' => '',
'type' => 'link'
);
public $surveyId = null;
public $groupId = null;
public $questionId = null;
public function run()
{
$this->render('adminmenu', array('menu' => $this->menuMain()));
if (isset($this->surveyId))
{
$this->render('adminmenu', array('menu' => $this->menuSurvey($this->surveyId)));
}
if (isset($this->groupId))
{
$this->render('adminmenu', array('menu' => $this->menuGroup($this->groupId)));
}
if (isset($this->questionId))
{
$this->render('adminmenu', array('menu' => $this->menuQuestion($this->questionId)));
}
}
protected function menuMain()
{
$title = CHtml::tag('strong', array(), gT('Administration'));
if(Yii::app()->session['loginID'])
{
$title .= ' -- ' . gT("Logged in as:");
$text = ' ' . Yii::app()->session['user'] . ' ' . CHtml::image(Yii::app()->getConfig('adminimageurl'). 'profile_edit.png', gT("Edit your personal preferences"));
$title .= CHtml::tag('strong', array(), CHtml::link($text, array('admin/user', 'sa' => 'personalsettings')));
}
$menu['title'] = CHtml::tag('div', array('class'=>'menubar-title-left'), $title);
$menu['role'] = 'main';
$menu['imageUrl'] = App()->getConfig('adminimageurl');
$menu['items']['left'][] = array(
'href' => array('admin/survey'),
'alt' => gT('Default administration page'),
'image' => 'home.png',
);
$menu['items']['left'][] = 'separator';
if(Permission::model()->hasGlobalPermission('users','read'))
{
$menu['items']['left'][] = array(
'href' => array('admin/user'),
'alt' => gT('Manage survey administrators'),
'image' => 'security.png',
);
}
$menu['items']['left'][] = $this->userGroups();
$menu['items']['left'][] = $this->globalSettings();
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = $this->checkIntegrity();
$menu['items']['left'][] = $this->dumpDatabase();
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = $this->editLabels();
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = $this->editTemplates();
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = $this->participantDatabase();
$menu['items']['left'][] = $this->pluginManager();
$surveys = getSurveyList(true);
$tmpList = array();
$timeadjust = getGlobalSetting('timeadjust');
foreach ($surveys as $survey)
{
if($survey['active']!='Y')
{
$group = gT("Inactive");
$list = 'inactive';
} elseif($survey['expires']!='' && $survey['expires'] < dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust))
{
$group = gT("Expired");
$list = 'expired';
} else
{
$group = gt("Active");
$list = 'active';
}
$tmpList[$list][] = array(
'id' => $survey['sid'],
'title' => $survey['surveyls_title'],
'group' => $group
);
}
$surveyList = array();
if (array_key_exists('active', $tmpList)) {
$surveyList = array_merge($surveyList, $tmpList['active']);
}
if (array_key_exists('expired', $tmpList)) {
$surveyList = array_merge($surveyList, $tmpList['expired']);
}
if (array_key_exists('inactive', $tmpList)) {
$surveyList = array_merge($surveyList, $tmpList['inactive']);
}
$menu['items']['right'][] = array(
'title' => gT('Surveys:'),
'type' => 'select',
'name' => 'surveyid',
'route' => 'admin/survey/sa/view',
'param' => 'surveyid',
'empty' => gT('No surveys available.'),
'values' => $surveyList,
'value' => $this->surveyId
);
$menu['items']['right'][] = array(
'href' => array('admin/survey', 'sa' => 'index'),
'alt' => gT('Detailed list of surveys'),
'image' => 'surveylist.png'
);
$menu['items']['right'][] = $this->createSurvey();
$menu['items']['right'][] = 'separator';
$menu['items']['right'][] = array(
'href' => array('admin/authentication', 'sa' => 'logout'),
'alt' => gT('Logout'),
'image' => 'logout.png'
);
$menu['items']['right'][] = array(
'href' => "http://docs.limesurvey.org",
'alt' => gT('LimeSurvey online manual'),
'image' => 'showhelp.png'
);
$event = new PluginEvent('afterAdminMenuLoad', $this);
$event->set('menu', $menu);
$result = App()->getPluginManager()->dispatchEvent($event);
$menu = $result->get('menu');
return $menu;
}
protected function menuQuestion($questionId)
{
$question = Question::model()->findByPk($questionId);
$menu['title'] = "Question {$question->code} (id: {$questionId})";
$menu['role'] = 'question';
$menu['imageUrl'] = App()->getConfig('adminimageurl');
$menu['items']['left'][] = array(
'alt' => gT('Preview this question'),
'type' => 'link',
'image' => 'preview.png',
'target' => '_blank',
'href' => array('questions/preview/', 'id' => $questionId)
);
$menu['items']['left'][] = 'separator';
return $menu;
}
protected function menuSurvey($surveyId)
{
/**
* @todo Remove direct session access.
* @todo Remove admin specific setting; language is a property of any session.
*/
$surveyInfo = getSurveyInfo($surveyId, Yii::app()->session['adminlang']);
$menu['title'] = "Survey {$surveyInfo['surveyls_title']} (id: {$surveyId})";
$menu['role'] = 'survey';
$menu['imageUrl'] = App()->getConfig('adminimageurl');
if ($surveyInfo['active'] == 'Y')
{
$menu['items']['left'][] = array(
'type' => 'image',
'image' => 'active.png',
);
/**
* @todo Get request changes state.
*/
$menu['items']['left'][] = array(
'type' => 'image',
'image' => 'deactivate.png',
);
}
else
{
$menu['items']['left'][] = array(
'type' => 'image',
'image' => 'inactive.png',
);
$menu['items']['left'][] = array(
'href' => array('admin/survey', 'sa' => 'activate', 'surveyid' => $surveyId),
'image' => 'activate.png',
);
}
$menu['items']['left'][] = 'separator';
$languages = array($surveyInfo['language']);
if (isset($surveyInfo['additional_languages']))
{
$languages = array_merge($languages, array_filter(explode(' ', $surveyInfo['additional_languages'])));
}
foreach ($languages as $language)
{
$subitems[] = array(
'type' => 'link',
'title' => getLanguageNameFromCode($language, false),
'image' => 'do_30.png',
'href' => array('survey/index', 'sid' => $surveyId, 'newtest' => 'Y', 'lang' => $language)
);
}
$menu['items']['left'][] = array(
'type' => 'sub',
'href' => array('survey/index', 'sid' => $surveyId, 'newtest' => 'Y'),
'image' => 'do.png',
'items' => array(
array(
'type' => 'sub',
'items' => $subitems,
'href' => array('survey/index', 'sid' => $surveyId, 'newtest' => 'Y'),
'title' => gT('Test this survey'),
'image' => 'do_30.png'
)
)
);
$menu['items']['left'][] = array(
'type' => 'sub',
'href' => array('surveys/view', 'id' => $surveyId),
'image' => 'edit.png',
'items' => array(
array(
'type' => 'link',
'title' => gT('Edit text elements'),
'image' => 'edit_30.png',
'href' => array('admin/survey', 'sa' => 'editlocalsettings', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('General settings'),
'image' => 'survey_settings_30.png',
'href' => array('admin/survey', 'sa' => 'editsurveysettings', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Survey permissions'),
'image' => 'survey_security_30.png',
'href' => array('admin/surveypermission', 'sa' => 'view', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Quotas'),
'image' => 'quota_30.png',
'href' => array('admin/quotas', 'sa' => 'index', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Assessments'),
'image' => 'assessments_30.png',
'href' => array('admin/assessments', 'sa' => 'index', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Email templates'),
'image' => 'emailtemplates_30.png',
'href' => array('admin/emailtemplates', 'sa' => 'index', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Survey logic file'),
'image' => 'quality_assurance_30.png',
'href' => array('admin/expressions', 'sa' => 'survey_logic_file', 'sid' => $surveyId)
),
)
);
$menu['items']['left'][] = array(
'type' => 'sub',
'href' => array('surveys/view', 'id' => $surveyId),
'image' => 'tools.png',
'items' => array(
array(
'type' => 'link',
'title' => gT('Delete survey'),
'image' => 'delete_30.png',
'href' => array('admin/survey', 'sa' => 'delete', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Quick-translation'),
'image' => 'translate_30.png',
'href' => array('admin/translate', 'sa' => 'index', 'surveyid' => $surveyId)
),
array(
'type' => 'link',
'title' => gT('Expression manager'),
'image' => 'expressionmanager_30.png',
'href' => array('admin/expressions')
),
array(
'type' => 'link',
'title' => gT('Reset conditions'),
'image' => 'resetsurveylogic_30.png'
),
array(
'type' => 'sub',
'title' => gT('Regenerate question codes'),
'image' => 'resetsurveylogic_30.png',
'items' => array(
array(
'title' => gT('Straight'),
'image' => 'resetsurveylogic_30.png',
'href' => array('admin/survey', 'sa' => 'regenquestioncodes', 'surveyid' => $surveyId, 'subaction' => 'straight')
),
array(
'title' => gT('By group'),
'image' => 'resetsurveylogic_30.png',
'href' => array('admin/survey', 'sa' => 'regenquestioncodes', 'surveyid' => $surveyId, 'subaction' => 'bygroup')
)
)
),
)
);
$menu['items']['right'][] = array(
'title' => 'QuestionGroup:',
'type' => 'select',
'name' => 'id',
'route' => 'groups/view',
'values' => QuestionGroup::model()->findListByAttributes(array('sid' => $surveyId), 'group_name', 'gid'),
'value' => $this->groupId
);
$menu['items']['right'][] = array(
'alt' => gT('Add new group to survey'),
'type' => 'link',
'image' => 'add.png',
'href' => array('admin/questiongroups', 'sa' => 'add', 'surveyid' => $surveyId)
);
return $menu;
}
protected function menuGroup($groupId)
{
$group = QuestionGroup::model()->findByAttributes(array('gid' => $groupId));
$menu['title'] = "Group {$group->group_name} (id: {$groupId})";
$menu['role'] = 'group';
$menu['imageUrl'] = App()->getConfig('adminimageurl');
$menu['items']['left'][] = array(
'alt' => gT('Preview this group'),
'type' => 'link',
'image' => 'preview.png',
'target' => '_blank',
'href' => array('groups/preview', 'id' => $groupId)
);
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = array(
'alt' => gT('Edit current question group'),
'type' => 'link',
'image' => 'edit.png',
'href' => array('admin/questiongroups', 'sa' => 'edit', 'surveyid' => $group->sid, 'gid' => $groupId)
);
$menu['items']['left'][] = 'separator';
$menu['items']['left'][] = 'separator';
$menu['items']['right'][] = array(
'type' => 'select',
'title' => gT('Questions'),
'name' => 'id',
'route' => 'questions/update',
'values' => Question::model()->findListByAttributes(array('sid' => $group->sid, 'gid' => $groupId), 'code', 'qid'),
'value' => $this->questionId
);
$menu['items']['right'][] = array(
'alt' => gT('Add new question to group'),
'type' => 'link',
'image' => 'add.png',
'href' => array('questions/create', 'gid' => $groupId)
);
return $menu;
}
protected function renderItem($item, &$allowSeparator, $imageUrl, $level = 0)
{
$result = '';
if (is_array($item))
{
$allowSeparator = true;
if (isset($item['image']))
{
$result .= CHtml::image($imageUrl . $item['image'], isset($item['alt']) ? $item['alt'] : '');
}
if (isset($item['title']))
{
$result .= $item['title'];
}
if(isset($item['values']))
{
$result = $this->renderSelect($item);
}
if (isset($item['href']))
{
$options = array();
if (isset($item['target']))
{
$options['target'] = $item['target'];
}
$result = CHtml::link($result, $item['href'], $options);
}
if(isset($item['items']))
{
$result = $this->renderSub($item, $imageUrl, $level + 1);
}
}
elseif (is_string($item) && $item == 'separator' && $allowSeparator)
{
$result = CHtml::image($imageUrl . 'separator.gif');
$allowSeparator = false;
}
return CHtml::tag('li', array(), $result);
}
protected function renderMenu($menu)
{
foreach ($menu['items'] as $class => $menuItems)
{
echo CHtml::openTag('ol', array('class' => "menubar-$class level0"));
$allowSeparator = false;
foreach($menuItems as $item)
{
echo $this->renderItem($item, $allowSeparator, $menu['imageUrl']);
}
echo CHtml::closeTag('ol');
}
}
protected function renderSelect($item)
{
$result = CHtml::label($item['title'], $item['name']);
if (is_array(current($item['values'])))
{
$listData = CHtml::listData($item['values'], 'id', 'title', 'group');
}
else
{
$listData = $item['values'];
}
if (!empty($listData))
{
$htmlOptions = array(
'class' => 'select',
'id' => $item['name'],
'prompt' => ''//gT('Please choose...')
);
if (isset($item['route']))
{
$htmlOptions['data-route'] = $item['route'];
}
$result .= $this->widget('ext.bootstrap.widgets.TbSelect2', array(
'name' => $item['name'],
'value' => $item['value'],
'data' => $listData,
'options' => array(
'minimumResultsForSearch' => 10,
'placeholder' => gT('Please choose...')
),
'htmlOptions' => $htmlOptions
), true);
}
elseif (isset($item['empty']))
{
$result .= CHtml::tag('span', array(), ' '. $item['empty']);
}
return $result;
}
protected function renderSub($item, $imageUrl, $level)
{
$result = '';
if (isset($item['image']))
{
$result .= CHtml::image($imageUrl . $item['image']);
}
if (isset($item['title']))
{
$result .= $item['title'];
}
if (isset($item['href']))
{
$result = CHtml::link($result, $item['href']);
}
$result .= CHtml::openTag('ol', array('class' => "level$level"));
foreach ($item['items'] as $subItem)
{
$allowSeparator = false;
$result .= $this->renderItem($subItem, $allowSeparator, $imageUrl, $level);
}
$result .= CHtml::closeTag('ol');
return $result;
}
protected function globalSettings()
{
if (Permission::model()->hasGlobalPermission('settings','read'))
{
return array(
'href' => array('admin/globalsettings'),
'image' => 'global.png',
'alt' => gT('Global settings')
);
}
}
protected function checkIntegrity()
{
if (Permission::model()->hasGlobalPermission('settings','read'))
{
return array(
'href' => array('admin/checkintegrity'),
'image' => 'checkdb.png',
'alt' => gT('Check Data Integrity')
);
}
}
protected function createSurvey()
{
if (Permission::model()->hasGlobalPermission('surveys','create'))
{
return array(
'href' => array('admin/survey', 'sa' => 'newsurvey'),
'image' => 'add.png',
'alt' => gT('Create, import, or copy a survey')
);
}
}
protected function dumpDatabase()
{
if (Permission::model()->hasGlobalPermission('superadmin','read'))
{
if (in_array(Yii::app()->db->getDriverName(), array('mysql', 'mysqli')) || Yii::app()->getConfig('demo_mode') == true)
{
return array(
'image' => 'backup.png',
'href' => array("admin/dumpdb"),
'alt' => gT('Backup Entire Database')
);
}
else
{
return array(
'image' => 'backup_disabled.png',
'alt' => gT('The database export is only available for MySQL databases. For other database types please use the according backup mechanism to create a database dump.'),
'type' => 'image'
);
}
}
}
protected function editLabels()
{
if (Permission::model()->hasGlobalPermission('labelsets','read'))
{
return array(
'href' => array('admin/labels', 'sa' => 'view'),
'image' => 'labels.png',
'alt' => gT('Edit label sets')
);
}
}
protected function editTemplates()
{
if (Permission::model()->hasGlobalPermission('templates','read'))
{
return array(
'href' => array('admin/templates/'),
'alt' => gT('Template Editor'),
'image' => 'templates.png'
);
}
}
protected function userGroups()
{
if(Permission::model()->hasGlobalPermission('usergroups','read'))
{
return array(
'href' => array('admin/usergroups', 'sa' => 'index'),
'alt' => gT('Create/edit user groups'),
'image' => 'usergroup.png'
);
}
}
protected function participantDatabase()
{
if (Permission::model()->hasGlobalPermission('participantpanel','read'))
{
return array(
'alt' => gT('Central participant database/panel'),
'href' => array('admin/participants'),
'image' => 'cpdb.png'
);
}
}
protected function pluginManager()
{
if (Permission::model()->hasGlobalPermission('superadmin','read'))
{
return array(
'href' => array('/plugins'),
'alt' => gT('Plugin manager'),
'image' => 'plugin.png'
);
}
}
}
?>