40cecad893b7ac80b0deb133c7700fe9a50160f8
[moodle.git] / mod / book / move.php
1 <?php
2 // This file is part of Book module for Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Move book chapter
19  *
20  * @package    mod_book
21  * @copyright  2004-2011 Petr Skoda {@link http://skodak.org}
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
26 require(dirname(__FILE__).'/../../config.php');
27 require_once(dirname(__FILE__).'/locallib.php');
29 $id        = required_param('id', PARAM_INT);        // Course Module ID
30 $chapterid = required_param('chapterid', PARAM_INT); // Chapter ID
31 $up        = optional_param('up', 0, PARAM_BOOL);
33 $cm = get_coursemodule_from_id('book', $id, 0, false, MUST_EXIST);
34 $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
35 $book = $DB->get_record('book', array('id'=>$cm->instance), '*', MUST_EXIST);
37 require_login($course, false, $cm);
38 require_sesskey();
40 $context = context_module::instance($cm->id);
41 require_capability('mod/book:edit', $context);
43 $chapter = $DB->get_record('book_chapters', array('id'=>$chapterid, 'bookid'=>$book->id), '*', MUST_EXIST);
46 $oldchapters = $DB->get_records('book_chapters', array('bookid'=>$book->id), 'pagenum', 'id, pagenum, subchapter');
48 $nothing = 0;
50 $chapters = array();
51 $chs = 0;
52 $che = 0;
53 $ts = 0;
54 $te = 0;
55 // create new ordered array and find chapters to be moved
56 $i = 1;
57 $found = 0;
58 foreach ($oldchapters as $ch) {
59     $chapters[$i] = $ch;
60     if ($chapter->id == $ch->id) {
61         $chs = $i;
62         $che = $chs;
63         if ($ch->subchapter) {
64             $found = 1;// Subchapter moves alone.
65         }
66     } else if ($chs) {
67         if ($found) {
68             // Nothing.
69         } else if ($ch->subchapter) {
70             $che = $i; // Chapter with subchapter(s).
71         } else {
72             $found = 1;
73         }
74     }
75     $i++;
76 }
78 // Find target chapter(s).
79 if ($chapters[$chs]->subchapter) { // Moving single subchapter up or down.
80     if ($up) {
81         if ($chs == 1) {
82             $nothing = 1; // Already first.
83         } else {
84             $ts = $chs - 1;
85             $te = $ts;
86         }
87     } else { // Down.
88         if ($che == count($chapters)) {
89             $nothing = 1; // Already last.
90         } else {
91             $ts = $che + 1;
92             $te = $ts;
93         }
94     }
95 } else { // Moving chapter and looking for next/previous chapter.
96     if ($up) { // Up.
97         if ($chs == 1) {
98             $nothing = 1; // Already first.
99         } else {
100             $te = $chs - 1;
101             for($i = $chs-1; $i >= 1; $i--) {
102                 if ($chapters[$i]->subchapter) {
103                     $ts = $i;
104                 } else {
105                     $ts = $i;
106                     break;
107                 }
108             }
109         }
110     } else { // Down.
111         if ($che == count($chapters)) {
112             $nothing = 1; // Already last.
113         } else {
114             $ts = $che + 1;
115             $found = 0;
116             for($i = $che+1; $i <= count($chapters); $i++) {
117                 if ($chapters[$i]->subchapter) {
118                     $te = $i;
119                 } else {
120                     if ($found) {
121                         break;
122                     } else {
123                         $te = $i;
124                         $found = 1;
125                     }
126                 }
127             }
128         }
129     }
132 // Recreated newly sorted list of chapters.
133 if (!$nothing) {
134     $newchapters = array();
136     if ($up) {
137         if ($ts > 1) {
138             for ($i=1; $i<$ts; $i++) {
139                 $newchapters[] = $chapters[$i];
140             }
141         }
142         for ($i=$chs; $i<=$che; $i++) {
143             $newchapters[$i] = $chapters[$i];
144         }
145         for ($i=$ts; $i<=$te; $i++) {
146             $newchapters[$i] = $chapters[$i];
147         }
148         if ($che<count($chapters)) {
149             for ($i=$che; $i<=count($chapters); $i++) {
150                 $newchapters[$i] = $chapters[$i];
151             }
152         }
153     } else {
154         if ($chs > 1) {
155             for ($i=1; $i<$chs; $i++) {
156                 $newchapters[] = $chapters[$i];
157             }
158         }
159         for ($i=$ts; $i<=$te; $i++) {
160             $newchapters[$i] = $chapters[$i];
161         }
162         for ($i=$chs; $i<=$che; $i++) {
163             $newchapters[$i] = $chapters[$i];
164         }
165         if ($te<count($chapters)) {
166             for ($i=$te; $i<=count($chapters); $i++) {
167                 $newchapters[$i] = $chapters[$i];
168             }
169         }
170     }
172     // Store chapters in the new order.
173     $i = 1;
174     foreach ($newchapters as $ch) {
175         $ch->pagenum = $i;
176         $DB->update_record('book_chapters', $ch);
177         $i++;
178     }
181 add_to_log($course->id, 'course', 'update mod', '../mod/book/view.php?id='.$cm->id, 'book '.$book->id);
182 add_to_log($course->id, 'book', 'update', 'view.php?id='.$cm->id, $book->id, $cm->id);
184 book_preload_chapters($book); // fix structure
185 $DB->set_field('book', 'revision', $book->revision+1, array('id'=>$book->id));
187 redirect('view.php?id='.$cm->id.'&chapterid='.$chapter->id);