*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*/
use Studip\Button, Studip\LinkButton;
class Course_PlusController extends AuthenticatedController
{
public function before_filter(&$action, &$args)
{
parent::before_filter($action, $args);
$id = Context::get()->getId();
$object_type = Context::getType();
if (!$id || !$GLOBALS['perm']->have_studip_perm($object_type === 'course' ? 'tutor' : 'admin', $id)) {
throw new AccessDeniedException();
}
Navigation::activateItem('/course/modules');
if ($object_type === 'course') {
$this->sem = Context::get();
$this->sem_class = $this->sem->getSemClass();
} else {
$this->sem = Context::get();
$this->sem_class = SemClass::getDefaultInstituteClass($this->sem['type']);
}
PageLayout::setTitle(_("Mehr Funktionen"));
}
public function index_action()
{
PageLayout::setTitle($this->sem->getFullname() . " - " . PageLayout::getTitle());
PageLayout::addSqueezePackage('statusgroups'); //sortier css
$this->setupSidebar();
$this->available_modules = $this->getSortedList($this->sem);
if (Request::submitted('deleteContent')) {
$this->deleteContent($this->available_modules);
}
}
public function trigger_action()
{
$context = Context::get();
if (!$GLOBALS['perm']->have_studip_perm($context->getRangeType() === 'course' ? 'tutor' : 'admin', $context->getId())) {
throw new AccessDeniedException();
}
if (Request::isPost()) {
if ($context->getRangeType() === 'course') {
$sem_class = $context->getSemClass();
} else {
$sem_class = SemClass::getDefaultInstituteClass($context->type);
}
$moduleclass = Request::get("moduleclass");
$active = Request::int("active", 0);
$module = new $moduleclass;
if ($module->isActivatableForContext($context)) {
PluginManager::getInstance()->setPluginActivated($module->getPluginId(), $context->getId(), $active);
if (Context::isCourse()) {
if ($active) {
StudipLog::log('PLUGIN_ENABLE', Context::getId(), $module->getPluginId(), $GLOBALS['user']->id);
NotificationCenter::postNotification('PluginDidActivate', Context::getId(), $module->getPluginId());
} else {
StudipLog::log('PLUGIN_DISABLE', Context::getId(), $module->getPluginId(), $GLOBALS['user']->id);
NotificationCenter::postNotification('PluginDidDeactivate', Context::getId(), $module->getPluginId());
}
}
}
if ($active) {
$default_position = array_search(get_class($module), $sem_class->getActivatedModules());
if ($default_position !== false) {
$active_tool = ToolActivation::find([$context->getId(), $module->getPluginId()]);
if ($active_tool) {
$active_tool->position = $default_position;
$active_tool->store();
}
}
}
$this->redirect("course/plus/trigger", ['cid' => $context->getId()]);
} else {
$template = $GLOBALS['template_factory']->open("tabs.php");
$template->navigation = Navigation::getItem("/course");
$this->render_json([
'tabs' => $template->render()
]);
}
}
public function sorttools_action()
{
PageLayout::setTitle(_('Reihenfolge der Werkzeuge ändern'));
if (Request::submitted('order')) {
CSRFProtection::verifyUnsafeRequest();
$plugin_id = explode('_', Request::get('id'))[1];
$newpos = Request::get('index') + 1;
if ($this->sem->tools->findOneBy('plugin_id', $plugin_id)) {
$oldpos = $this->sem->tools->findOneBy('plugin_id', $plugin_id)->position;
if ($oldpos < $newpos) {
$this->sem->tools->findBy('position', $newpos, '>')->each(function ($p) {
$p->position++;
});
$this->sem->tools->findOneBy('plugin_id', $plugin_id)->position = $newpos + 1;
} else {
$this->sem->tools->findBy('position', $newpos, '>=')->each(function ($p) {
$p->position++;
});
$this->sem->tools->findOneBy('plugin_id', $plugin_id)->position = $newpos;
}
$this->sem->tools->orderBy('position asc')->each(function ($p) {static $pos = 0; $p->position = $pos++;});
$this->sem->tools->store();
$this->render_nothing();
return;
}
}
}
public function edittool_action($plugin)
{
PageLayout::setTitle(_('Optionen des Werkzeugs ändern'));
$id = explode('_', $plugin)[1];
$this->tool = ToolActivation::find([$this->sem->id, $id]);
if (!$this->tool) {
$this->render_nothing();
return;
}
if (Request::submitted('save')) {
CSRFProtection::verifyUnsafeRequest();
$displayname = trim(Request::get('displayname'));
if ($displayname !== $this->tool->getDisplayname()) {
if (strlen($displayname)) {
$this->tool->metadata['displayname'] = $displayname;
} else {
unset($this->tool->metadata['displayname']);
}
}
if (Request::get('permission') === 'tutor') {
$this->tool->metadata['visibility'] = 'tutor';
} else {
unset($this->tool->metadata['visibility']);
}
if ($this->tool->store()) {
PageLayout::postSuccess(_('Die Einstellungen wurden gespeichert.'));
}
$this->redirect($this->action_url('index'));
}
}
private function deleteContent($plugmodlist)
{
$name = Request::get('name');
foreach ($plugmodlist as $key => $val) {
if (array_key_exists($name, $val)) {
if ($val[$name]['type'] == 'plugin') {
$class = PluginEngine::getPlugin(get_class($val[$name]['object']));
$displayname = $class->getPluginName();
}
}
}
if (Request::submitted('check')) {
if (method_exists($class, 'deleteContent')) {
$class->deleteContent();
} else {
PageLayout::postMessage(MessageBox::info(_("Das Plugin/Modul enthält keine Funktion zum Löschen der Inhalte.")));
}
} else {
PageLayout::postMessage(MessageBox::info(sprintf(_("Sie beabsichtigen die Inhalte von %s zu löschen."), htmlReady($displayname))
. "
" . _("Wollen Sie die Inhalte wirklich löschen?") . "
"
. LinkButton::createAccept(_('Ja'), URLHelper::getURL("?deleteContent=true&check=true&name=" . $name))
. LinkButton::createCancel(_('Nein'))));
}
}
private function setupSidebar()
{
$plusconfig = UserConfig::get($GLOBALS['user']->id)->PLUS_SETTINGS;
if (!isset($_SESSION['plus'])) {
if (isset($plusconfig['course_plus'])){
$usr_conf = $plusconfig['course_plus'];
$_SESSION['plus']['Kategorie']['Lehr- und Lernorganisation'] = $usr_conf['Kategorie']['Lehr- und Lernorganisation'];
$_SESSION['plus']['Kategorie']['Kommunikation und Zusammenarbeit'] = $usr_conf['Kategorie']['Kommunikation und Zusammenarbeit'];
$_SESSION['plus']['Kategorie']['Inhalte und Aufgabenstellungen'] = $usr_conf['Kategorie']['Inhalte und Aufgabenstellungen'];
$_SESSION['plus']['Kategorie']['Sonstiges'] = $usr_conf['Kategorie']['Sonstiges'];
foreach ($usr_conf['Kategorie'] as $key => $val){
if(!array_key_exists($key, $_SESSION['plus']['Kategorie'])){
$_SESSION['plus']['Kategorie'][$key] = $val;
}
}
$_SESSION['plus']['View'] = $usr_conf['View'];
$_SESSION['plus']['displaystyle'] = $usr_conf['displaystyle'];
} else {
$_SESSION['plus']['Kategorie']['Lehr- und Lernorganisation'] = 1;
$_SESSION['plus']['Kategorie']['Kommunikation und Zusammenarbeit'] = 1;
$_SESSION['plus']['Kategorie']['Inhalte und Aufgabenstellungen'] = 1;
$_SESSION['plus']['Kategorie']['Sonstiges'] = 1;
$_SESSION['plus']['View'] = 'openall';
$_SESSION['plus']['displaystyle'] = 'category';
}
}
if(isset($_SESSION['plus']['Kategorielist'])){
foreach ($_SESSION['plus']['Kategorie'] as $key => $val){
if(!array_key_exists($key, $_SESSION['plus']['Kategorielist']) && $key != 'Sonstiges'){
unset($_SESSION['plus']['Kategorie'][$key]);
}
}
}
if (Request::get('mode') !== null) {
$_SESSION['plus']['View'] = Request::get('mode');
}
if (Request::get('displaystyle') !== null) {
$_SESSION['plus']['displaystyle'] = Request::get('displaystyle');
}
$sidebar = Sidebar::get();
$widget = new OptionsWidget();
$widget->setTitle(_('Kategorien'));
foreach ($_SESSION['plus']['Kategorie'] as $key => $val) {
if (Request::get(md5('cat_' . $key)) !== null) {
$_SESSION['plus']['Kategorie'][$key] = Request::get(md5('cat_' . $key));
}
if ($_SESSION['plus']['displaystyle'] == 'alphabetical') {
$_SESSION['plus']['Kategorie'][$key] = 1;
}
if ($key == 'Sonstiges') {
continue;
}
$widget->addCheckbox(
$key,
$_SESSION['plus']['Kategorie'][$key],
URLHelper::getURL('?', [md5('cat_' . $key) => 1, 'displaystyle' => 'category']),
URLHelper::getURL('?', [md5('cat_' . $key) => 0, 'displaystyle' => 'category'])
);
}
$widget->addCheckbox(
_('Sonstiges'),
$_SESSION['plus']['Kategorie']['Sonstiges'],
URLHelper::getURL('?', [md5('cat_Sonstiges') => 1, 'displaystyle' => 'category']),
URLHelper::getURL('?', [md5('cat_Sonstiges') => 0, 'displaystyle' => 'category'])
);
$sidebar->addWidget($widget, 'Kategorien');
$widget = new ActionsWidget();
$widget->setTitle(_('Ansichten'));
if ($_SESSION['plus']['View'] === 'openall') {
$widget->addLink(
_('Alles zuklappen'),
URLHelper::getURL('?', ['mode' => 'closeall']),
Icon::create('assessment')
);
} else {
$widget->addLink(
_('Alles aufklappen'),
URLHelper::getURL('?', ['mode' => 'openall']),
Icon::create('assessment')
);
}
if ($_SESSION['plus']['displaystyle'] === 'category') {
$widget->addLink(
_('Alphabetische Anzeige ohne Kategorien'),
URLHelper::getURL('?', ['displaystyle' => 'alphabetical']),
Icon::create('assessment')
);
} else {
$widget->addLink(
_('Anzeige nach Kategorien'),
URLHelper::getURL('?', ['displaystyle' => 'category']),
Icon::create('assessment')
);
}
$sidebar->addWidget($widget, 'ansicht');
$actions = new ActionsWidget();
$actions->addLink(
_('Werkzeugreihenfolge ändern'),
$this->action_url('sorttools'),
Icon::create('arr_2down')
)->asDialog('size=500;reload-on-close');
$sidebar->addWidget($actions, 'aktion');
unset($_SESSION['plus']['Kategorielist']);
$plusconfig['course_plus'] = $_SESSION['plus'];
UserConfig::get($GLOBALS['user']->id)->store('PLUS_SETTINGS', $plusconfig);
}
private function getSortedList(Range $context)
{
$list = [];
$cat_index = [];
foreach (PluginEngine::getPlugins('StudipModule') as $plugin) {
if (!$plugin->isActivatableForContext($context)) {
continue;
}
if (!$this->sem_class->isModuleMandatory(get_class($plugin))
&& $this->sem_class->isModuleAllowed(get_class($plugin))
) {
$info = $plugin->getMetadata();
$indcat = isset($info['category']) ? $info['category'] : 'Sonstiges';
if (!array_key_exists($indcat, $cat_index)) {
array_push($cat_index, $indcat);
}
$plugin_id = 'plugin_' . $plugin->getPluginId();
$tool = ToolActivation::find([$context->getRangeId(), $plugin->getPluginId()]);
$displayname = $info['displayname'] ?? $plugin->getPluginname();
if ($tool && $tool->metadata['displayname']) {
$displayname .= ' (' .$tool->getDisplayname() . ')';
}
$visibility = $tool && $tool->metadata['visibility'] ? $tool->metadata['visibility'] : 'autor';
if ($_SESSION['plus']['displaystyle'] != 'category') {
$list['Funktionen von A-Z'][$plugin_id]['object'] = $plugin;
$list['Funktionen von A-Z'][$plugin_id]['type'] = 'plugin';
$list['Funktionen von A-Z'][$plugin_id]['moduleclass'] = get_class($plugin);
$list['Funktionen von A-Z'][$plugin_id]['sorter'] = mb_strtolower($displayname);
$list['Funktionen von A-Z'][$plugin_id]['displayname'] = $displayname;
$list['Funktionen von A-Z'][$plugin_id]['visibility'] = $visibility;
} else {
$cat = isset($info['category']) ? $info['category'] : 'Sonstiges';
if (!isset($_SESSION['plus']['Kategorie'][$cat])) {
$_SESSION['plus']['Kategorie'][$cat] = 1;
}
$list[$cat][$plugin_id]['object'] = $plugin;
$list[$cat][$plugin_id]['moduleclass'] = get_class($plugin);
$list[$cat][$plugin_id]['type'] = 'plugin';
$list[$cat][$plugin_id]['sorter'] = mb_strtolower($displayname);
$list[$cat][$plugin_id]['displayname'] = $displayname;
$list[$cat][$plugin_id]['visibility'] = $visibility;
}
}
}
$sortedcats['Lehr- und Lernorganisation'] = [];
$sortedcats['Kommunikation und Zusammenarbeit'] = [];
$sortedcats['Inhalte und Aufgabenstellungen'] = [];
foreach ($list as $cat_key => $cat_val) {
uasort($cat_val, function ($a, $b) {return strcmp($a['sorter'], $b['sorter']);});
$list[$cat_key] = $cat_val;
if ($cat_key != 'Sonstiges') {
$sortedcats[$cat_key] = $list[$cat_key];
}
}
if (isset($list['Sonstiges'])) {
$sortedcats['Sonstiges'] = $list['Sonstiges'];
}
$_SESSION['plus']['Kategorielist'] = array_flip($cat_index);
return $sortedcats;
}
}