aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/course/courseware.php
blob: c4e5d62a90ef75be1ca2941b46eef23d5f06e20a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php

require_once __DIR__.'/../courseware_controller.php';

use Courseware\StructuralElement;
use Courseware\Unit;

/**
 * @property ?string $entry_element_id
 * @property int $last_visitdate
 * @property mixed $course_id
 * @property mixed $courseware_progress_data
 * @property mixed $courseware_chapter_counter
 */
class Course_CoursewareController extends CoursewareController
{
    protected $_autobind = true;

    public function before_filter(&$action, &$args): void
    {
        parent::before_filter($action, $args);

        if (!Context::get()) {
            throw new CheckObjectException(_('Sie haben kein Objekt gewählt.'));
        }
        PageLayout::setTitle(Context::get()->getFullname() . ' - ' . _('Courseware'));
        PageLayout::setHelpKeyword('Basis.Courseware');

        checkObject();
        if (!Context::isCourse()) {
            throw new CheckObjectException(_('Es wurde keine passende Veranstaltung gefunden.'));
        }
        $this->studip_module = checkObjectModule('CoursewareModule', true);
        object_set_visit_module($this->studip_module->getPluginId());
        $this->last_visitdate = object_get_visit(Context::getId(), $this->studip_module->getPluginId());
        $this->licenses = $this->getLicenses();
        $this->oer_enabled = Config::get()->OERCAMPUS_ENABLED && $GLOBALS['perm']->have_perm(Config::get()->OER_PUBLIC_STATUS);
        $this->unitsNotFound = Unit::countBySql('range_id = ?', [Context::getId()]) === 0;

        $this->feedback_settings = json_encode([
            'activated' => \Feedback::isActivated(),
            'adminPerm' => \Feedback::hasAdminPerm(Context::getId()),
            'createPerm' => \Feedback::hasCreatePerm(Context::getId()),
        ]);
    }

    public function index_action(): void
    {
        $this->isTeacher = $GLOBALS['perm']->have_studip_perm(
            'tutor',
            Context::getId(),
            $GLOBALS['user']->id
        );
        Navigation::activateItem('course/courseware/shelf');
        $this->setIndexSidebar();
    }

    public function courseware_action($unit_id = null):  void
    {
        Navigation::activateItem('course/courseware/unit');
        if ($this->unitsNotFound) {
            PageLayout::postMessage(MessageBox::info(_('Es wurde kein Lernmaterial gefunden.')));
            return;
        }
        $user = User::findCurrent();
        $this->setCoursewareSidebar();

        /** @var array<mixed> $last */
        $last = UserConfig::get($user->id)->getValue('COURSEWARE_LAST_ELEMENT');
        $lastStructuralElement = \Courseware\StructuralElement::findOneById($last);

        if ($unit_id === null) {
            if (isset($lastStructuralElement) && $lastStructuralElement->canVisit($user)) {
                $this->redirectToFirstUnit('course', Context::getId(), $last);
            } else {
                $this->redirectToFirstUnit('course', Context::getId(), []);
            }
            return;
        }

        $this->entry_element_id = null;
        $this->unit_id = null;
        $unit = Unit::find($unit_id);
        if (isset($unit)) {
            if (isset($lastStructuralElement) && $lastStructuralElement->canVisit($user)) {
                $this->setEntryElement('course', $unit, $last, Context::getId());
            } else {
                $rootElement = [Context::getId() => $unit->structural_element->id];
                $this->setEntryElement('course', $unit, $rootElement, Context::getId());
            }
        }
    }

    public function tasks_action(): void
    {
        $this->isTeacher = $GLOBALS['perm']->have_studip_perm(
            'tutor',
            Context::getId(),
            $GLOBALS['user']->id
        );
        Navigation::activateItem('course/courseware/tasks');
        $this->setTasksSidebar();
    }

    public function activities_action(): void
    {
        Navigation::activateItem('course/courseware/activities');
        $this->setActivitiesSidebar();
    }

    public function pdf_export_action($element_id, $with_children): void
    {
        $element = \Courseware\StructuralElement::findOneById($element_id);
        $user = User::find($GLOBALS['user']->id);
        $this->render_pdf($element->pdfExport($user, $with_children), trim($element->title).'.pdf');
    }

    private function setIndexSidebar(): void
    {
        $sidebar = Sidebar::Get();
        $sidebar->addWidget(new VueWidget('courseware-action-widget'));
        SkipLinks::addIndex(_('Aktionen'), 'courseware-action-widget', 21);
        $sidebar->addWidget(new VueWidget('courseware-import-widget'));
    }

    private function setTasksSidebar(): void
    {
        $sidebar = Sidebar::Get();
        $sidebar->addWidget(new VueWidget('courseware-action-widget'));
        SkipLinks::addIndex(_('Aktionen'), 'courseware-action-widget', 21);
    }

    private function setActivitiesSidebar(): void
    {
        $sidebar = Sidebar::Get();
        $sidebar->addWidget(new VueWidget('courseware-activities-widget-filter-type'));
        $sidebar->addWidget(new VueWidget('courseware-activities-widget-filter-unit'));
    }
}