MDL-25070 fixed Wiki Search results in double breadcrumb node
[moodle.git] / mod / wiki / pagelib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * This file contains several classes uses to render the diferent pages
20  * of the wiki module
21  *
22  * @package mod-wiki-2.0
23  * @copyrigth 2009 Marc Alier, Jordi Piguillem marc.alier@upc.edu
24  * @copyrigth 2009 Universitat Politecnica de Catalunya http://www.upc.edu
25  *
26  * @author Jordi Piguillem
27  * @author Marc Alier
28  * @author David Jimenez
29  * @author Josep Arus
30  * @author Daniel Serrano
31  * @author Kenneth Riba
32  *
33  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
36 require_once($CFG->dirroot . '/mod/wiki/edit_form.php');
37 require_once($CFG->dirroot . '/tag/lib.php');
39 /**
40  * Class page_wiki contains the common code between all pages
41  *
42  * @package mod-wiki
43  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
44  */
45 abstract class page_wiki {
47     /**
48      * @var object Current subwiki
49      */
50     protected $subwiki;
52     /**
53      * @var int Current page
54      */
55     protected $page;
57     /**
58      * @var string Current page title
59      */
60     protected $title;
62     /**
63      * @var int Current group ID
64      */
65     protected $gid;
67     /**
68      * @var int Current user ID
69      */
70     protected $uid;
71     /**
72      * @var array The tabs set used in wiki module
73      */
74     protected $tabs = array('view' => 'view', 'edit' => 'edit', 'comments' => 'comments',
75                             'history' => 'history', 'map' => 'map');
76     /**
77      * @var array tabs options
78      */
79     protected $tabs_options = array();
80     /**
81      * @var object wiki renderer
82      */
83     protected $wikioutput;
85     /**
86      * page_wiki constructor
87      *
88      * @param $wiki. Current wiki
89      * @param $subwiki. Current subwiki.
90      * @param $cm. Current course_module.
91      */
92     function __construct($wiki, $subwiki, $cm) {
93         global $PAGE, $CFG;
94         $this->subwiki = $subwiki;
96         // initialise wiki renderer
97         $this->wikioutput = $PAGE->get_renderer('mod_wiki');
98         $PAGE->set_cacheable(true);
99         $PAGE->set_cm($cm);
100         $PAGE->set_activity_record($wiki);
101         // the search box
102         $PAGE->set_button(wiki_search_form($cm));
103     }
105     /**
106      * This method prints the top of the page.
107      */
108     function print_header() {
109         global $OUTPUT, $PAGE, $CFG, $USER, $SESSION;
111         $PAGE->set_heading(format_string($PAGE->course->fullname));
113         $this->set_url();
115         if (isset($SESSION->wikipreviousurl) && is_array($SESSION->wikipreviousurl)) {
116             $this->process_session_url();
117         }
118         $this->set_session_url();
120         $this->create_navbar();
121         $this->setup_tabs();
123         echo $OUTPUT->header();
125         echo $this->wikioutput->wiki_info();
127         // tabs are associated with pageid, so if page is empty, tabs should be disabled
128         if (!empty($this->page) && !empty($this->tabs)) {
129             echo $this->wikioutput->tabs($this->page, $this->tabs, $this->tabs_options);
130         }
131     }
133     /**
134      * Protected method to print current page title.
135      */
136     protected function print_pagetitle() {
137         global $OUTPUT;
138         $html = '';
140         $html .= $OUTPUT->container_start();
141         $html .= $OUTPUT->heading(format_string($this->title), 2, 'wiki_headingtitle');
142         $html .= $OUTPUT->container_end();
143         echo $html;
144     }
146     /**
147      * Setup page tabs, if options is empty, will set up active tab automatically
148      * @param array $options, tabs options
149      */
150     protected function setup_tabs($options = array()) {
151         global $CFG, $PAGE;
153         if (empty($CFG->usecomments) || !has_capability('mod/wiki:viewcomment', $PAGE->context)){
154             unset($this->tabs['comments']);
155         }
157         if (!has_capability('mod/wiki:editpage', $PAGE->context)){
158             unset($this->tabs['edit']);
159         }
162         if (empty($options)) {
163             $this->tabs_options = array('activetab' => substr(get_class($this), 10));
164         } else {
165             $this->tabs_options = $options;
166         }
168     }
170     /**
171      * This method must be overwritten to print the page content.
172      */
173     function print_content() {
174         throw new coding_exception('Page wiki class does not implement method print_content()');
175     }
177     /**
178      * Method to set the current page
179      *
180      * @param object $page Current page
181      */
182     function set_page($page) {
183         global $PAGE;
185         $this->page = $page;
186         $this->title = $page->title;
187         $PAGE->set_title($this->title);
188     }
190     /**
191      * Method to set the current page title.
192      * This method must be called when the current page is not created yet.
193      * @param string $title Current page title.
194      */
195     function set_title($title) {
196         global $PAGE;
198         $this->page = null;
199         $this->title = $title;
200         $PAGE->set_title($this->title);
201     }
203     /**
204      * Method to set current group id
205      * @param int $gid Current group id
206      */
207     function set_gid($gid) {
208         $this->gid = $gid;
209     }
211     /**
212      * Method to set current user id
213      * @param int $uid Current user id
214      */
215     function set_uid($uid) {
216         $this->uid = $uid;
217     }
219     /**
220      * Method to set the URL of the page.
221      * This method must be overwritten by every type of page.
222      */
223     protected function set_url() {
224         throw new coding_exception('Page wiki class does not implement method set_url()');
225     }
227     /**
228      * Protected method to create the common items of the navbar in every page type.
229      */
230     protected function create_navbar() {
231         global $PAGE, $CFG;
233         $PAGE->navbar->add(format_string($this->title), $CFG->wwwroot . '/mod/wiki/view.php?pageid=' . $this->page->id);
234     }
236     /**
237      * This method print the footer of the page.
238      */
239     function print_footer() {
240         global $OUTPUT;
241         echo $OUTPUT->footer();
242     }
244     protected function process_session_url() {
245         global $USER, $SESSION;
247         //delete locks if edit
248         $url = $SESSION->wikipreviousurl;
249         switch ($url['page']) {
250         case 'edit':
251             wiki_delete_locks($url['params']['pageid'], $USER->id, $url['params']['section'], false);
252             break;
253         }
254     }
256     protected function set_session_url() {
257         global $SESSION;
258         unset($SESSION->wikipreviousurl);
259     }
263 /**
264  * View a wiki page
265  *
266  * @package mod-wiki
267  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
268  */
269 class page_wiki_view extends page_wiki {
270     /**
271      * @var int the coursemodule id
272      */
273     private $coursemodule;
275     function print_header() {
276         global $PAGE;
278         parent::print_header();
280         $this->wikioutput->wiki_print_subwiki_selector($PAGE->activityrecord, $this->subwiki, $this->page);
282         if (!empty($this->page)) {
283             echo $this->wikioutput->prettyview_link($this->page);
284         }
286         //echo $this->wikioutput->page_index();
288         $this->print_pagetitle();
289     }
291     function print_content() {
292         global $PAGE, $CFG;
294         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
295         if (wiki_user_can_view($this->subwiki)) {
297             if (!empty($this->page)) {
298                 wiki_print_page_content($this->page, $context, $this->subwiki->id);
299                 $wiki = $PAGE->activityrecord;
300             } else {
301                 print_string('nocontent', 'wiki');
302                 // TODO: fix this part
303                 $swid = 0;
304                 if (!empty($this->subwiki)) {
305                     $swid = $this->subwiki->id;
306                 }
307             }
308         } else {
309             // @TODO: Tranlate it
310             echo "You can not view this page";
311         }
312     }
314     function set_url() {
315         global $PAGE, $CFG;
316         $params = array();
318         if (isset($this->coursemodule)) {
319             $params['id'] = $this->coursemodule;
320         } else if (!empty($this->page) and $this->page != null) {
321             $params['pageid'] = $this->page->id;
322         } else if (!empty($this->gid)) {
323             $params['wid'] = $PAGE->cm->instance;
324             $params['group'] = $this->gid;
325         } else if (!empty($this->title)) {
326             $params['swid'] = $this->subwiki->id;
327             $params['title'] = $this->title;
328         } else {
329             print_error(get_string('invalidparameters', 'wiki'));
330         }
332         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/view.php', $params);
333     }
335     function set_coursemodule($id) {
336         $this->coursemodule = $id;
337     }
339     protected function create_navbar() {
340         global $PAGE, $CFG;
342         $PAGE->navbar->add(format_string($this->title));
343         $PAGE->navbar->add(get_string('view', 'wiki'));
344     }
347 /**
348  * Wiki page editing page
349  *
350  * @package mod-wiki
351  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
352  */
353 class page_wiki_edit extends page_wiki {
355     public static $attachmentoptions;
357     protected $sectioncontent;
358     /** @var string the section name needed to be edited */
359     protected $section;
360     protected $overridelock = false;
361     protected $versionnumber = -1;
362     protected $upload = false;
363     protected $attachments = 0;
364     protected $deleteuploads = array();
365     protected $format;
367     function __construct($wiki, $subwiki, $cm) {
368         global $CFG, $PAGE;
369         parent::__construct($wiki, $subwiki, $cm);
370         self::$attachmentoptions = array('subdirs' => false, 'maxfiles' => - 1, 'maxbytes' => $CFG->maxbytes, 'accepted_types' => '*');
371         $PAGE->requires->js_init_call('M.mod_wiki.renew_lock', null, true);
372         $PAGE->requires->yui2_lib('connection');
373     }
375     protected function print_pagetitle() {
376         global $OUTPUT;
378         $title = $this->title;
379         if (isset($this->section)) {
380             $title .= ' : ' . $this->section;
381         }
382         echo $OUTPUT->container_start('wiki_clear');
383         echo $OUTPUT->heading(format_string($title), 2, 'wiki_headingtitle');
384         echo $OUTPUT->container_end();
385     }
387     function print_header() {
388         global $OUTPUT, $PAGE;
389         $PAGE->requires->data_for_js('wiki', array('renew_lock_timeout' => LOCK_TIMEOUT - 5, 'pageid' => $this->page->id, 'section' => $this->section));
391         parent::print_header();
393         $this->print_pagetitle();
395         print '<noscript>' . $OUTPUT->box(get_string('javascriptdisabledlocks', 'wiki'), 'errorbox') . '</noscript>';
396     }
398     function print_content() {
399         global $PAGE;
401         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
402         if (wiki_user_can_edit($this->subwiki)) {
403             $this->print_edit();
404         } else {
405             // @TODO: Translate it
406             echo "You can not edit this page";
407         }
408     }
410     protected function set_url() {
411         global $PAGE, $CFG;
413         $params = array('pageid' => $this->page->id);
415         if (isset($this->section)) {
416             $params['section'] = $this->section;
417         }
419         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/edit.php', $params);
420     }
422     protected function set_session_url() {
423         global $SESSION;
425         $SESSION->wikipreviousurl = array('page' => 'edit', 'params' => array('pageid' => $this->page->id, 'section' => $this->section));
426     }
428     protected function process_session_url() {
429     }
431     function set_section($sectioncontent, $section) {
432         $this->sectioncontent = $sectioncontent;
433         $this->section = $section;
434     }
436     public function set_versionnumber($versionnumber) {
437         $this->versionnumber = $versionnumber;
438     }
440     public function set_overridelock($override) {
441         $this->overridelock = $override;
442     }
444     function set_format($format) {
445         $this->format = $format;
446     }
448     public function set_upload($upload) {
449         $this->upload = $upload;
450     }
452     public function set_attachments($attachments) {
453         $this->attachments = $attachments;
454     }
456     public function set_deleteuploads($deleteuploads) {
457         $this->deleteuploads = $deleteuploads;
458     }
460     protected function create_navbar() {
461         global $PAGE, $CFG;
463         parent::create_navbar();
465         $PAGE->navbar->add(get_string('edit', 'wiki'));
466     }
468     protected function check_locks() {
469         global $OUTPUT, $USER, $CFG;
471         if (!wiki_set_lock($this->page->id, $USER->id, $this->section, true)) {
472             print $OUTPUT->box(get_string('pageislocked', 'wiki'), 'generalbox boxwidthnormal boxaligncenter');
474             if ($this->overridelock) {
475                 $params = 'pageid=' . $this->page->id;
477                 if ($this->section) {
478                     $params .= '&section=' . $this->section;
479                 }
481                 $form = '<form method="post" action="' . $CFG->wwwroot . '/mod/wiki/overridelocks.php?' . $params . '">';
482                 $form .= '<input type="hidden" name="sesskey" value="' . sesskey() . '" />';
483                 $form .= '<input type="submit" value="' . get_string('overridelocks', 'wiki') . '" />';
484                 $form .= '</form>';
486                 print $OUTPUT->box($form, 'generalbox boxwidthnormal boxaligncenter');
487             }
488             return false;
489         }
490         return true;
491     }
493     protected function print_edit($content = null) {
494         global $CFG, $OUTPUT, $USER, $PAGE;
496         if (!$this->check_locks()) {
497             return;
498         }
500         //delete old locks (> 1 hour)
501         wiki_delete_old_locks();
503         $version = wiki_get_current_version($this->page->id);
504         $format = $version->contentformat;
506         if ($content == null) {
507             if (empty($this->section)) {
508                 $content = $version->content;
509             } else {
510                 $content = $this->sectioncontent;
511             }
512         }
514         $versionnumber = $version->version;
515         if ($this->versionnumber >= 0) {
516             if ($version->version != $this->versionnumber) {
517                 print $OUTPUT->box(get_string('wrongversionlock', 'wiki'), 'errorbox');
518                 $versionnumber = $this->versionnumber;
519             }
520         }
522         $cm = $PAGE->cm;
523         $context = get_context_instance(CONTEXT_MODULE, $cm->id);
525         $url = $CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $this->page->id;
526         if (!empty($this->section)) {
527             $url .= "&section=" . $this->section;
528         }
530         $params = array('attachmentoptions' => page_wiki_edit::$attachmentoptions, 'format' => $version->contentformat, 'version' => $versionnumber);
532         $data = new StdClass();
533         $data->newcontent = $content;
534         $data->version = $versionnumber;
535         $data->format = $format;
537         switch ($format) {
538         case 'html':
539             $data->newcontentformat = FORMAT_HTML;
540             $data = file_prepare_standard_editor($data, 'newcontent', page_wiki_edit::$attachmentoptions, $context, 'mod_wiki', 'attachments', $this->subwiki->id);
541             break;
542         default:
543             //$draftitemid = file_get_submitted_draft_itemid('attachments');
544             //file_prepare_draft_area($draftitemid, $context->id, 'mod_wiki', 'attachments', $this->subwiki->id);
545             //$data->attachments = $draftitemid;
546             }
548         if ($version->contentformat != 'html') {
549             $params['contextid'] = $context->id;
550             $params['component'] = 'mod_wiki';
551             $params['filearea'] = 'attachments';
552             $params['fileitemid'] = $this->subwiki->id;
553         }
555         if (!empty($CFG->usetags)) {
556             $params['tags'] = tag_get_tags_csv('wiki_pages', $this->page->id, TAG_RETURN_TEXT);
557         }
559         $form = new mod_wiki_edit_form($url, $params);
561         if ($formdata = $form->get_data()) {
562             if ($format != 'html') {
563                 $errors = $this->process_uploads($context);
564                 if (!empty($errors)) {
565                     $contenterror = "";
566                     foreach ($errors as $e) {
567                         $contenterror .= "<p>" . get_string('filenotuploadederror', 'wiki', $e->get_filename()) . "</p>";
568                     }
569                     print $OUTPUT->box($contenterror, 'errorbox');
570                 }
571             }
572             if (!empty($CFG->usetags)) {
573                 $data->tags = $formdata->tags;
574             }
575         } else {
576             if (!empty($CFG->usetags)) {
577                 $data->tags = tag_get_tags_array('wiki', $this->page->id);
578             }
579         }
581         $form->set_data($data);
582         $form->display();
583     }
585     protected function process_uploads($context) {
586         global $PAGE, $OUTPUT;
588         if ($this->upload) {
589             file_save_draft_area_files($this->attachments, $context->id, 'mod_wiki', 'attachments', $this->subwiki->id);
590             return null;
591             //return wiki_process_attachments($this->attachments, $this->deleteuploads, $context->id, 'mod_wiki', 'attachments', $this->subwiki->id);
592         }
593     }
596 /**
597  * Class that models the behavior of wiki's view comments page
598  *
599  * @package mod-wiki
600  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
601  */
602 class page_wiki_comments extends page_wiki {
604     function print_header() {
606         parent::print_header();
608         $this->print_pagetitle();
610     }
612     function print_content() {
613         global $CFG, $OUTPUT, $USER, $PAGE, $COURSE;
614         require_once($CFG->dirroot . '/mod/wiki/locallib.php');
616         $page = $this->page;
617         $subwiki = $this->subwiki;
618         $wiki = $PAGE->activityrecord;
619         $cm = $PAGE->cm;
620         $course = $COURSE;
621         $context = get_context_instance(CONTEXT_MODULE, $cm->id);
623         require_capability('mod/wiki:viewcomment', $context, NULL, true, 'noviewcommentpermission', 'wiki');
625         $comments = wiki_get_comments($context->id, $page->id);
627         if (has_capability('mod/wiki:editcomment', $context)) {
628             echo '<div class="midpad"><a href="' . $CFG->wwwroot . '/mod/wiki/editcomments.php?action=add&amp;pageid=' . $page->id . '">' . get_string('addcomment', 'wiki') . '</a></div>';
629         }
631         $options = array('swid' => $this->page->subwikiid, 'pageid' => $page->id);
632         $version = wiki_get_current_version($this->page->id);
633         $format = $version->contentformat;
635         if (empty($comments)) {
636             echo $OUTPUT->heading(get_string('nocomments', 'wiki'));
637         }
639         foreach ($comments as $comment) {
641             $user = wiki_get_user_info($comment->userid);
643             $fullname = fullname($user, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
644             $by = new stdclass();
645             $by->name = '<a href="' . $CFG->wwwroot . '/user/view.php?id=' . $user->id . '&amp;course=' . $course->id . '">' . $fullname . '</a>';
646             $by->date = userdate($comment->timecreated);
648             $t = new html_table();
649             $cell1 = new html_table_cell($OUTPUT->user_picture($user, array('popup' => true)));
650             $cell2 = new html_table_cell(get_string('bynameondate', 'forum', $by));
651             $cell3 = new html_table_cell();
652             $cell3->atributtes ['width'] = "80%";
653             $cell4 = new html_table_cell();
654             $cell5 = new html_table_cell();
656             $row1 = new html_table_row();
657             $row1->cells[] = $cell1;
658             $row1->cells[] = $cell2;
659             $row2 = new html_table_row();
660             $row2->cells[] = $cell3;
662             if ($format != 'html') {
663                 if ($format == 'creole') {
664                     $parsedcontent = wiki_parse_content('creole', $comment->content, $options);
665                 } else if ($format == 'nwiki') {
666                     $parsedcontent = wiki_parse_content('nwiki', $comment->content, $options);
667                 }
669                 $cell4->text = html_entity_decode($parsedcontent['parsed_text']);
670             } else {
671                 $cell4->text = format_text($comment->content, FORMAT_HTML);
672             }
674             $row2->cells[] = $cell4;
676             $t->data = array($row1, $row2);
678             $actionicons = false;
679             if ((has_capability('mod/wiki:managecomment', $context))) {
680                 $urledit = new moodle_url('/mod/wiki/editcomments.php', array('commentid' => $comment->id, 'pageid' => $page->id, 'action' => 'edit'));
681                 $urldelet = new moodle_url('/mod/wiki/instancecomments.php', array('commentid' => $comment->id, 'pageid' => $page->id, 'action' => 'delete'));
682                 $actionicons = true;
683             } else if ((has_capability('mod/wiki:editcomment', $context)) and ($USER->id == $user->id)) {
684                 $urledit = new moodle_url('/mod/wiki/editcomments.php', array('commentid' => $comment->id, 'pageid' => $page->id, 'action' => 'edit'));
685                 $urldelet = new moodle_url('/mod/wiki/instancecomments.php', array('commentid' => $comment->id, 'pageid' => $page->id, 'action' => 'delete'));
686                 $actionicons = true;
687             }
689             if ($actionicons) {
690                 $cell6 = new html_table_cell($OUTPUT->action_icon($urledit, new pix_icon('t/edit', get_string('edit'))) . $OUTPUT->action_icon($urldelet, new pix_icon('t/delete', get_string('delete'))));
691                 $row3 = new html_table_row();
692                 $row3->cells[] = $cell5;
693                 $row3->cells[] = $cell6;
694                 $t->data[] = $row3;
695             }
697             echo html_writer::tag('div', html_writer::table($t), array('class'=>'no-overflow'));
699         }
700     }
702     function set_url() {
703         global $PAGE, $CFG;
704         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/comments.php', array('pageid' => $this->page->id));
705     }
707     protected function create_navbar() {
708         global $PAGE, $CFG;
710         parent::create_navbar();
711         $PAGE->navbar->add(get_string('comments', 'wiki'));
712     }
716 /**
717  * Class that models the behavior of wiki's edit comment
718  *
719  * @package mod-wiki
720  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
721  */
722 class page_wiki_editcomment extends page_wiki {
723     private $comment;
724     private $action;
725     private $form;
726     private $format;
728     function set_url() {
729         global $PAGE, $CFG;
730         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/comments.php', array('pageid' => $this->page->id));
731     }
733     function print_header() {
734         parent::print_header();
735         $this->print_pagetitle();
736     }
738     function print_content() {
739         global $PAGE;
741         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
742         require_capability('mod/wiki:editcomment', $context, NULL, true, 'noeditcommentpermission', 'wiki');
744         if ($this->action == 'add') {
745             $this->add_comment_form();
746         } else if ($this->action == 'edit') {
747             $this->edit_comment_form($this->comment);
748         }
749     }
751     function set_action($action, $comment) {
752         global $CFG;
753         require_once($CFG->dirroot . '/mod/wiki/comments_form.php');
755         $this->action = $action;
756         $this->comment = $comment;
757         $version = wiki_get_current_version($this->page->id);
758         $this->format = $version->contentformat;
760         if ($this->format == 'html') {
761             $destination = $CFG->wwwroot . '/mod/wiki/instancecomments.php?pageid=' . $this->page->id;
762             $this->form = new mod_wiki_comments_form($destination);
763         }
764     }
766     protected function create_navbar() {
767         global $PAGE, $CFG;
769         $PAGE->navbar->add(get_string('comments', 'wiki'), $CFG->wwwroot . '/mod/wiki/comments.php?pageid=' . $this->page->id);
771         if ($this->action == 'add') {
772             $PAGE->navbar->add(get_string('insertcomment', 'wiki'));
773         } else {
774             $PAGE->navbar->add(get_string('editcomment', 'wiki'));
775         }
776     }
778     protected function setup_tabs() {
779         parent::setup_tabs(array('linkedwhenactive' => 'comments', 'activetab' => 'comments'));
780     }
782     private function add_comment_form() {
783         global $CFG;
784         require_once($CFG->dirroot . '/mod/wiki/editors/wiki_editor.php');
786         $pageid = $this->page->id;
788         if ($this->format == 'html') {
789             $this->form->display();
790         } else {
791             wiki_print_editor_wiki($this->page->id, null, $this->format, -1, null, false, null, 'addcomments');
792         }
793     }
795     private function edit_comment_form($com) {
796         global $CFG;
797         require_once($CFG->dirroot . '/mod/wiki/comments_form.php');
798         require_once($CFG->dirroot . '/mod/wiki/editors/wiki_editor.php');
800         if ($this->format == 'html') {
801             $commentoptions = array('trusttext' => true, 'maxfiles' => 0);
802             $com->action = 'edit';
803             $com->entrycomment_editor['text'] = $com->content;
805             $this->form->set_data($com, $commentoptions);
806             $this->form->display();
807         } else {
808             $action = 'edit';
809             $commentid = $com->id;
810             $pageid = $this->page->id;
811             $destination = $CFG->wwwroot . '/mod/wiki/instancecomments.php?pageid=' . $pageid . '&id=' . $commentid . '&action=' . $action;
812             wiki_print_editor_wiki($this->page->id, $com->content, $this->format, -1, null, false, array(), 'editcomments', $commentid);
813         }
815     }
819 /**
820  * Wiki page search page
821  *
822  * @package mod-wiki
823  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
824  */
825 class page_wiki_search extends page_wiki {
826     private $search_result;
828     protected function create_navbar() {
829         global $PAGE, $CFG;
831         $PAGE->navbar->add(format_string($this->title));
832     }
834     function set_search_string($search, $searchcontent) {
835         $swid = $this->subwiki->id;
836         if ($searchcontent) {
837             $this->search_result = wiki_search_all($swid, $search);
838         } else {
839             $this->search_result = wiki_search_title($swid, $search);
840         }
842     }
844     function set_url() {
845         global $PAGE, $CFG;
846         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/search.php');
847     }
848     function print_content() {
849         global $PAGE;
851         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
852         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
854         echo $this->wikioutput->search_result($this->search_result);
855     }
858 /**
859  *
860  * Class that models the behavior of wiki's
861  * create page
862  *
863  */
864 class page_wiki_create extends page_wiki {
866     private $format;
867     private $swid;
868     private $wid;
869     private $action;
870     private $mform;
872     function print_header() {
873         $this->set_url();
874         parent::print_header();
875     }
877     function set_url() {
878         global $PAGE, $CFG;
880         $params = array();
881         if ($this->action == 'new') {
882             $params['action'] = 'new';
883             $params['swid'] = $this->swid;
884             $params['wid'] = $this->wid;
885             if ($this->title != get_string('newpage', 'wiki')) {
886                 $params['title'] = $this->title;
887             }
888             $PAGE->set_url($CFG->wwwroot . '/mod/wiki/create.php', $params);
889         } else {
890             $params['action'] = 'create';
891             $params['swid'] = $this->swid;
892             $PAGE->set_url($CFG->wwwroot . '/mod/wiki/create.php', $params);
893         }
894     }
896     function set_format($format) {
897         $this->format = $format;
898     }
900     function set_wid($wid) {
901         $this->wid = $wid;
902     }
904     function set_swid($swid) {
905         $this->swid = $swid;
906     }
908     function set_action($action) {
909         global $PAGE;
910         $this->action = $action;
912         require_once(dirname(__FILE__) . '/create_form.php');
913         $url = new moodle_url('/mod/wiki/create.php', array('action' => 'create', 'wid' => $PAGE->activityrecord->id, 'gid' => $this->gid, 'uid' => $this->uid));
914         $formats = wiki_get_formats();
915         $options = array('formats' => $formats, 'defaultformat' => $PAGE->activityrecord->defaultformat, 'forceformat' => $PAGE->activityrecord->forceformat);
916         if ($this->title != get_string('newpage', 'wiki')) {
917             $options['disable_pagetitle'] = true;
918         }
919         $this->mform = new mod_wiki_create_form($url->out(false), $options);
920     }
922     protected function create_navbar() {
923         global $PAGE;
925         $PAGE->navbar->add($this->title);
926     }
928     function print_content($pagetitle = '') {
929         global $PAGE;
931         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
933         // @TODO: Change this to has_capability and show an alternative interface.
934         require_capability('mod/wiki:createpage', $context, NULL, true, 'nocreatepermission', 'wiki');
935         $data = new stdClass();
936         if (!empty($pagetitle)) {
937             $data->pagetitle = $pagetitle;
938         }
939         $data->pageformat = $PAGE->activityrecord->defaultformat;
941         $this->mform->set_data($data);
942         $this->mform->display();
943     }
945     function create_page($pagetitle) {
946         global $USER, $CFG, $PAGE;
947         $data = $this->mform->get_data();
948         if (empty($this->subwiki)) {
949             $swid = wiki_add_subwiki($PAGE->activityrecord->id, $this->gid, $this->uid);
950             $this->subwiki = wiki_get_subwiki($swid);
951         }
952         if ($data) {
953             $id = wiki_create_page($this->subwiki->id, $data->pagetitle, $data->pageformat, $USER->id);
954         } else {
955             $id = wiki_create_page($this->subwiki->id, $pagetitle, $PAGE->activityrecord->defaultformat, $USER->id);
956         }
957         redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $id);
958     }
961 class page_wiki_preview extends page_wiki_edit {
963     private $newcontent;
965     function __construct($wiki, $subwiki, $cm) {
966         global $PAGE, $CFG, $OUTPUT;
967         parent::__construct($wiki, $subwiki, $cm);
968         $buttons = $OUTPUT->update_module_button($cm->id, 'wiki');
969         $PAGE->set_button($buttons);
971     }
973     function print_header() {
974         global $PAGE, $CFG;
976         parent::print_header();
978     }
980     function print_content() {
981         global $PAGE;
983         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
984         require_capability('mod/wiki:editpage', $context, NULL, true, 'noeditpermission', 'wiki');
986         $this->print_preview();
987     }
989     function set_newcontent($newcontent) {
990         $this->newcontent = $newcontent;
991     }
993     function set_url() {
994         global $PAGE, $CFG;
996         $params = array('pageid' => $this->page->id
997         );
999         if (isset($this->section)) {
1000             $params['section'] = $this->section;
1001         }
1003         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/edit.php', $params);
1004     }
1006     protected function setup_tabs() {
1007         parent::setup_tabs(array('linkedwhenactive' => 'view', 'activetab' => 'view'));
1008     }
1010     protected function check_locks() {
1011         return true;
1012     }
1014     protected function print_preview() {
1015         global $CFG, $OUTPUT;
1017         $version = wiki_get_current_version($this->page->id);
1018         $format = $version->contentformat;
1019         $content = $version->content;
1021         $url = $CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $this->page->id;
1022         if (!empty($this->section)) {
1023             $url .= "&section=" . $this->section;
1024         }
1025         $params = array('attachmentoptions' => page_wiki_edit::$attachmentoptions, 'format' => $this->format, 'version' => $this->versionnumber);
1027         if ($this->format != 'html') {
1028             $params['contextid'] = $context->id;
1029             $params['component'] = 'mod_wiki';
1030             $params['filearea'] = 'attachments';
1031             $params['fileitemid'] = $this->page->id;
1032         }
1033         $form = new mod_wiki_edit_form($url, $params);
1036         $options = array('swid' => $this->page->subwikiid, 'pageid' => $this->page->id, 'pretty_print' => true);
1038         if ($data = $form->get_data()) {
1039             $parseroutput = wiki_parse_content($data->contentformat, $data->newcontent_editor['text'], $options);
1040             $this->set_newcontent($data->newcontent_editor['text']);
1041             echo $OUTPUT->notification(get_string('previewwarning', 'wiki'), 'notifyproblem wiki_info');
1042             $content = format_text($parseroutput['parsed_text'], FORMAT_HTML, array('overflowdiv'=>true));
1043             echo $OUTPUT->box($content, 'generalbox wiki_previewbox');
1044             $content = $this->newcontent;
1045         }
1047         $this->print_edit($content);
1048     }
1052 /**
1053  *
1054  * Class that models the behavior of wiki's
1055  * view differences
1056  *
1057  */
1058 class page_wiki_diff extends page_wiki {
1060     private $compare;
1061     private $comparewith;
1063     function print_header() {
1064         global $OUTPUT;
1066         parent::print_header();
1068         $this->print_pagetitle();
1069         $vstring = new stdClass();
1070         $vstring->old = $this->compare;
1071         $vstring->new = $this->comparewith;
1072         echo $OUTPUT->heading(get_string('comparewith', 'wiki', $vstring));
1073     }
1075     /**
1076      * Print the diff view
1077      */
1078     function print_content() {
1079         global $PAGE;
1081         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
1082         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
1084         $this->print_diff_content();
1085     }
1087     function set_url() {
1088         global $PAGE, $CFG;
1090         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/diff.php', array('pageid' => $this->page->id, 'comparewith' => $this->comparewith, 'compare' => $this->compare));
1091     }
1093     function set_comparison($compare, $comparewith) {
1094         $this->compare = $compare;
1095         $this->comparewith = $comparewith;
1096     }
1098     protected function create_navbar() {
1099         global $PAGE, $CFG;
1101         parent::create_navbar();
1102         $PAGE->navbar->add(get_string('history', 'wiki'), $CFG->wwwroot . '/mod/wiki/history.php?pageid' . $this->page->id);
1103         $PAGE->navbar->add(get_string('diff', 'wiki'));
1104     }
1106     protected function setup_tabs() {
1107         parent::setup_tabs(array('linkedwhenactive' => 'history', 'activetab' => 'history'));
1108     }
1110     /**
1111      * Given two versions of a page, prints a page displaying the differences between them.
1112      *
1113      * @uses $CFG
1114      *
1115      * @param int $pageid The page id whose versions will be displayed.
1116      * @param int $cm The course id, needed to print user images.
1117      * @param int $compare The first version number to be compared.
1118      * @param int $comparewith The second version number to be compared.
1119      */
1120     private function print_diff_content() {
1121         global $CFG, $OUTPUT, $PAGE;
1123         $pageid = $this->page->id;
1124         $total = wiki_count_wiki_page_versions($pageid) - 1;
1126         $oldversion = wiki_get_wiki_page_version($pageid, $this->compare);
1127         $newversion = wiki_get_wiki_page_version($pageid, $this->comparewith);
1129         if ($oldversion && $newversion) {
1131             $oldtext = format_text($oldversion->content);
1132             $newtext = format_text($newversion->content);
1133             list($diff1, $diff2) = ouwiki_diff_html($oldtext, $newtext);
1134             $oldversion->diff = $diff1;
1135             $oldversion->user = wiki_get_user_info($oldversion->userid);
1136             $newversion->diff = $diff2;
1137             $newversion->user = wiki_get_user_info($newversion->userid);
1139             echo $this->wikioutput->diff($pageid, $oldversion, $newversion, array('total' => $total));
1140         } else {
1141             print_error('versionerror', 'wiki');
1142         }
1143     }
1146 /**
1147  *
1148  * Class that models the behavior of wiki's history page
1149  *
1150  */
1151 class page_wiki_history extends page_wiki {
1152     /**
1153      * @var int $paging current page
1154      */
1155     private $paging;
1157     /**
1158      * @var int @rowsperpage Items per page
1159      */
1160     private $rowsperpage = 10;
1162     /**
1163      * @var int $allversion if $allversion != 0, all versions will be printed in a signle table
1164      */
1165     private $allversion;
1167     function __construct($wiki, $subwiki, $cm) {
1168         global $PAGE;
1169         parent::__construct($wiki, $subwiki, $cm);
1170         $PAGE->requires->js_init_call('M.mod_wiki.history', null, true);
1171     }
1173     function print_header() {
1174         parent::print_header();
1175         $this->print_pagetitle();
1176     }
1178     function print_content() {
1179         global $PAGE;
1181         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
1182         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
1184         $this->print_history_content();
1185     }
1187     function set_url() {
1188         global $PAGE, $CFG;
1189         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/history.php', array('pageid' => $this->page->id));
1190     }
1192     function set_paging($paging) {
1193         $this->paging = $paging;
1194     }
1196     function set_allversion($allversion) {
1197         $this->allversion = $allversion;
1198     }
1200     protected function create_navbar() {
1201         global $PAGE, $CFG;
1203         parent::create_navbar();
1204         $PAGE->navbar->add(get_string('history', 'wiki'));
1205     }
1207     /**
1208      * Prints the history for a given wiki page
1209      *
1210      * @uses $CFG
1211      *
1212      * @param int      $pageid The page id whose history should be displayed.
1213      * @param int      $cm The course id, needed to print user images.
1214      * @param wikipage $wikipage
1215      * @param int      $allversion This tells how results should be displayed.
1216      *     If $allversion == 0 : Only $rowsperpage will be displayed at a time, and $paging is the page being displayed.
1217      *     If $allversion != 0 : All versions will be printed in a single table.
1218      * @param int      $paging Desired page to be displayed, this is ignored if $allversion!=0.
1219      * @param int      $rowsperpage How many rows to be displayed in each page, this is ignored if $allversion!=0.
1220      */
1221     private function print_history_content() {
1222         global $CFG, $OUTPUT, $PAGE;
1224         $pageid = $this->page->id;
1225         $offset = $this->paging * $this->rowsperpage;
1226         // vcount is the latest version
1227         $vcount = wiki_count_wiki_page_versions($pageid) - 1;
1228         if ($this->allversion) {
1229             $versions = wiki_get_wiki_page_versions($pageid, 0, $vcount);
1230         } else {
1231             $versions = wiki_get_wiki_page_versions($pageid, $offset, $this->rowsperpage);
1232         }
1233         // We don't want version 0 to be displayed
1234         // version 0 is blank page
1235         if (end($versions)->version == 0) {
1236             array_pop($versions);
1237         }
1239         $contents = array();
1241         $version0page = wiki_get_wiki_page_version($this->page->id, 0);
1242         $creator = wiki_get_user_info($version0page->userid);
1243         $a = new StdClass;
1244         $a->date = userdate($this->page->timecreated, get_string('strftimedaydatetime', 'langconfig'));
1245         $a->username = $creator->username;
1246         echo $OUTPUT->heading(get_string('createddate', 'wiki', $a), 4, 'wiki_headingtime');
1247         if ($vcount > 0) {
1249             /// If there is only one version, we don't need radios nor forms
1250             if (count($versions) == 1) {
1252                 $row = array_shift($versions);
1254                 $username = wiki_get_user_info($row->userid);
1255                 $picture = $OUTPUT->user_picture($username);
1256                 $date = userdate($row->timecreated, get_string('strftimedate', 'langconfig'));
1257                 $time = userdate($row->timecreated, get_string('strftimetime', 'langconfig'));
1258                 $versionid = wiki_get_version($row->id);
1259                 $versionlink = new moodle_url('/mod/wiki/viewversion.php', array('pageid' => $pageid, 'versionid' => $versionid->id));
1260                 $userlink = new moodle_url('/user/view.php', array('id' => $username->id));
1261                 $contents[] = array('', html_writer::link($versionlink->out(false), $row->version), $picture . html_writer::link($userlink->out(false), fullname($username)), $time, $OUTPUT->container($date, 'wiki_histdate'));
1263                 $table = new html_table();
1264                 $table->head = array('', get_string('version'), get_string('user'), get_string('modified'), '');
1265                 $table->data = $contents;
1266                 $table->attributes['class'] = 'mdl-align';
1268                 echo html_writer::table($table);
1270             } else {
1272                 $checked = $vcount - $offset;
1273                 $lastdate = '';
1274                 $rowclass = array();
1276                 foreach ($versions as $version) {
1277                     $user = wiki_get_user_info($version->userid);
1278                     $picture = $OUTPUT->user_picture($user, array('popup' => true));
1279                     $date = userdate($version->timecreated, get_string('strftimedate'));
1280                     if ($date == $lastdate) {
1281                         $date = '';
1282                         $rowclass[] = '';
1283                     } else {
1284                         $lastdate = $date;
1285                         $rowclass[] = 'wiki_histnewdate';
1286                     }
1287                     $time = userdate($version->timecreated, get_string('strftimetime', 'langconfig'));
1288                     $versionid = wiki_get_version($version->id);
1289                     if ($versionid) {
1290                         $url = new moodle_url('/mod/wiki/viewversion.php', array('pageid' => $pageid, 'versionid' => $versionid->id));
1291                         $viewlink = html_writer::link($url->out(false), $version->version);
1292                     } else {
1293                         $viewlink = $version->version;
1294                     }
1295                     $userlink = new moodle_url('/user/view.php', array('id' => $version->userid));
1296                     $contents[] = array($this->choose_from_radio(array($version->version  => null), 'compare', 'M.mod_wiki.history()', $checked - 1, true) . $this->choose_from_radio(array($version->version  => null), 'comparewith', 'M.mod_wiki.history()', $checked, true), $viewlink, $picture . html_writer::link($userlink->out(false), fullname($user)), $time, $OUTPUT->container($date, 'wiki_histdate'));
1297                 }
1299                 $table = new html_table();
1301                 $icon = $OUTPUT->help_icon('diff', 'wiki');
1303                 $table->head = array(get_string('diff', 'wiki') . $icon, get_string('version'), get_string('user'), get_string('modified'), '');
1304                 $table->data = $contents;
1305                 $table->attributes['class'] = 'mdl-align';
1306                 $table->rowclasses = $rowclass;
1308                 /*$table = new StdClass();
1309                  $table->head = array(helpbutton('diff', 'diff', 'wiki', true, false, '', true, ''),
1310                  get_string('version'),
1311                  get_string('user'),
1312                  get_string('modified'),
1313                  '');
1314                  $table->data = $contents;
1315                  $table->class = 'mdl-align';
1316                  $table->rowclass = $rowclass;*/
1318                 ///Print the form
1319                 echo '<form action="' . $CFG->wwwroot . '/mod/wiki/diff.php" method="get" id="diff">';
1320                 echo '<div><input type="hidden" name="pageid" value="' . $pageid . '" /></div>';
1321                 echo html_writer::table($table);
1322                 echo '<div><input class="wiki_form-button" type="submit" value="' . get_string('comparesel', 'wiki') . '"/></div>';
1323                 echo '</form>';
1324             }
1325         } else {
1326             print_string('nohistory', 'wiki');
1327         }
1328         if (!$this->allversion) {
1329             //$pagingbar = moodle_paging_bar::make($vcount, $this->paging, $this->rowsperpage, $CFG->wwwroot.'/mod/wiki/history.php?pageid='.$pageid.'&amp;');
1330             // $pagingbar->pagevar = $pagevar;
1331             echo $OUTPUT->paging_bar($vcount, $this->paging, $this->rowsperpage, $CFG->wwwroot . '/mod/wiki/history.php?pageid=' . $pageid . '&amp;');
1332             //print_paging_bar($vcount, $paging, $rowsperpage,$CFG->wwwroot.'/mod/wiki/history.php?pageid='.$pageid.'&amp;','paging');
1333             } else {
1334             $link = new moodle_url('/mod/wiki/history.php', array('pageid' => $pageid));
1335             $OUTPUT->container(html_writer::link($link->out(false), get_string('viewperpage', 'wiki', $this->rowsperpage)), 'mdl-align');
1336         }
1337         if ($vcount > $this->rowsperpage && !$this->allversion) {
1338             $link = new moodle_url('/mod/wiki/history.php', array('pageid' => $pageid, 'allversion' => 1));
1339             $OUTPUT->container(html_writer::link($link->out(false), get_string('viewallhistory', 'wiki')), 'mdl-align');
1340         }
1341     }
1343     /**
1344      * Given an array of values, creates a group of radio buttons to be part of a form
1345      *
1346      * @param array  $options  An array of value-label pairs for the radio group (values as keys).
1347      * @param string $name     Name of the radiogroup (unique in the form).
1348      * @param string $onclick  Function to be executed when the radios are clicked.
1349      * @param string $checked  The value that is already checked.
1350      * @param bool   $return   If true, return the HTML as a string, otherwise print it.
1351      *
1352      * @return mixed If $return is false, returns nothing, otherwise returns a string of HTML.
1353      */
1354     private function choose_from_radio($options, $name, $onclick = '', $checked = '', $return = false) {
1356         static $idcounter = 0;
1358         if (!$name) {
1359             $name = 'unnamed';
1360         }
1362         $output = '<span class="radiogroup ' . $name . "\">\n";
1364         if (!empty($options)) {
1365             $currentradio = 0;
1366             foreach ($options as $value => $label) {
1367                 $htmlid = 'auto-rb' . sprintf('%04d', ++$idcounter);
1368                 $output .= ' <span class="radioelement ' . $name . ' rb' . $currentradio . "\">";
1369                 $output .= '<input name="' . $name . '" id="' . $htmlid . '" type="radio" value="' . $value . '"';
1370                 if ($value == $checked) {
1371                     $output .= ' checked="checked"';
1372                 }
1373                 if ($onclick) {
1374                     $output .= ' onclick="' . $onclick . '"';
1375                 }
1376                 if ($label === '') {
1377                     $output .= ' /> <label for="' . $htmlid . '">' . $value . '</label></span>' . "\n";
1378                 } else {
1379                     $output .= ' /> <label for="' . $htmlid . '">' . $label . '</label></span>' . "\n";
1380                 }
1381                 $currentradio = ($currentradio + 1) % 2;
1382             }
1383         }
1385         $output .= '</span>' . "\n";
1387         if ($return) {
1388             return $output;
1389         } else {
1390             echo $output;
1391         }
1392     }
1395 /**
1396  * Class that models the behavior of wiki's map page
1397  *
1398  */
1399 class page_wiki_map extends page_wiki {
1401     /**
1402      * @var int wiki view option
1403      */
1404     private $view;
1406     function print_header() {
1407         parent::print_header();
1408         $this->print_pagetitle();
1409     }
1411     function print_content() {
1412         global $CFG, $PAGE;
1414         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
1415         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
1417         if ($this->view > 0) {
1418             //echo '<div><a href="' . $CFG->wwwroot . '/mod/wiki/map.php?pageid=' . $this->page->id . '">' . get_string('backtomapmenu', 'wiki') . '</a></div>';
1419             }
1421         switch ($this->view) {
1422         case 1:
1423             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1424             $this->print_contributions_content();
1425             break;
1426         case 2:
1427             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1428             $this->print_navigation_content();
1429             break;
1430         case 3:
1431             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1432             $this->print_orphaned_content();
1433             break;
1434         case 4:
1435             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1436             $this->print_index_content();
1437             break;
1438         case 5:
1439             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1440             $this->print_page_list_content();
1441             break;
1442         case 6:
1443             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1444             $this->print_updated_content();
1445             break;
1446         default:
1447             echo $this->wikioutput->menu_map($this->page->id, $this->view);
1448             $this->print_page_list_content();
1449         }
1450     }
1452     function set_view($option) {
1453         $this->view = $option;
1454     }
1456     function print_menu_map() {
1457         $options = array('contributions', 'links', 'orphaned', 'pageindex', 'pagelist', 'updatedpages');
1458         $items = array();
1459         foreach ($options as $opt) {
1460             $items[] = get_string($opt, 'wiki');
1461         }
1462         $table = new html_table();
1463         $table->head = array(get_string('mapmenu', 'wiki'));
1464         $table->attributes['class'] = 'wiki_editor generalbox';
1465         $table->data = array();
1466         $table->rowclasses = array();
1467         foreach ($items as $key => $item) {
1468             $link = new moodle_url('/mod/wiki/map.php', array('pageid' => $this->page->id, 'option' => $key + 1));
1469             $table->data[] = array(html_writer::link($link, $item));
1470         }
1471         echo html_writer::table($table);
1472     }
1474     function set_url() {
1475         global $PAGE, $CFG;
1476         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/map.php', array('pageid' => $this->page->id));
1477     }
1479     protected function create_navbar() {
1480         global $PAGE;
1482         parent::create_navbar();
1483         $PAGE->navbar->add(get_string('map', 'wiki'));
1484     }
1486     /**
1487      * Prints the contributions tab content
1488      *
1489      * @uses $OUTPUT, $USER
1490      *
1491      */
1492     private function print_contributions_content() {
1493         global $CFG, $OUTPUT, $USER;
1494         $page = $this->page;
1496         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1497             $fresh = wiki_refresh_cachedcontent($page);
1498             $page = $fresh['page'];
1499         }
1501         $swid = $this->subwiki->id;
1503         $table = new html_table();
1504         $table->head = array(get_string('contributions', 'wiki') . $OUTPUT->help_icon('contributions', 'wiki'));
1505         $table->attributes['class'] = 'wiki_editor generalbox';
1506         $table->data = array();
1507         $table->rowclasses = array();
1509         $lastversions = array();
1510         $pages = array();
1511         $users = array();
1513         if ($contribs = wiki_get_contributions($swid, $USER->id)) {
1514             foreach ($contribs as $contrib) {
1515                 if (!array_key_exists($contrib->pageid, $pages)) {
1516                     $page = wiki_get_page($contrib->pageid);
1517                     $pages[$contrib->pageid] = $page;
1518                 } else {
1519                     continue;
1520                 }
1522                 if (!array_key_exists($page->id, $lastversions)) {
1523                     $version = wiki_get_last_version($page->id);
1524                     $lastversions[$page->id] = $version;
1525                 } else {
1526                     $version = $lastversions[$page->id];
1527                 }
1529                 if (!array_key_exists($version->userid, $users)) {
1530                     $user = wiki_get_user_info($version->userid);
1531                     $users[$version->userid] = $user;
1532                 } else {
1533                     $user = $users[$version->userid];
1534                 }
1536                 $link = wiki_parser_link(format_string($page->title), array('swid' => $swid));
1537                 $class = ($link['new']) ? 'class="wiki_newentry"' : '';
1539                 $linkpage = '<a href="' . $link['url'] . '"' . $class . '>' . $link['content'] . '</a>';
1540                 $icon = $OUTPUT->user_picture($user, array('popup' => true));
1542                 $table->data[] = array("$icon&nbsp;$linkpage");
1543             }
1544         } else {
1545             $table->data[] = array(get_string('nocontribs', 'wiki'));
1546         }
1547         echo html_writer::table($table);
1548     }
1550     /**
1551      * Prints the navigation tab content
1552      *
1553      * @uses $OUTPUT
1554      *
1555      */
1556     private function print_navigation_content() {
1557         global $OUTPUT;
1558         $page = $this->page;
1560         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1561             $fresh = wiki_refresh_cachedcontent($page);
1562             $page = $fresh['page'];
1563         }
1565         $tolinks = wiki_get_linked_to_pages($page->id);
1566         $fromlinks = wiki_get_linked_from_pages($page->id);
1568         $table = new html_table();
1569         $table->attributes['class'] = 'wiki_navigation_from';
1570         $table->head = array(get_string('navigationfrom', 'wiki') . ':');
1571         $table->data = array();
1572         $table->rowclasses = array();
1573         foreach ($fromlinks as $link) {
1574             $lpage = wiki_get_page($link->frompageid);
1575             $link = new moodle_url('/mod/wiki/view.php', array('pageid' => $lpage->id));
1576             $table->data[] = array(html_writer::link($link->out(false), format_string($lpage->title)));
1577             $table->rowclasses[] = 'mdl-align';
1578         }
1580         $table_left = html_writer::table($table);
1582         $table = new html_table();
1583         $table->attributes['class'] = 'wiki_navigation_to';
1584         $table->head = array(get_string('navigationto', 'wiki') . ':');
1585         $table->data = array();
1586         $table->rowclasses = array();
1587         foreach ($tolinks as $link) {
1588             if ($link->tomissingpage) {
1589                 $viewlink = new moodle_url('/mod/wiki/create.php', array('swid' => $page->subwikiid, 'title' => $link->tomissingpage, 'action' => 'new'));
1590                 $table->data[] = array(html_writer::link($viewlink->out(false), format_string($link)->tomissingpage, array('class' => 'wiki_newentry')));
1591             } else {
1592                 $lpage = wiki_get_page($link->topageid);
1593                 $viewlink = new moodle_url('/mod/wiki/view.php', array('pageid' => $lpage->id));
1594                 $table->data[] = array(html_writer::link($viewlink->out(false), format_string($lpage->title)));
1595             }
1596             $table->rowclasses[] = 'mdl-align';
1597         }
1598         $table_right = html_writer::table($table);
1599         echo $OUTPUT->container($table_left . $table_right, 'wiki_navigation_container');
1600     }
1602     /**
1603      * Prints the index page tab content
1604      *
1605      *
1606      */
1607     private function print_index_content() {
1608         $page = $this->page;
1610         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1611             $fresh = wiki_refresh_cachedcontent($page);
1612             $page = $fresh['page'];
1613         }
1615         $node = new navigation_node($page->title);
1617         $keys = array();
1618         $tree = array();
1619         $tree = wiki_build_tree($page, $node, $keys);
1621         $table = new html_table();
1622         $table->head = array(get_string('pageindex', 'wiki'));
1623         $table->attributes['class'] = 'wiki_editor generalbox';
1624         $table->data[] = array($this->render_navigation_node($tree));
1626         echo html_writer::table($table);
1627     }
1629     /**
1630      * Prints the page list tab content
1631      *
1632      *
1633      */
1634     private function print_page_list_content() {
1635         $page = $this->page;
1637         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1638             $fresh = wiki_refresh_cachedcontent($page);
1639             $page = $fresh['page'];
1640         }
1642         $pages = wiki_get_page_list($this->subwiki->id);
1644         $stdaux = new stdClass();
1645         $strspecial = get_string('special', 'wiki');
1647         foreach ($pages as $page) {
1648             $letter = strtoupper(substr($page->title, 0, 1));
1649             if (preg_match('/[A-Z]/', $letter)) {
1650                 $stdaux->{
1651                     $letter}
1652                 [] = wiki_parser_link($page);
1653             } else {
1654                 $stdaux->{
1655                     $strspecial}
1656                 [] = wiki_parser_link($page);
1657             }
1658         }
1660         $table = new html_table();
1661         $table->head = array(get_string('pagelist', 'wiki'));
1662         $table->attributes['class'] = 'wiki_editor generalbox';
1663         $table->align = array('center');
1664         foreach ($stdaux as $key => $elem) {
1665             $table->data[] = array($key);
1666             foreach ($elem as $e) {
1667                 $table->data[] = array(html_writer::link($e['url'], $e['content']));
1668             }
1669         }
1670         echo html_writer::table($table);
1671     }
1673     /**
1674      * Prints the orphaned tab content
1675      *
1676      *
1677      */
1678     private function print_orphaned_content() {
1679         global $OUTPUT;
1681         $page = $this->page;
1683         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1684             $fresh = wiki_refresh_cachedcontent($page);
1685             $page = $fresh['page'];
1686         }
1688         $swid = $this->subwiki->id;
1690         $table = new html_table();
1691         $table->head = array(get_string('orphaned', 'wiki') . $OUTPUT->help_icon('orphaned', 'wiki'));
1692         $table->attributes['class'] = 'wiki_editor generalbox';
1693         $table->data = array();
1694         $table->rowclasses = array();
1696         if ($orphanedpages = wiki_get_orphaned_pages($swid)) {
1697             foreach ($orphanedpages as $page) {
1698                 $link = wiki_parser_link($page->title, array('swid' => $swid));
1699                 $class = ($link['new']) ? 'class="wiki_newentry"' : '';
1700                 $table->data[] = array('<a href="' . $link['url'] . '"' . $class . '>' . format_string($link['content']) . '</a>');
1701             }
1702         } else {
1703             $table->data[] = array(get_string('noorphanedpages', 'wiki'));
1704         }
1706         echo html_writer::table($table);
1707     }
1709     /**
1710      * Prints the updated tab content
1711      *
1712      * @uses $COURSE, $OUTPUT
1713      *
1714      */
1715     private function print_updated_content() {
1716         global $COURSE, $OUTPUT;
1717         $page = $this->page;
1719         if ($page->timerendered + WIKI_REFRESH_CACHE_TIME < time()) {
1720             $fresh = wiki_refresh_cachedcontent($page);
1721             $page = $fresh['page'];
1722         }
1724         $swid = $this->subwiki->id;
1726         $table = new html_table();
1727         $table->head = array(get_string('updatedpages', 'wiki'));
1728         $table->attributes['class'] = 'wiki_editor generalbox';
1729         $table->data = array();
1730         $table->rowclasses = array();
1732         if ($pages = wiki_get_updated_pages_by_subwiki($swid)) {
1733             $strdataux = '';
1734             foreach ($pages as $page) {
1735                 $user = wiki_get_user_info($page->userid);
1736                 $strdata = strftime('%d %b %Y', $page->timemodified);
1737                 if ($strdata != $strdataux) {
1738                     $table->data[] = array($OUTPUT->heading($strdata, 4));
1739                     $strdataux = $strdata;
1740                 }
1741                 $link = wiki_parser_link($page->title, array('swid' => $swid));
1742                 $class = ($link['new']) ? 'class="wiki_newentry"' : '';
1744                 $linkpage = '<a href="' . $link['url'] . '"' . $class . '>' . format_string($link['content']) . '</a>';
1745                 $icon = $OUTPUT->user_picture($user, array($COURSE->id));
1746                 $table->data[] = array("$icon&nbsp;$linkpage");
1747             }
1748         } else {
1749             $table->data[] = array(get_string('noupdatedpages', 'wiki'));
1750         }
1752         echo html_writer::table($table);
1753     }
1755     protected function render_navigation_node($items, $attrs = array(), $expansionlimit = null, $depth = 1) {
1757         // exit if empty, we don't want an empty ul element
1758         if (count($items) == 0) {
1759             return '';
1760         }
1762         // array of nested li elements
1763         $lis = array();
1764         foreach ($items as $item) {
1765             if (!$item->display) {
1766                 continue;
1767             }
1768             $content = $item->get_content();
1769             $title = $item->get_title();
1770             if ($item->icon instanceof renderable) {
1771                 $icon = $this->wikioutput->render($item->icon);
1772                 $content = $icon . '&nbsp;' . $content; // use CSS for spacing of icons
1773                 }
1774             if ($item->helpbutton !== null) {
1775                 $content = trim($item->helpbutton) . html_writer::tag('span', $content, array('class' => 'clearhelpbutton'));
1776             }
1778             if ($content === '') {
1779                 continue;
1780             }
1782             if ($item->action instanceof action_link) {
1783                 //TODO: to be replaced with something else
1784                 $link = $item->action;
1785                 if ($item->hidden) {
1786                     $link->add_class('dimmed');
1787                 }
1788                 $content = $this->output->render($link);
1789             } else if ($item->action instanceof moodle_url) {
1790                 $attributes = array();
1791                 if ($title !== '') {
1792                     $attributes['title'] = $title;
1793                 }
1794                 if ($item->hidden) {
1795                     $attributes['class'] = 'dimmed_text';
1796                 }
1797                 $content = html_writer::link($item->action, $content, $attributes);
1799             } else if (is_string($item->action) || empty($item->action)) {
1800                 $attributes = array();
1801                 if ($title !== '') {
1802                     $attributes['title'] = $title;
1803                 }
1804                 if ($item->hidden) {
1805                     $attributes['class'] = 'dimmed_text';
1806                 }
1807                 $content = html_writer::tag('span', $content, $attributes);
1808             }
1810             // this applies to the li item which contains all child lists too
1811             $liclasses = array($item->get_css_type(), 'depth_' . $depth);
1812             if ($item->has_children() && (!$item->forceopen || $item->collapse)) {
1813                 $liclasses[] = 'collapsed';
1814             }
1815             if ($item->isactive === true) {
1816                 $liclasses[] = 'current_branch';
1817             }
1818             $liattr = array('class' => join(' ', $liclasses));
1819             // class attribute on the div item which only contains the item content
1820             $divclasses = array('tree_item');
1821             if ((empty($expansionlimit) || $item->type != $expansionlimit) && ($item->children->count() > 0 || ($item->nodetype == navigation_node::NODETYPE_BRANCH && $item->children->count() == 0 && isloggedin()))) {
1822                 $divclasses[] = 'branch';
1823             } else {
1824                 $divclasses[] = 'leaf';
1825             }
1826             if (!empty($item->classes) && count($item->classes) > 0) {
1827                 $divclasses[] = join(' ', $item->classes);
1828             }
1829             $divattr = array('class' => join(' ', $divclasses));
1830             if (!empty($item->id)) {
1831                 $divattr['id'] = $item->id;
1832             }
1833             $content = html_writer::tag('p', $content, $divattr) . $this->render_navigation_node($item->children, array(), $expansionlimit, $depth + 1);
1834             if (!empty($item->preceedwithhr) && $item->preceedwithhr === true) {
1835                 $content = html_writer::empty_tag('hr') . $content;
1836             }
1837             $content = html_writer::tag('li', $content, $liattr);
1838             $lis[] = $content;
1839         }
1841         if (count($lis)) {
1842             return html_writer::tag('ul', implode("\n", $lis), $attrs);
1843         } else {
1844             return '';
1845         }
1846     }
1850 /**
1851  * Class that models the behavior of wiki's restore version page
1852  *
1853  */
1854 class page_wiki_restoreversion extends page_wiki {
1855     private $version;
1857     function print_header() {
1858         parent::print_header();
1859         $this->print_pagetitle();
1860     }
1862     function print_content() {
1863         global $CFG, $PAGE;
1865         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
1866         require_capability('mod/wiki:managewiki', $context, NULL, true, 'nomanagewikipermission', 'wiki');
1868         $this->print_restoreversion();
1869     }
1871     function set_url() {
1872         global $PAGE, $CFG;
1873         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/viewversion.php', array('pageid' => $this->page->id, 'versionid' => $this->version->id));
1874     }
1876     function set_versionid($versionid) {
1877         $this->version = wiki_get_version($versionid);
1878     }
1880     protected function create_navbar() {
1881         global $PAGE, $CFG;
1883         parent::create_navbar();
1884         $PAGE->navbar->add(get_string('restoreversion', 'wiki'));
1885     }
1887     protected function setup_tabs() {
1888         parent::setup_tabs(array('linkedwhenactive' => 'history', 'activetab' => 'history'));
1889     }
1891     /**
1892      * Prints the restore version content
1893      *
1894      * @uses $CFG
1895      *
1896      * @param page $page The page whose version will be restored
1897      * @param int  $versionid The version to be restored
1898      * @param bool $confirm If false, shows a yes/no confirmation page.
1899      *     If true, restores the old version and redirects the user to the 'view' tab.
1900      */
1901     private function print_restoreversion() {
1902         global $CFG, $OUTPUT;
1904         $version = wiki_get_version($this->version->id);
1906         echo $OUTPUT->heading(get_string('restoreconfirm', 'wiki', $version->version), 2);
1907         print_container_start(false, 'wiki_restoreform');
1908         echo '<form class="wiki_restore_yes" action="' . $CFG->wwwroot . '/mod/wiki/restoreversion.php?pageid=' . $this->page->id . '&amp;versionid=' . $version->id . '" method="post" id="restoreversion">';
1909         echo '<div><input type="submit" name="confirm" value="' . get_string('yes') . '" /></div>';
1910         echo '</form>';
1911         echo '<form class="wiki_restore_no" action="' . $CFG->wwwroot . '/mod/wiki/viewversion.php?pageid=' . $this->page->id . '&amp;versionid=' . $version->id . '" method="post">';
1912         echo '<div><input type="submit" name="norestore" value="' . get_string('no') . '" /></div>';
1913         echo '</form>';
1914         print_container_end();
1915     }
1918 /**
1919  *
1920  * Class that models the behavior of wiki's
1921  * save page
1922  *
1923  */
1924 class page_wiki_save extends page_wiki_edit {
1926     private $newcontent;
1928     function print_header() {
1929     }
1931     function print_content() {
1932         global $PAGE;
1934         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
1935         require_capability('mod/wiki:editpage', $context, NULL, true, 'noeditpermission', 'wiki');
1937         $this->print_save();
1938     }
1940     function set_newcontent($newcontent) {
1941         $this->newcontent = $newcontent;
1942     }
1944     protected function set_session_url() {
1945     }
1947     protected function print_save() {
1948         global $CFG, $USER, $OUTPUT, $PAGE;
1950         $cm = $PAGE->cm;
1951         $context = get_context_instance(CONTEXT_MODULE, $cm->id);
1953         $url = $CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $this->page->id;
1954         if (!empty($this->section)) {
1955             $url .= "&section=" . $this->section;
1956         }
1958         $params = array('attachmentoptions' => page_wiki_edit::$attachmentoptions, 'format' => $this->format, 'version' => $this->versionnumber);
1960         if ($this->format != 'html') {
1961             $params['contextid'] = $context->id;
1962             $params['component'] = 'mod_wiki';
1963             $params['filearea'] = 'attachments';
1964             $params['fileitemid'] = $this->page->id;
1965         }
1967         $form = new mod_wiki_edit_form($url, $params);
1969         $save = false;
1970         $data = false;
1971         if ($data = $form->get_data()) {
1972             if ($this->format == 'html') {
1973                 $data = file_postupdate_standard_editor($data, 'newcontent', page_wiki_edit::$attachmentoptions, $context, 'mod_wiki', 'attachments', $this->subwiki->id);
1974             }
1976             if (isset($this->section)) {
1977                 $save = wiki_save_section($this->page, $this->section, $data->newcontent, $USER->id);
1978             } else {
1979                 $save = wiki_save_page($this->page, $data->newcontent, $USER->id);
1980             }
1981         }
1983         if ($save && $data) {
1984             if ($this->format != 'html') {
1985                 $errors = $this->process_uploads($context);
1986             }
1987             if (!empty($CFG->usetags)) {
1988                 tag_set('wiki_pages', $this->page->id, $data->tags);
1989             }
1991             $message = '<p>' . get_string('saving', 'wiki') . '</p>';
1993             if (!empty($save['sections'])) {
1994                 foreach ($save['sections'] as $s) {
1995                     $message .= '<p>' . get_string('repeatedsection', 'wiki', $s) . '</p>';
1996                 }
1997             }
1999             if ($this->versionnumber + 1 != $save['version']) {
2000                 $message .= '<p>' . get_string('wrongversionsave', 'wiki') . '</p>';
2001             }
2003             if (isset($errors) && !empty($errors)) {
2004                 foreach ($errors as $e) {
2005                     $message .= "<p>" . get_string('filenotuploadederror', 'wiki', $e->get_filename()) . "</p>";
2006                 }
2007             }
2009             //deleting old locks
2010             wiki_delete_locks($this->page->id, $USER->id, $this->section);
2012             redirect($CFG->wwwroot . '/mod/wiki/view.php?pageid=' . $this->page->id);
2013         } else {
2014             print_error('savingerror', 'wiki');
2015         }
2016     }
2019 /**
2020  * Class that models the behavior of wiki's view an old version of a page
2021  *
2022  */
2023 class page_wiki_viewversion extends page_wiki {
2025     private $version;
2027     function print_header() {
2028         parent::print_header();
2029         $this->print_pagetitle();
2030     }
2032     function print_content() {
2033         global $PAGE;
2035         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2036         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
2038         $this->print_version_view();
2039     }
2041     function set_url() {
2042         global $PAGE, $CFG;
2043         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/viewversion.php', array('pageid' => $this->page->id, 'versionid' => $this->version->id));
2044     }
2046     function set_versionid($versionid) {
2047         $this->version = wiki_get_version($versionid);
2048     }
2050     protected function create_navbar() {
2051         global $PAGE, $CFG;
2053         parent::create_navbar();
2054         $PAGE->navbar->add(get_string('history', 'wiki'), $CFG->wwwroot . '/mod/wiki/history.php?pageid' . $this->page->id);
2055         $PAGE->navbar->add(get_string('versionnum', 'wiki', $this->version->version));
2056     }
2058     protected function setup_tabs() {
2059         parent::setup_tabs(array('linkedwhenactive' => 'history', 'activetab' => 'history', 'inactivetabs' => array('edit')));
2060     }
2062     /**
2063      * Given an old page version, output the version content
2064      *
2065      * @uses $CFG
2066      *
2067      * @param page   $page The page whose version will be displayed.
2068      * @param int    $cm The course id, needed to print user images.
2069      * @param int    $version The version number to be displayed.
2070      */
2071     private function print_version_view() {
2072         global $CFG, $OUTPUT, $PAGE;
2073         $cm = $PAGE->cm;
2074         $pageversion = wiki_get_version($this->version->id);
2076         if ($pageversion) {
2077             $restorelink = new moodle_url('/mod/wiki/restoreversion.php', array('pageid' => $this->page->id, 'versionid' => $this->version->id));
2078             echo $OUTPUT->heading(get_string('viewversion', 'wiki', $pageversion->version) . '<br />' . html_writer::link($restorelink->out(false), '(' . get_string('restorethis', 'wiki') . ')', array('class' => 'wiki_restore')) . '&nbsp;', 4);
2079             $userinfo = wiki_get_user_info($pageversion->userid);
2080             $heading = '<p><strong>' . get_string('modified', 'wiki') . ':</strong>&nbsp;' . userdate($pageversion->timecreated, get_string('strftimedatetime', 'langconfig'));
2081             $viewlink = new moodle_url('/user/view.php', array('id' => $userinfo->id));
2082             $heading .= '&nbsp;&nbsp;&nbsp;<strong>' . get_string('user') . ':</strong>&nbsp;' . html_writer::link($viewlink->out(false), fullname($userinfo));
2083             $heading .= '&nbsp;&nbsp;&rarr;&nbsp;' . $OUTPUT->user_picture(wiki_get_user_info($pageversion->userid), array('popup' => true)) . '</p>';
2084             print_container($heading, false, 'mdl-align wiki_modifieduser wiki_headingtime');
2085             $options = array('swid' => $this->subwiki->id, 'pretty_print' => true, 'pageid' => $this->page->id);
2086             $parseroutput = wiki_parse_content($pageversion->contentformat, $pageversion->content, $options);
2087             $content = print_container(format_text($parseroutput['parsed_text'], FORMAT_HTML, array('overflowdiv'=>true)), false, '', '', true);
2088             echo $OUTPUT->box($content, 'generalbox wiki_contentbox');
2090         } else {
2091             print_error('versionerror', 'wiki');
2092         }
2093     }
2096 class page_wiki_confirmrestore extends page_wiki_save {
2098     private $version;
2100     function set_url() {
2101         global $PAGE, $CFG;
2102         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/viewversion.php', array('pageid' => $this->page->id, 'versionid' => $this->version->id));
2103     }
2105     function print_content() {
2106         global $CFG, $PAGE;
2108         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2109         require_capability('mod/wiki:managewiki', $context, NULL, true, 'nomanagewikipermission', 'wiki');
2111         $version = wiki_get_version($this->version->id);
2112         if (wiki_restore_page($this->page, $version->content, $version->userid)) {
2113             redirect($CFG->wwwroot . '/mod/wiki/view.php?pageid=' . $this->page->id, get_string('restoring', 'wiki', $version->version), 3);
2114         } else {
2115             print_error('restoreerror', 'wiki', $version->version);
2116         }
2117     }
2119     function set_versionid($versionid) {
2120         $this->version = wiki_get_version($versionid);
2121     }
2124 class page_wiki_prettyview extends page_wiki {
2126     function print_header() {
2127         global $CFG, $PAGE, $OUTPUT;
2128         $PAGE->set_pagelayout('embedded');
2129         echo $OUTPUT->header();
2131         echo '<h1 id="wiki_printable_title">' . format_string($this->title) . '</h1>';
2132     }
2134     function print_content() {
2135         global $PAGE;
2137         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2138         require_capability('mod/wiki:viewpage', $context, NULL, true, 'noviewpagepermission', 'wiki');
2140         $this->print_pretty_view();
2141     }
2143     function set_url() {
2144         global $PAGE, $CFG;
2146         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/prettyview.php', array('pageid' => $this->page->id));
2147     }
2149     private function print_pretty_view() {
2150         $version = wiki_get_current_version($this->page->id);
2152         $content = wiki_parse_content($version->contentformat, $version->content, array('printable' => true, 'swid' => $this->subwiki->id, 'pageid' => $this->page->id, 'pretty_print' => true));
2154         echo '<div id="wiki_printable_content">';
2155         echo format_text($content['parsed_text'], FORMAT_HTML);
2156         echo '</div>';
2157     }
2160 class page_wiki_handlecomments extends page_wiki {
2161     private $action;
2162     private $content;
2163     private $commentid;
2164     private $format;
2166     function print_header() {
2167         $this->set_url();
2168     }
2170     public function print_content() {
2171         global $CFG, $PAGE, $USER;
2173         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2175         if ($this->action == 'add') {
2176             if (has_capability('mod/wiki:editcomment', $context)) {
2177                 $this->add_comment($this->content, $this->commentid);
2178             }
2179         } else if ($this->action == 'edit') {
2180             $comment = wiki_get_comment($this->commentid);
2181             $edit = has_capability('mod/wiki:editcomment', $context);
2182             $owner = ($comment->userid == $USER->id);
2183             if ($owner && $edit) {
2184                 $this->add_comment($this->content, $this->commentid);
2185             }
2186         } else if ($this->action == 'delete') {
2187             $comment = wiki_get_comment($this->commentid);
2188             $manage = has_capability('mod/wiki:managecomment', $context);
2189             $owner = ($comment->userid == $USER->id);
2190             if ($owner || $manage) {
2191                 $this->delete_comment($this->commentid);
2192                 redirect($CFG->wwwroot . '/mod/wiki/comments.php?pageid=' . $this->page->id, get_string('deletecomment', 'wiki'), 2);
2193             }
2194         }
2196     }
2198     public function set_url() {
2199         global $PAGE, $CFG;
2200         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/comments.php', array('pageid' => $this->page->id));
2201     }
2203     public function set_action($action, $commentid, $content) {
2204         $this->action = $action;
2205         $this->commentid = $commentid;
2206         $this->content = $content;
2208         $version = wiki_get_current_version($this->page->id);
2209         $format = $version->contentformat;
2211         $this->format = $format;
2212     }
2214     private function add_comment($content, $idcomment) {
2215         global $CFG, $PAGE;
2216         require_once($CFG->dirroot . "/mod/wiki/locallib.php");
2218         $pageid = $this->page->id;
2219         $cm = $PAGE->cm;
2220         $context = get_context_instance(CONTEXT_MODULE, $cm->id);
2222         wiki_add_comment($context, $pageid, $content, $this->format);
2224         if (!$idcomment) {
2225             redirect($CFG->wwwroot . '/mod/wiki/comments.php?pageid=' . $pageid, get_string('createcomment', 'wiki'), 2);
2226         } else {
2227             $this->delete_comment($idcomment);
2228             redirect($CFG->wwwroot . '/mod/wiki/comments.php?pageid=' . $pageid, get_string('editingcomment', 'wiki'), 2);
2229         }
2230     }
2232     private function delete_comment($commentid) {
2233         global $CFG, $PAGE;
2235         $cm = $PAGE->cm;
2236         $context = get_context_instance(CONTEXT_MODULE, $cm->id);
2237         $pageid = $this->page->id;
2239         wiki_delete_comment($commentid, $context, $pageid);
2240     }
2244 class page_wiki_lock extends page_wiki_edit {
2246     public function print_header() {
2247         $this->set_url();
2248     }
2250     protected function set_url() {
2251         global $PAGE, $CFG;
2253         $params = array('pageid' => $this->page->id);
2255         if ($this->section) {
2256             $params['section'] = $this->section;
2257         }
2259         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/lock.php', $params);
2260     }
2262     protected function set_session_url() {
2263     }
2265     public function print_content() {
2266         global $USER, $PAGE;
2268         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2269         require_capability('mod/wiki:editpage', $context, NULL, true, 'noeditpermission', 'wiki');
2271         wiki_set_lock($this->page->id, $USER->id, $this->section);
2272     }
2274     public function print_footer() {
2275     }
2278 class page_wiki_overridelocks extends page_wiki_edit {
2279     function print_header() {
2280         $this->set_url();
2281     }
2283     function print_content() {
2284         global $CFG, $PAGE;
2286         $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id);
2287         require_capability('mod/wiki:overridelock', $context, NULL, true, 'nooverridelockpermission', 'wiki');
2289         wiki_delete_locks($this->page->id, null, $this->section, true, true);
2291         $args = "pageid=" . $this->page->id;
2293         if (!empty($this->section)) {
2294             $args .= "&section=" . $this->section;
2295         }
2297         redirect($CFG->wwwroot . '/mod/wiki/edit.php?' . $args, get_string('overridinglocks', 'wiki'), 2);
2298     }
2300     function set_url() {
2301         global $PAGE, $CFG;
2303         $params = array('pageid' => $this->page->id);
2305         if (!empty($this->section)) {
2306             $params['section'] = $this->section;
2307         }
2309         $PAGE->set_url($CFG->wwwroot . '/mod/wiki/overridelocks.php', $params);
2310     }
2312     protected function set_session_url() {
2313     }
2315     private function print_overridelocks() {
2316         global $CFG;
2318         wiki_delete_locks($this->page->id, null, $this->section, true, true);
2320         $args = "pageid=" . $this->page->id;
2322         if (!empty($this->section)) {
2323             $args .= "&section=" . $this->section;
2324         }
2326         redirect($CFG->wwwroot . '/mod/wiki/edit.php?' . $args, get_string('overridinglocks', 'wiki'), 2);
2327     }