4fc66f050c7a22f0e7392c9d6c8a940a54f1db27
[moodle.git] / help.php
1 <?php
2 /**
3  * help.php - Displays help page.
4  *
5  * Prints a very simple page and includes
6  * page content or a string from elsewhere.
7  * Usually this will appear in a popup
8  * See {@link helpbutton()} in {@link lib/moodlelib.php}
9  *
10  * @author Martin Dougiamas
11  * @version $Id$
12  * @package moodlecore
13  */
14 require_once('config.php');
16 // Get URL parameters.
17 $file = optional_param('file', '', PARAM_PATH);
18 $text = optional_param('text', 'No text to display', PARAM_CLEAN);
19 $module = optional_param('module', 'moodle', PARAM_ALPHAEXT);
20 $forcelang = optional_param('forcelang', '', PARAM_SAFEDIR);
21 $skiplocal = optional_param('skiplocal', 0, PARAM_INT);     // shall _local help files be skipped?
22 $fortooltip = optional_param('fortooltip', 0, PARAM_INT);
24 $PAGE->set_course($COURSE);
26 // We look for the help to display in lots of different places, and
27 // only display an error at the end if we can't find the help file
28 // anywhere. This variable tracks that.
29 $helpfound = false;
31 // Buffer output so that we can examine it later to extract metadata (page title)
32 ob_start();
34 if (!empty($file)) {
35     // The help to display is from a help file.
36     list($filepath, $foundlang) = string_manager::instance()->find_help_file($file, $module, $forcelang, $skiplocal);
38     if ($filepath) {
39         $helpfound = true;
40         @include($filepath);   // The actual helpfile
42         // Now, we process some special cases.
43         if ($module == 'moodle' and ($file == 'index.html' or $file == 'mods.html')) {
44             include_help_for_each_module($file, $forcelang, $skiplocal);
45         }
46         if ($module == 'question' && $file == 'types.html') {
47             include_help_for_each_qtype();
48         }
50         // The remaining horrible hardcoded special cases should be delegated to modules somehow.
51         if ($module == 'moodle' && $file == 'assignment/types.html') {  // ASSIGNMENTS
52             include_help_for_each_assignment_type($forcelang, $skiplocal);
53         }
54     }
55 } else {
56     // The help to display was given as an argument to this function.
57     echo '<p>'.s($text).'</p>';   // This param was already cleaned
58     $helpfound = true;
59 }
61 // Finish buffer
62 $output = ob_get_contents();
64 ob_end_clean();
66 if ($fortooltip) {
67     echo shorten_text($output, 400, false, '<span class="readmore">' . get_string('clickhelpiconformoreinfo') . '</span>');
68     die();
69 }
71 // Determine title
72 $title = get_string('help'); // Default is just 'Help'
73 $matches = array();
74 // You can include a <title> tag to override the standard behaviour:
75 // 'Help - title contents'. Otherwise it looks for the text of the first
76 // heading: 'Help - heading text'. If there aren't even any headings
77 // you just get 'Help'
78 if (preg_match('~^(.*?)<title>(.*?)</title>(.*)$~s', $output, $matches)) {
79     // Extract title
80     $title = $title.' - '.$matches[2];
81     // Strip title from output
82     $output = $matches[1].$matches[3];
83 } else if(preg_match('~<h[0-9]+(\s[^>]*)?>(.*?)</h[0-9]+>~s',$output,$matches)) {
84     // Use first heading as title (obviously leave it in output too). Strip
85     // any tags from inside
86     $matches[2] = preg_replace('~<[^>]*>~s','',$matches[2]);
87     $title = $title.' - '.$matches[2];
88 }
90 // use ##emoticons_html## to replace the emoticons documentation
91 if(preg_match('~(##emoticons_html##)~', $output, $matches)) {
92     $output = preg_replace('~(##emoticons_html##)~', get_emoticons_list_for_help_file(), $output);
93 }
95 // Do the main output.
96 print_header($title);
97 echo $OUTPUT->box_start();
98 print $output;
99 echo $OUTPUT->box_end();
101 // Display an error if necessary.
102 if (!$helpfound) {
103     echo $OUTPUT->notification('Help file "'. $file .'" could not be found!');
106 // End of page.
107 echo $OUTPUT->close_window_button();
108 echo '<p class="helpindex"><a href="help.php?file=index.html">'. get_string('helpindex') .'</a></p>';
110 // Offer a link to the alternative help file language
111 $currentlang = current_language();
112 if ($file && $helpfound && ($foundlang != 'en_utf8' || ($forcelang == 'en_utf8' && current_language() != 'en_utf8'))) {
113     $url = new moodle_url();
114     if ($foundlang != 'en_utf8') {
115         $url->param('forcelang', 'en_utf8');
116         $nextlangname = get_string('english');
117     } else {
118         $url->param('forcelang', $currentlang);
119         $nextlangname = get_string('thislanguage');
120     }
121     echo '<p><a href="' . $url->out() . '">' . get_string('showthishelpinlanguage', 'moodle', $nextlangname) . '</a></p>';
124 $CFG->docroot = '';   // We don't want a doc link here
125 echo $OUTPUT->footer();
127 function file_exists_and_readable($filepath) {
128     return file_exists($filepath) and is_file($filepath) and is_readable($filepath);
131 // Some functions for handling special cases ========================================
133 function include_help_for_each_module($file, $forcelang, $skiplocal) {
134     global $CFG, $DB;
136     if (!$modules = $DB->get_records('modules', array('visible'=> 1))) {
137         print_error('nomodules', 'debug'); // Should never happen
138     }
140     // Horrible hack to show the help about grades here too.
141     $grade = new stdClass();
142     $grade->name = 'grade';
143     $modules[] = $grade;
145     foreach ($modules as $mod) {
146         $strmodulename = get_string('modulename', $mod->name);
147         $modulebyname[$strmodulename] = $mod;
148     }
149     ksort($modulebyname, SORT_LOCALE_STRING);
151     foreach ($modulebyname as $mod) {
152         list($filepath, $foundlang) = string_manager::instance()->find_help_file($file, $mod->name, $forcelang, $skiplocal);
153         if ($filepath) {
154             echo '<hr />';
155             include($filepath);
156         }
157     }
160 function include_help_for_each_qtype() {
161     global $CFG;
162     require_once($CFG->libdir . '/questionlib.php');
163     global $QTYPES;
164     $types = question_type_menu();
165     $fakeqtypes = array();
166     foreach ($types as $qtype => $localizedname) {
167         if ($QTYPES[$qtype]->is_real_question_type()) {
168             include_help_for_qtype($qtype, $localizedname);
169         } else {
170             $fakeqtypes[$qtype] = $localizedname;
171         }
172     }
173     foreach ($fakeqtypes as $qtype => $localizedname) {
174         include_help_for_qtype($qtype, $localizedname);
175     }
177 function include_help_for_qtype($qtype, $localizedname) {
178     echo '<h2>' . $localizedname . "</h2>\n\n";
179     echo '<p>' . get_string($qtype . 'summary', 'qtype_' . $qtype) . "</p>\n\n";
182 function include_help_for_each_assignment_type() {
183     global $CFG;
185     require_once($CFG->dirroot .'/mod/assignment/lib.php');
186     $typelist = assignment_types();
188     foreach ($typelist as $type => $name) {
189         echo '<h2>'.$name.'</h2>';
190         echo get_string('help'.$type, 'assignment');
191         echo '<hr />';
192     }
194 ?>