1f69de4f9510feb1ea9a17097f8c5ba8986610f4
[moodle.git] / mod / wiki / view.php
1 <?php
2 /// Extended by Michael Schneider
3 /// This page prints a particular instance of wiki
5     global $CFG,$USER;
7     require_once("../../config.php");
8     require_once("lib.php");
9     #require_once("$CFG->dirroot/course/lib.php"); // For side-blocks
10     $PAGE->requires->yui2_lib('connection');
12     $ewiki_action = optional_param('ewiki_action', '', PARAM_ALPHA);     // Action on Wiki-Page
13     $id           = optional_param('id', 0, PARAM_INT);                  // Course Module ID, or
14     $wid          = optional_param('wid', 0, PARAM_INT);                 // Wiki ID
15     $page         = optional_param('page', false);                       // Wiki Page Name
16     $q            = optional_param('q',"", PARAM_PATH);                  // Search Context
17     $userid       = optional_param('userid', 0, PARAM_INT);              // User wiki.
18     $groupid      = optional_param('groupid', 0, PARAM_INT);             // Group wiki.
19     $canceledit   = optional_param('canceledit','', PARAM_ALPHA);        // Editing has been cancelled
20     $cacheme      = optional_param('allowcache', 1, PARAM_INT);          // Set this to 0 to try and disable page caching.
22     // Only want to add edit log entries if we have made some changes ie submitted a form
23     $editsave = optional_param('thankyou', '', PARAM_RAW);
25     $url = new moodle_url('/mod/wiki/view.php');
26     if ($ewiki_action !== '') {
27         $url->param('ewiki_action', $ewiki_action);
28     }
29     if ($id !== 0) {
30         $url->param('id', $id);
31     }
32     if ($wid !== 0) {
33         $url->param('wid', $wid);
34     }
35     if ($page !== false) {
36         $url->param('page', $page);
37     }
38     if ($q !== '') {
39         $url->param('q', $q);
40     }
41     if ($userid !== 0) {
42         $url->param('userid', $userid);
43     }
44     if ($groupid !== 0) {
45         $url->param('groupid', $groupid);
46     }
47     if ($canceledit !== '') {
48         $url->param('canceledit', $canceledit);
49     }
50     if ($cacheme !== 1) {
51         $url->param('allowcache', $cacheme);
52     }
53     $PAGE->set_url($url);
55     if($page) {
56         // Split page command into action and page
57         $actions = explode('/', $page,2);
58         if(count($actions)==2) {
59             $pagename=$actions[1];
60         } else {
61             $pagename=$actions[0];
62         }
63     } else {
64         $actions=array('');
65         $pagename='';
66     }
68     if ($id) {
69         if (! $cm = get_coursemodule_from_id('wiki', $id)) {
70             print_error('invalidcoursemodule');
71         }
73         if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
74             print_error('coursemisconf');
75         }
77         if (! $wiki = $DB->get_record("wiki", array("id"=>$cm->instance))) {
78             print_error('invalidcoursemodule');
79         }
81     } else {
82         if (! $wiki = $DB->get_record("wiki", array("id"=>$wid))) {
83             print_error('invalidcoursemodule');
84         }
85         if (! $course = $DB->get_record("course", array("id"=>$wiki->course))) {
86             print_error('coursemisconf');
87         }
88         if (! $cm = get_coursemodule_from_instance("wiki", $wiki->id, $course->id)) {
89             print_error('invalidcoursemodule');
90         }
91     }
93     require_course_login($course, true, $cm);
95     /// Add the course module info to the wiki object, for easy access.
96     $wiki->groupmode = $cm->groupmode;
97     $wiki->groupingid = $cm->groupingid;
98     $wiki->groupmembersonly = $cm->groupmembersonly;
99     $wiki->cmid = $cm->id;
101     /// Default format:
102     $moodle_format=FORMAT_MOODLE;
104 /// Globally disable CamelCase, if the option is selected for this wiki.
105     $moodle_disable_camel_case = ($wiki->disablecamelcase == 1);
107     if (($wiki_entry = wiki_get_default_entry($wiki, $course, $userid, $groupid))) {
108         // OK, now we know the entry ID, we can do lock etc.
110         // If true, we are 'really' on an editing page, not just on edit/something
111         $reallyedit=$actions[0]=='edit' && !$canceledit && !$editsave;
113         // Remove lock when we go to another wiki page (such as the cancel page)
114         if(!$reallyedit) {
115             wiki_release_lock($wiki_entry->id,$pagename);
116         } else if(array_key_exists('content',$_POST)) {
117             // Do not allow blank content because it causes problems (the wiki decides
118             // the page should automatically go into edit mode, but Moodle doesn't realise
119             // this and filters out the JS)
120             if($_POST['content']=='') {
121                 $_POST['content']="\n";
122                 $_REQUEST['content']="\n";
123             }
125             // We must have the edit lock in order to be permitted to save
126             list($ok,$lock)=wiki_obtain_lock($wiki_entry->id,$pagename);
127             if(!$ok) {
128                 print_error('savenolock', 'wiki', $CFG->wwwroot.'/mod/wiki/view.php?id='.$cm->id.'&page=view/'.urlencode($pagename));
129             }
130         }
132 ///     ################# EWIKI Part ###########################
133 ///     The wiki_entry->pagename is set to the specified value of the wiki,
134 ///     or the default value in the 'lang' file if the specified value was empty.
135         define("EWIKI_PAGE_INDEX",$wiki_entry->pagename);
137         /// If the page has a ' in it, it may have slashes added to it. Remove them if it does.
138         $page = ($page === false) ?  EWIKI_PAGE_INDEX : $page;
140 ///     # Prevent ewiki getting id as PageID...
141         unset($_REQUEST["id"]);
142         unset($_GET["id"]);
143         unset($_POST["id"]);
144         unset($_POST["id"]);
145         unset($_SERVER["QUERY_STRING"]);
146         if (isset($HTTP_GET_VARS)) {
147             unset($HTTP_GET_VARS["id"]);
148         }
149         if (isset($HTTP_POST_VARS)) {
150             unset($HTTP_POST_VARS["id"]);
151         }
152         global $ewiki_title;
154 ///     #-- predefine some of the configuration constants
157         /// EWIKI_NAME is defined in ewikimoodlelibs, so that also admin.php can use this
158         #define("EWIKI_NAME", $wiki_entry->pagename);
160         /// Search Hilighting
161         if($ewiki_title=="SearchPages") {
162             $qArgument="&amp;q=".urlencode($q);
163         }
165         /// Build the ewsiki script constant
166         /// ewbase will also be needed by EWIKI_SCRIPT_BINARY
167         $ewbase = 'view.php?id='.$cm->id;
168         if (isset($userid) && $userid!=0) $ewbase .= '&amp;userid='.$userid;
169         if (isset($groupid) && $groupid!=0) $ewbase .= '&amp;groupid='.$groupid;
170         $ewscript = $ewbase.'&amp;page=';
171         define("EWIKI_SCRIPT", $ewscript);
172         define("EWIKI_SCRIPT_URL", $ewscript);
174         /// # Settings for this specific Wiki
175         define("EWIKI_PRINT_TITLE", $wiki->ewikiprinttitle);
177         define("EWIKI_INIT_PAGES", wiki_content_dir($wiki));
179         # Database Handler
180         include_once($CFG->dirroot."/mod/wiki/ewikimoodlelib.php");
181         # Plugins
182         //include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/email_protect.php");
183         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/patchsaving.php");
184         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/notify.php");
185         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/feature/imgresize_gd.php");
186         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/moodle_highlight.php");
187         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/f_fixhtml.php");
188         #include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/wikinews.php");
189         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/sitemap.php");
190         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/moodle_wikidump.php");
191         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/aview/backlinks.php");
192         #include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/markup/css.php");
193         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/markup/footnotes.php");
194         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/diff.php");
195         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/page/pageindex.php");
196         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/page/orphanedpages.php");
197         include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/wantedpages.php");
199         # Binary Handling
200         if($wiki->ewikiacceptbinary) {
201             define("EWIKI_UPLOAD_MAXSIZE", get_max_upload_file_size());
202             define("EWIKI_SCRIPT_BINARY", $ewbase."&binary=");
203             define("EWIKI_ALLOW_BINARY",1);
204             define("EWIKI_IMAGE_CACHING",1);
205             #define("EWIKI_AUTOVIEW",1);
206             include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/lib/mime_magic.php");
207             include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/aview/downloads.php");
208             include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/downloads.php");
209             #include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/db/binary_store.php");
210             include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/moodle_binary_store.php");
211         } else {
212             define("EWIKI_SCRIPT_BINARY", 0);
213             define("EWIKI_ALLOW_BINARY",0);
214         }
216         # The mighty Wiki itself
217         include_once($CFG->dirroot."/mod/wiki/ewiki/ewiki.php");
219         if($canceledit) {
220           if ($delim = strpos($page, EWIKI_ACTION_SEP_CHAR)) {
221             @$page = substr($page, $delim + 1);
222           } else {
223             @$page="";
224           }
225         }
226         # Language-stuff: eWiki gets language from Browser. Lets correct it. Empty arrayelements do no harm
227         $ewiki_t["languages"]=array(current_language(), $course->lang, $CFG->lang,"en","c");
229         # Check Access Rights
230         $canedit = wiki_can_edit_entry($wiki_entry, $wiki, $USER, $course);
231         if (!$canedit) {
232             # Protected Mode
233             unset($ewiki_plugins["action"]["edit"]);
234             unset($ewiki_plugins["action"]["info"]);
235         }
237         # HTML Handling
238         $ewiki_use_editor=0;
239         if($wiki->htmlmode == 0) {
240             # No HTML
241             $ewiki_config["htmlentities"]=array(); // HTML is managed by moodle
242             $moodle_format=FORMAT_TEXT;
243         }
244         if($wiki->htmlmode == 1) {
245             # Safe HTML
246             include_once($CFG->dirroot."/mod/wiki/ewiki/plugins/moodle/moodle_rescue_html.php");
247             $moodle_format=FORMAT_HTML;
248         }
249         if($wiki->htmlmode == 2) {
250             # HTML Only
251             $moodle_format=FORMAT_HTML;
252             $ewiki_use_editor=1;
253             $ewiki_config["htmlentities"]=array(); // HTML is allowed
254             $ewiki_config["wiki_link_regex"] = "\007 [!~]?(
255                         \#?\[[^<>\[\]\n]+\] |
256                         \^[-".EWIKI_CHARS_U.EWIKI_CHARS_L."]{3,} |
257                         \b([\w]{3,}:)*([".EWIKI_CHARS_U."]+[".EWIKI_CHARS_L."]+){2,}\#?[\w\d]* |
258                         \w[-_.+\w]+@(\w[-_\w]+[.])+\w{2,}   ) \007x";
259         }
261         global $ewiki_author, $USER;
262         $ewiki_author=fullname($USER);
263         $content=ewiki_page($page);
264         $content2='';
266 ///     ################# EWIKI Part ###########################
267     }
268     else {
269         $content = '';
270         $content2 = '<div class="boxaligncenter">'.get_string('nowikicreated', 'wiki').'</div>';
272     }
274     # Group wiki, ...: No page and no ewiki_title
275     if(!isset($ewiki_title)) {
276           $ewiki_title="";
277     }
280 /// Moodle Log
281     if ($editsave != NULL) { /// We've submitted an edit and have been redirected back here
282         add_to_log($course->id, "wiki", 'edit',
283                "view.php?id=$cm->id&amp;groupid=$groupid&amp;userid=$userid&amp;page=$ewiki_title",
284                format_string($wiki->name,true).": ".$ewiki_title, $cm->id, $userid);
285     } else if ($ewiki_action != 'edit') {
286         add_to_log($course->id, "wiki", $ewiki_action,
287                "view.php?id=$cm->id&amp;groupid=$groupid&amp;userid=$userid&amp;page=$ewiki_title",
288                format_string($wiki->name,true).": ".$ewiki_title, $cm->id, $userid);
289     }
292 /// Print the page header
294     $strwikis = get_string("modulenameplural", "wiki");
295     $strwiki  = get_string("modulename", "wiki");
297 /// Add page name if not main page
298     if ($ewiki_title != $wiki->name) {
299         $PAGE->navbar->add(format_string($ewiki_title));
300     }
301     $PAGE->set_title($ewiki_title?$ewiki_title:format_string($wiki->name));
302     $PAGE->set_cacheable($cacheme);
303     $PAGE->set_button($OUTPUT->update_module_button($cm->id, 'wiki'));
304     echo $OUTPUT->header();
305     /// Print Page
306     echo '    <div id="wikiPageActions">
307     ';
308     /// The top row contains links to other wikis, if applicable.
309     if ($wiki_entry && $wiki_list = wiki_get_other_wikis($wiki, $USER, $course, $wiki_entry->id)) {
310         //echo "wiki list ";print_r($wiki_list);
311         $selected="";
313         if (isset($wiki_list['selected'])) {
314             $selected = $wiki_list['selected'];
315             unset($wiki_list['selected']);
316         }
317         echo '<tr><td colspan="2">';
319         echo '<form id="otherwikis" action="'.$CFG->wwwroot.'/mod/wiki/view.php">';
320         echo '<table border="0" cellpadding="0" cellspacing="0" width="100%"><tr>';
321         echo '<td class="sideblockheading">&nbsp;'
322             .$WIKI_TYPES[$wiki->wtype].' '
323             .get_string('modulename', 'wiki')." ".get_string('for',"wiki")." "
324             .wiki_get_owner($wiki_entry).':</td>';
326         echo '<td class="sideblockheading">'
327             .get_string('otherwikis', 'wiki').':&nbsp;&nbsp;';
328         $aid = $OUTPUT->add_action_handler(new component_action('change', 'go_to_wiki'));
329         $attributes = array('id'=>$aid);
330         echo html_writer::select($wiki_list, 'wikiselect', $selected, array(''=>'choose'), $attributes);
331         echo '</td>';
332         echo '</tr></table>';
333         echo '</form>';
335         echo '</td>';
336         echo '</tr>';
337     }
339     if ($wiki_entry) {
340         $specialpages=array("WikiExport", "SiteMap", "SearchPages", "PageIndex","NewestPages","MostVisitedPages","MostOftenChangedPages","UpdatedPages","FileDownload","FileUpload","OrphanedPages","WantedPages");
341     /// Page Actions
342         echo '<table border="0" width="100%">';
343         echo '<tr>';
345         /// Searchform
346         echo '<td class="wikisearchform">';
347         wiki_print_search_form($cm->id, $q, $userid, $groupid, false);
348         echo '</td>';
350         /// Internal Wikilinks
351         echo '<td class="wikilinksblock">';
352         wiki_print_wikilinks_block($cm->id,  $wiki->ewikiacceptbinary);
353         echo '</td>';
355         /// Administrative Links
356         if($canedit) {
357           echo '<td class="wikiadminactions">';
358           wiki_print_administration_actions($wiki, $cm->id, $userid, $groupid, $ewiki_title, $wiki->htmlmode!=2, $course);
359           echo '</td>';
360         }
362         /// Formatting Rules
363         echo '<td class="howtowiki">';
364         echo $OUTPUT->help_icon('howtowiki', get_string('howtowiki', 'wiki'), 'wiki');
365         echo '</td>';
367         echo '</tr></table>';
368     }
370     echo '</div>
371     <div id="wiki-view" class="mwiki">
372     ';
374     if($wiki_entry && $ewiki_title==$wiki_entry->pagename && !empty($wiki->intro)) {
375       if (trim(strip_tags($wiki->intro))) {
376           echo $OUTPUT->box(format_module_intro('wiki', $wiki, $cm->id), 'generalbox', 'intro');
377       }
378     }
380     // The wiki Contents
382     if (!empty($canedit)) {   /// Print tabs with commands for this page
383         $tabs = array('view', 'edit','links','info');
384         if ($wiki->ewikiacceptbinary) {
385             $tabs[] = 'attachments';
386         }
388         $tabrows = array();
389         $row  = array();
390         $currenttab = '';
391         foreach ($tabs as $tab) {
392             $tabname = get_string("tab$tab", 'wiki');
393             $row[] = new tabobject($tabname, $ewbase.'&amp;page='.$tab.'/'.s($ewiki_id), $tabname);
394             if ($ewiki_action == "$tab" or in_array($page, $specialpages)) {
395                 $currenttab = $tabname;
396             }
397         }
398         $tabrows[] = $row;
400         print_tabs($tabrows, $currenttab);
401     }
403     /// Insert a link to force page refresh if new content isn't showing.
405     // build new URL + query string
406     $queries = preg_split('/[?&]/', me());
407     $nqueries = count($queries);
408     $me = $queries[0] . '?';
409     for($i=1; $i < $nqueries; $i++)
410     {
411         if( !strstr($queries[$i], 'allowcache') )
412             $me .= $queries[$i] . '&amp;';
413     }
414     $me .= 'allowcache=0';
416     // Insert the link
417     $linkdesc = get_string('reloadlinkdescription', 'wiki');
418     $linktext = get_string('reloadlinktext', 'wiki');
419     echo "<div class='wikilinkright'><a href='$me' title='$linkdesc'><input type='button' value='$linktext' /></a></div>";
421     echo $OUTPUT->box_start();
423     /// Don't filter any pages containing wiki actions (except view). A wiki page containing
424     /// actions will have the form [action]/[pagename]. If the action is 'view' or the  '/'
425     /// isn't there (so the action defaults to 'view'), filter it.
426     /// If the page does not yet exist, the display will default to 'edit'.
427     if((count($actions) < 2 || $actions[0] == "view") && $wiki_entry &&
428         $DB->record_exists('wiki_pages', array('pagename'=>$page, 'wiki'=>$wiki_entry->id))) {
429         print(format_text($content, $moodle_format));
430     } else if($actions[0]=='edit' && $reallyedit) {
431         // Check the page isn't locked before printing out standard wiki content. (Locking
432         // is implemented as a wrapper over the existing wiki.)
433         list($gotlock,$lock)=wiki_obtain_lock($wiki_entry->id,$pagename);
434         if(!$gotlock) {
435             $modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
436             $canoverridelock = has_capability('mod/wiki:overridelock', $modcontext);
438             $a=new stdClass;
439             $a->since=userdate($lock->lockedsince);
440             $a->seen=userdate($lock->lockedseen);
441             $user=$DB->get_record('user', array('id'=>$lock->lockedby));
442             $a->name=fullname($user,
443               has_capability('moodle/site:viewfullnames', $modcontext));
445             print_string('pagelocked','wiki',$a);
447             if($canoverridelock) {
448                 $pageesc=htmlspecialchars($page);
449                 $stroverrideinfo=get_string('overrideinfo','wiki');
450                 $stroverridebutton=get_string('overridebutton','wiki');
451                 $sesskey=sesskey();
452                 print "
453 <form id='overridelock' method='post' action='overridelock.php'>
454   <div>
455   <input type='hidden' name='sesskey' value='$sesskey' />
456   <input type='hidden' name='id' value='$cm->id' />
457   <input type='hidden' name='page' value='$pageesc' />
458   $stroverrideinfo
459   <input type='submit' value='$stroverridebutton' />
460   </div>
461 </form>
462 ";
463             }
464         } else {
465             if (ajaxenabled()) {
466                 // OK, the page is now locked to us. Put in the AJAX for keeping the lock
467                 $strlockcancelled=addslashes_js(get_string('lockcancelled','wiki'));
468                 $strnojslockwarning=get_string('nojslockwarning','wiki');
469                 $intervalms=WIKI_LOCK_RECONFIRM*1000;
470                 print "
471 <script type='text/javascript'>
472 var intervalID;
473 function handleResponse(o) {
474     if(o.responseText=='cancel') {
475         document.forms['ewiki'].elements['preview'].disabled=true;
476         document.forms['ewiki'].elements['save'].disabled=true;
477         clearInterval(intervalID);
478         alert('$strlockcancelled');
479     }
481 function handleFailure(o) {
482     // Ignore for now
484 intervalID=setInterval(function() {
485     YAHOO.util.Connect.asyncRequest('POST','confirmlock.php',
486         {success:handleResponse,failure:handleFailure},'lockid={$lock->id}');
487     },$intervalms);
488 </script>
489 <noscript><p>
490 $strnojslockwarning
491 </p></noscript>
492 ";
493             }
494             // Print editor etc
495             print $content;
496         }
497     } else {
498         print $content;
499     }
500     print $content2;
501     echo $OUTPUT->box_end();
502     echo "<br />";
504 /// Finish the page
505     echo '
506     </div>
507     ';
509     echo $OUTPUT->footer();