aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/course/forum/admin.php
blob: a7fff7196e395bb013bccc6563f438ba6cbc1b34 (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
<?php

/*
 * Copyright (C) 2011 - Till Glöggler     <tgloeggl@uos.de>
 *
 * 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.
 */

require_once 'forum_controller.php';

class Course_Forum_AdminController extends ForumController
{
    /* * * * * * * * * * * * * * * * * * * * */
    /* * *   A D M I N   M E T H O D S   * * */
    /* * * * * * * * * * * * * * * * * * * * */

    /**
     * show the administration page for mass-editing forum-entries
     */
    function index_action()
    {
        ForumPerm::check('admin', $this->getId());
        $nav = Navigation::getItem('course/forum2');
        $nav->setImage(Icon::create('forum', 'info'));
        Navigation::activateItem('course/forum2/admin');

        $list = ForumEntry::getList('flat', $this->getId());

        // sort by cat
        $new_list = [];
        // iterate over all categories and add the belonging areas to them
        foreach ($categories = ForumCat::getListWithAreas($this->getId(), false) as $category) {
            if ($category['topic_id']) {
                $new_list[$category['category_id']][$category['topic_id']] = $list['list'][$category['topic_id']];
                unset($list['list'][$category['topic_id']]);
            } else if (ForumPerm::has('add_area', $this->seminar_id)) {
                $new_list[$category['category_id']] = [];
            }
            $this->categories[$category['category_id']] = $category['entry_name'];
        }

        if (!empty($list['list'])) {
            // append the remaining entries to the standard category
            $new_list[$this->getId()] = array_merge((array)$new_list[$this->getId()], $list['list']);
        }

        $this->list = $new_list;

    }
    
    /**
     * show child entries for the passed entry
     * 
     * @param string $parent_id id of entry to get the childs for
     */
    function childs_action($parent_id)
    {
        $this->set_layout(null);

        // if the parent-id is a category-id, get all areas for this category
        if ($cat = ForumCat::get($parent_id)) {
            ForumPerm::check('admin', $cat['seminar_id']);  // check the perms in the categories seminar
            $this->entries = ForumEntry::parseEntries(ForumCat::getAreas($parent_id));
        } else {
            ForumPerm::check('admin', $this->getId(), $parent_id);
            $entries = ForumEntry::getList('flat', $parent_id);
            $this->entries = $entries['list'];
        }
    }

    /**
     * move the submitted topics[] to the passed destination
     * 
     * @param string $destination id of seminar to move topics to
     */
    function move_action($destination)
    {
        // check if destination is a category_id. if yes, use seminar_id instead
        if (ForumCat::get($destination)) {
            $category_id = $destination;
            $destination = $this->getId();
        }
        
        ForumPerm::check('admin', $this->getId(), $destination);

        foreach (Request::getArray('topics') as $topic_id) {
            // make sure every passed topic_id is checked against the current seminar
            ForumPerm::check('admin', $this->getId(), $topic_id);

            // if the source is an area and the target a category, just move this area to the category
            $entry = ForumEntry::getEntry($topic_id);
            if ($entry['depth'] == 1 && $category_id) {
                ForumCat::removeArea($topic_id);
                ForumCat::addArea($category_id, $topic_id);
            } else {
                // first step: move the whole topic with all childs
                ForumEntry::move($topic_id, $destination);

                // if the current topic id is an area, remove it from any categories
                ForumCat::removeArea($topic_id);

                // second step: move all to deep childs a level up (depth > 3)
                $data = ForumEntry::getList('depth_to_large', $topic_id);
                foreach ($data['list'] as $entry) {
                    $path = ForumEntry::getPathToPosting($entry['topic_id']);
                    array_shift($path); // Category
                    array_shift($path); // Area

                    $thread = array_shift($path); // Thread

                    ForumEntry::move($entry['topic_id'], $thread['id']);
                }
                
                // add entry to passed category when moving to the top
                if ($category_id) {
                    ForumCat::addArea($category_id, $topic_id);
                }                    
            }
        }

        $this->render_nothing();
    }
}