| Línea 336... |
Línea 336... |
| 336 |
* @param string|int $key
|
336 |
* @param string|int $key
|
| 337 |
* @param pix_icon $icon
|
337 |
* @param pix_icon $icon
|
| 338 |
* @return navigation_node
|
338 |
* @return navigation_node
|
| 339 |
*/
|
339 |
*/
|
| 340 |
public static function create($text, $action=null, $type=self::TYPE_CUSTOM,
|
340 |
public static function create($text, $action=null, $type=self::TYPE_CUSTOM,
|
| 341 |
$shorttext=null, $key=null, pix_icon $icon=null) {
|
341 |
$shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 342 |
if ($action && !($action instanceof moodle_url || $action instanceof action_link)) {
|
342 |
if ($action && !($action instanceof moodle_url || $action instanceof action_link)) {
|
| 343 |
debugging(
|
343 |
debugging(
|
| 344 |
"It is required that the action provided be either an action_url|moodle_url." .
|
344 |
"It is required that the action provided be either an action_url|moodle_url." .
|
| 345 |
" Please update your definition.", E_NOTICE);
|
345 |
" Please update your definition.", E_NOTICE);
|
| 346 |
}
|
346 |
}
|
| Línea 376... |
Línea 376... |
| 376 |
* @param string $shorttext
|
376 |
* @param string $shorttext
|
| 377 |
* @param string|int $key
|
377 |
* @param string|int $key
|
| 378 |
* @param pix_icon $icon
|
378 |
* @param pix_icon $icon
|
| 379 |
* @return navigation_node
|
379 |
* @return navigation_node
|
| 380 |
*/
|
380 |
*/
|
| 381 |
public function add($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, pix_icon $icon=null) {
|
381 |
public function add($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 382 |
if ($action && is_string($action)) {
|
382 |
if ($action && is_string($action)) {
|
| 383 |
$action = new moodle_url($action);
|
383 |
$action = new moodle_url($action);
|
| 384 |
}
|
384 |
}
|
| 385 |
// Create child node
|
385 |
// Create child node
|
| 386 |
$childnode = self::create($text, $action, $type, $shorttext, $key, $icon);
|
386 |
$childnode = self::create($text, $action, $type, $shorttext, $key, $icon);
|
| Línea 882... |
Línea 882... |
| 882 |
* @param array $typestohide Optional. An array of node types that should be hidden.
|
882 |
* @param array $typestohide Optional. An array of node types that should be hidden.
|
| 883 |
* If null all nodes will be hidden.
|
883 |
* If null all nodes will be hidden.
|
| 884 |
* If an array is given then nodes will only be hidden if their type mtatches an element in the array.
|
884 |
* If an array is given then nodes will only be hidden if their type mtatches an element in the array.
|
| 885 |
* e.g. array(navigation_node::TYPE_COURSE) would hide only course nodes.
|
885 |
* e.g. array(navigation_node::TYPE_COURSE) would hide only course nodes.
|
| 886 |
*/
|
886 |
*/
|
| 887 |
public function hide(array $typestohide = null) {
|
887 |
public function hide(?array $typestohide = null) {
|
| 888 |
if ($typestohide === null || in_array($this->type, $typestohide)) {
|
888 |
if ($typestohide === null || in_array($this->type, $typestohide)) {
|
| 889 |
$this->display = false;
|
889 |
$this->display = false;
|
| 890 |
if ($this->has_children()) {
|
890 |
if ($this->has_children()) {
|
| 891 |
foreach ($this->children as $child) {
|
891 |
foreach ($this->children as $child) {
|
| 892 |
$child->hide($typestohide);
|
892 |
$child->hide($typestohide);
|
| Línea 1015... |
Línea 1015... |
| 1015 |
'contextlocking',
|
1015 |
'contextlocking',
|
| 1016 |
new pix_icon($lockicon, '')
|
1016 |
new pix_icon($lockicon, '')
|
| 1017 |
);
|
1017 |
);
|
| 1018 |
}
|
1018 |
}
|
| 1019 |
}
|
1019 |
}
|
| - |
|
1020 |
}
|
| - |
|
1021 |
|
| - |
|
1022 |
/**
|
| - |
|
1023 |
* Reset all static data.
|
| - |
|
1024 |
*
|
| - |
|
1025 |
* @throws coding_exception if called outside of a unit test
|
| - |
|
1026 |
*/
|
| - |
|
1027 |
public static function reset_all_data(): void {
|
| - |
|
1028 |
if (!defined('PHPUNIT_TEST') || !PHPUNIT_TEST) {
|
| - |
|
1029 |
throw new coding_exception('Resetting all data is not allowed outside of PHPUnit tests.');
|
| - |
|
1030 |
}
|
| Línea -... |
Línea 1031... |
| - |
|
1031 |
|
| - |
|
1032 |
self::$fullmeurl = null;
|
| - |
|
1033 |
self::$autofindactive = true;
|
| 1020 |
|
1034 |
self::$loadadmintree = false;
|
| 1021 |
}
|
1035 |
}
|
| Línea 1022... |
Línea 1036... |
| 1022 |
}
|
1036 |
}
|
| 1023 |
|
1037 |
|
| Línea 1350... |
Línea 1364... |
| 1350 |
if (during_initial_install()) {
|
1364 |
if (during_initial_install()) {
|
| 1351 |
return;
|
1365 |
return;
|
| 1352 |
}
|
1366 |
}
|
| Línea 1353... |
Línea 1367... |
| 1353 |
|
1367 |
|
| 1354 |
$homepage = get_home_page();
|
1368 |
$homepage = get_home_page();
|
| 1355 |
if ($homepage == HOMEPAGE_SITE) {
|
1369 |
if ($homepage == HOMEPAGE_MY) {
|
| 1356 |
// We are using the site home for the root element.
|
1370 |
// We are using the users my moodle for the root element.
|
| 1357 |
$properties = array(
|
1371 |
$properties = array(
|
| 1358 |
'key' => 'home',
|
1372 |
'key' => 'myhome',
|
| 1359 |
'type' => navigation_node::TYPE_SYSTEM,
|
1373 |
'type' => navigation_node::TYPE_SYSTEM,
|
| 1360 |
'text' => get_string('home'),
|
1374 |
'text' => get_string('myhome'),
|
| 1361 |
'action' => new moodle_url('/'),
|
1375 |
'action' => new moodle_url('/my/'),
|
| 1362 |
'icon' => new pix_icon('i/home', '')
|
1376 |
'icon' => new pix_icon('i/dashboard', ''),
|
| 1363 |
);
|
1377 |
);
|
| 1364 |
} else if ($homepage == HOMEPAGE_MYCOURSES) {
|
1378 |
} else if ($homepage == HOMEPAGE_MYCOURSES) {
|
| 1365 |
// We are using the user's course summary page for the root element.
|
1379 |
// We are using the user's course summary page for the root element.
|
| 1366 |
$properties = array(
|
1380 |
$properties = array(
|
| Línea 1369... |
Línea 1383... |
| 1369 |
'text' => get_string('mycourses'),
|
1383 |
'text' => get_string('mycourses'),
|
| 1370 |
'action' => new moodle_url('/my/courses.php'),
|
1384 |
'action' => new moodle_url('/my/courses.php'),
|
| 1371 |
'icon' => new pix_icon('i/course', '')
|
1385 |
'icon' => new pix_icon('i/course', '')
|
| 1372 |
);
|
1386 |
);
|
| 1373 |
} else {
|
1387 |
} else {
|
| 1374 |
// We are using the users my moodle for the root element.
|
1388 |
// We are using the site home for the root element.
|
| 1375 |
$properties = array(
|
1389 |
$properties = array(
|
| 1376 |
'key' => 'myhome',
|
1390 |
'key' => 'home',
|
| 1377 |
'type' => navigation_node::TYPE_SYSTEM,
|
1391 |
'type' => navigation_node::TYPE_SYSTEM,
|
| 1378 |
'text' => get_string('myhome'),
|
1392 |
'text' => get_string('home'),
|
| 1379 |
'action' => new moodle_url('/my/'),
|
1393 |
'action' => new moodle_url('/'),
|
| 1380 |
'icon' => new pix_icon('i/dashboard', '')
|
1394 |
'icon' => new pix_icon('i/home', ''),
|
| 1381 |
);
|
1395 |
);
|
| 1382 |
}
|
1396 |
}
|
| Línea 1383... |
Línea 1397... |
| 1383 |
|
1397 |
|
| 1384 |
// Use the parents constructor.... good good reuse
|
1398 |
// Use the parents constructor.... good good reuse
|
| Línea 2202... |
Línea 2216... |
| 2202 |
$activity = $coursenode->find($cm->id, self::TYPE_ACTIVITY);
|
2216 |
$activity = $coursenode->find($cm->id, self::TYPE_ACTIVITY);
|
| 2203 |
if (empty($activity)) {
|
2217 |
if (empty($activity)) {
|
| 2204 |
$activity = $this->load_stealth_activity($coursenode, get_fast_modinfo($course));
|
2218 |
$activity = $this->load_stealth_activity($coursenode, get_fast_modinfo($course));
|
| 2205 |
}
|
2219 |
}
|
| 2206 |
}
|
2220 |
}
|
| 2207 |
}
|
2221 |
}
|
| Línea 2208... |
Línea 2222... |
| 2208 |
|
2222 |
|
| 2209 |
/**
|
2223 |
/**
|
| 2210 |
* Generates an array of sections and an array of activities for the given course.
|
2224 |
* Generates an array of sections and an array of activities for the given course.
|
| 2211 |
*
|
2225 |
*
|
| Línea 2218... |
Línea 2232... |
| 2218 |
global $CFG;
|
2232 |
global $CFG;
|
| 2219 |
require_once($CFG->dirroot.'/course/lib.php');
|
2233 |
require_once($CFG->dirroot.'/course/lib.php');
|
| Línea 2220... |
Línea 2234... |
| 2220 |
|
2234 |
|
| 2221 |
$modinfo = get_fast_modinfo($course);
|
2235 |
$modinfo = get_fast_modinfo($course);
|
| - |
|
2236 |
$sections = $modinfo->get_section_info_all();
|
| Línea 2222... |
Línea 2237... |
| 2222 |
$sections = $modinfo->get_section_info_all();
|
2237 |
$format = course_get_format($course);
|
| 2223 |
|
2238 |
|
| 2224 |
// For course formats using 'numsections' trim the sections list
|
2239 |
// For course formats using 'numsections' trim the sections list
|
| 2225 |
$courseformatoptions = course_get_format($course)->get_format_options();
|
2240 |
$courseformatoptions = $format->get_format_options();
|
| 2226 |
if (isset($courseformatoptions['numsections'])) {
|
2241 |
if (isset($courseformatoptions['numsections'])) {
|
| Línea 2227... |
Línea 2242... |
| 2227 |
$sections = array_slice($sections, 0, $courseformatoptions['numsections']+1, true);
|
2242 |
$sections = array_slice($sections, 0, $courseformatoptions['numsections']+1, true);
|
| Línea 2228... |
Línea 2243... |
| 2228 |
}
|
2243 |
}
|
| 2229 |
|
2244 |
|
| 2230 |
$activities = array();
|
2245 |
$activities = [];
|
| 2231 |
|
2246 |
|
| 2232 |
foreach ($sections as $key => $section) {
|
2247 |
foreach ($sections as $key => $section) {
|
| 2233 |
// Clone and unset summary to prevent $SESSION bloat (MDL-31802).
|
2248 |
// Clone and unset summary to prevent $SESSION bloat (MDL-31802).
|
| 2234 |
$sections[$key] = clone($section);
|
2249 |
$sections[$key] = clone($section);
|
| 2235 |
unset($sections[$key]->summary);
|
2250 |
unset($sections[$key]->summary);
|
| 2236 |
$sections[$key]->hasactivites = false;
|
2251 |
$sections[$key]->hasactivites = false;
|
| 2237 |
if (!array_key_exists($section->section, $modinfo->sections)) {
|
- |
|
| 2238 |
continue;
|
2252 |
if (!array_key_exists($section->sectionnum, $modinfo->sections)) {
|
| 2239 |
}
|
2253 |
continue;
|
| 2240 |
foreach ($modinfo->sections[$section->section] as $cmid) {
|
2254 |
}
|
| 2241 |
$cm = $modinfo->cms[$cmid];
|
2255 |
foreach ($section->get_sequence_cm_infos() as $cm) {
|
| 2242 |
$activity = new stdClass;
|
2256 |
$activity = new stdClass;
|
| 2243 |
$activity->id = $cm->id;
|
2257 |
$activity->id = $cm->id;
|
| 2244 |
$activity->course = $course->id;
|
2258 |
$activity->course = $course->id;
|
| 2245 |
$activity->section = $section->section;
|
2259 |
$activity->section = $section->sectionnum;
|
| 2246 |
$activity->name = $cm->name;
|
2260 |
$activity->name = $cm->name;
|
| 2247 |
$activity->icon = $cm->icon;
|
2261 |
$activity->icon = $cm->icon;
|
| 2248 |
$activity->iconcomponent = $cm->iconcomponent;
|
2262 |
$activity->iconcomponent = $cm->iconcomponent;
|
| 2249 |
$activity->hidden = (!$cm->visible);
|
2263 |
$activity->hidden = (!$cm->visible);
|
| - |
|
2264 |
$activity->modname = $cm->modname;
|
| - |
|
2265 |
$activity->nodetype = navigation_node::NODETYPE_LEAF;
|
| - |
|
2266 |
$activity->onclick = $cm->onclick;
|
| - |
|
2267 |
$url = $cm->url;
|
| - |
|
2268 |
|
| - |
|
2269 |
// Activities witout url but with delegated section uses the section url.
|
| - |
|
2270 |
$activity->delegatedsection = $cm->get_delegated_section_info();
|
| - |
|
2271 |
if (empty($cm->url) && $activity->delegatedsection) {
|
| - |
|
2272 |
$url = $format->get_view_url(
|
| - |
|
2273 |
$activity->delegatedsection->sectionnum,
|
| 2250 |
$activity->modname = $cm->modname;
|
2274 |
['navigation' => true]
|
| 2251 |
$activity->nodetype = navigation_node::NODETYPE_LEAF;
|
2275 |
);
|
| 2252 |
$activity->onclick = $cm->onclick;
|
2276 |
}
|
| 2253 |
$url = $cm->url;
|
2277 |
|
| 2254 |
if (!$url) {
|
2278 |
if (!$url) {
|
| 2255 |
$activity->url = null;
|
2279 |
$activity->url = null;
|
| 2256 |
$activity->display = false;
|
2280 |
$activity->display = false;
|
| 2257 |
} else {
|
2281 |
} else {
|
| 2258 |
$activity->url = $url->out();
|
2282 |
$activity->url = $url->out();
|
| 2259 |
$activity->display = $cm->is_visible_on_course_page() ? true : false;
|
2283 |
$activity->display = $cm->is_visible_on_course_page() ? true : false;
|
| 2260 |
if (self::module_extends_navigation($cm->modname)) {
|
2284 |
if (self::module_extends_navigation($cm->modname)) {
|
| 2261 |
$activity->nodetype = navigation_node::NODETYPE_BRANCH;
|
2285 |
$activity->nodetype = navigation_node::NODETYPE_BRANCH;
|
| 2262 |
}
|
2286 |
}
|
| 2263 |
}
|
2287 |
}
|
| 2264 |
$activities[$cmid] = $activity;
|
2288 |
$activities[$cm->id] = $activity;
|
| 2265 |
if ($activity->display) {
|
2289 |
if ($activity->display) {
|
| Línea 2266... |
Línea 2290... |
| 2266 |
$sections[$key]->hasactivites = true;
|
2290 |
$sections[$key]->hasactivites = true;
|
| 2267 |
}
|
2291 |
}
|
| Línea 2268... |
Línea 2292... |
| 2268 |
}
|
2292 |
}
|
| 2269 |
}
|
2293 |
}
|
| 2270 |
|
2294 |
|
| Línea 2282... |
Línea 2306... |
| 2282 |
global $CFG, $DB, $USER, $SITE;
|
2306 |
global $CFG, $DB, $USER, $SITE;
|
| 2283 |
require_once($CFG->dirroot.'/course/lib.php');
|
2307 |
require_once($CFG->dirroot.'/course/lib.php');
|
| Línea 2284... |
Línea 2308... |
| 2284 |
|
2308 |
|
| Línea 2285... |
Línea 2309... |
| 2285 |
list($sections, $activities) = $this->generate_sections_and_activities($course);
|
2309 |
list($sections, $activities) = $this->generate_sections_and_activities($course);
|
| 2286 |
|
2310 |
|
| 2287 |
$navigationsections = array();
|
- |
|
| 2288 |
foreach ($sections as $sectionid => $section) {
|
2311 |
$navigationsections = [];
|
| 2289 |
$section = clone($section);
|
2312 |
foreach ($sections as $sectionid => $section) {
|
| 2290 |
if ($course->id == $SITE->id) {
|
- |
|
| 2291 |
$this->load_section_activities($coursenode, $section->section, $activities);
|
- |
|
| 2292 |
} else {
|
- |
|
| 2293 |
if (!$section->uservisible || (!$this->showemptysections &&
|
2313 |
if ($course->id == $SITE->id) {
|
| 2294 |
!$section->hasactivites && $this->includesectionnum !== $section->section)) {
|
2314 |
$this->load_section_activities_navigation($coursenode, $section, $activities);
|
| Línea -... |
Línea 2315... |
| - |
|
2315 |
continue;
|
| - |
|
2316 |
}
|
| - |
|
2317 |
|
| 2295 |
continue;
|
2318 |
if (
|
| - |
|
2319 |
!$section->uservisible
|
| 2296 |
}
|
2320 |
|| (
|
| - |
|
2321 |
!$this->showemptysections
|
| - |
|
2322 |
&& !$section->hasactivites
|
| - |
|
2323 |
&& $this->includesectionnum !== $section->section
|
| - |
|
2324 |
)
|
| Línea 2297... |
Línea -... |
| 2297 |
|
- |
|
| 2298 |
$sectionname = get_section_name($course, $section);
|
2325 |
) {
|
| 2299 |
$url = course_get_url($course, $section->section, array('navigation' => true));
|
2326 |
continue;
|
| 2300 |
|
- |
|
| 2301 |
$sectionnode = $coursenode->add($sectionname, $url, navigation_node::TYPE_SECTION,
|
- |
|
| 2302 |
null, $section->id, new pix_icon('i/section', ''));
|
- |
|
| 2303 |
$sectionnode->nodetype = navigation_node::NODETYPE_BRANCH;
|
- |
|
| 2304 |
$sectionnode->hidden = (!$section->visible || !$section->available);
|
2327 |
}
|
| 2305 |
$sectionnode->add_attribute('data-section-name-for', $section->id);
|
- |
|
| 2306 |
if ($this->includesectionnum !== false && $this->includesectionnum == $section->section) {
|
2328 |
|
| - |
|
2329 |
// Delegated sections are added from the activity node.
|
| - |
|
2330 |
if ($section->get_component_instance()) {
|
| - |
|
2331 |
continue;
|
| - |
|
2332 |
}
|
| - |
|
2333 |
|
| - |
|
2334 |
$navigationsections[$sectionid] = $this->load_section_navigation(
|
| 2307 |
$this->load_section_activities($sectionnode, $section->section, $activities);
|
2335 |
parentnode: $coursenode,
|
| 2308 |
}
|
2336 |
section: $section,
|
| 2309 |
$navigationsections[$sectionid] = $section;
|
2337 |
activitiesdata: $activities,
|
| Línea 2310... |
Línea 2338... |
| 2310 |
}
|
2338 |
);
|
| - |
|
2339 |
}
|
| - |
|
2340 |
return $navigationsections;
|
| - |
|
2341 |
}
|
| - |
|
2342 |
|
| - |
|
2343 |
/**
|
| - |
|
2344 |
* Returns true if the section is included in the breadcrumb.
|
| - |
|
2345 |
*
|
| - |
|
2346 |
* @param section_info $section
|
| - |
|
2347 |
* @param moodle_url|null $sectionurl
|
| - |
|
2348 |
* @return bool
|
| - |
|
2349 |
*/
|
| - |
|
2350 |
protected function is_section_in_breadcrumb(section_info $section, ?moodle_url $sectionurl): bool {
|
| - |
|
2351 |
// Ajax requests uses includesectionnum as param.
|
| - |
|
2352 |
if ($this->includesectionnum !== false && $this->includesectionnum == $section->sectionnum) {
|
| - |
|
2353 |
return true;
|
| - |
|
2354 |
}
|
| - |
|
2355 |
|
| - |
|
2356 |
// If we are in a section page, we need to check for any child section.
|
| - |
|
2357 |
$checkchildrenurls = false;
|
| - |
|
2358 |
$format = null;
|
| - |
|
2359 |
if ($sectionurl && $this->page->url->compare($sectionurl, URL_MATCH_BASE)) {
|
| - |
|
2360 |
$checkchildrenurls = true;
|
| - |
|
2361 |
$format = course_get_format($section->course);
|
| - |
|
2362 |
}
|
| - |
|
2363 |
|
| - |
|
2364 |
// Activities can have delegated sections that acts as a child section.
|
| - |
|
2365 |
foreach ($section->get_sequence_cm_infos() as $cm) {
|
| - |
|
2366 |
$delegatedsection = $cm->get_delegated_section_info();
|
| - |
|
2367 |
if (!$delegatedsection) {
|
| - |
|
2368 |
continue;
|
| - |
|
2369 |
}
|
| - |
|
2370 |
// Check if the child node is requested via Ajax.
|
| - |
|
2371 |
if ($this->includesectionnum == $delegatedsection->sectionnum) {
|
| - |
|
2372 |
return true;
|
| - |
|
2373 |
}
|
| - |
|
2374 |
|
| - |
|
2375 |
if ($checkchildrenurls) {
|
| - |
|
2376 |
$childurl = $format->get_view_url($delegatedsection, ['navigation' => true]);
|
| - |
|
2377 |
if ($childurl && $this->page->url->compare($childurl, URL_MATCH_EXACT)) {
|
| - |
|
2378 |
return true;
|
| - |
|
2379 |
}
|
| - |
|
2380 |
}
|
| - |
|
2381 |
}
|
| - |
|
2382 |
|
| - |
|
2383 |
return false;
|
| - |
|
2384 |
}
|
| - |
|
2385 |
|
| - |
|
2386 |
/**
|
| - |
|
2387 |
* Loads a section into the navigation structure.
|
| - |
|
2388 |
*
|
| - |
|
2389 |
* @param navigation_node $parentnode
|
| - |
|
2390 |
* @param section_info $section
|
| - |
|
2391 |
* @param stdClass[] $activitiesdata Array of objects containing activities data indexed by cmid.
|
| - |
|
2392 |
* @return navigation_node the section navigaiton node
|
| - |
|
2393 |
*/
|
| - |
|
2394 |
public function load_section_navigation($parentnode, $section, $activitiesdata): navigation_node {
|
| - |
|
2395 |
$format = course_get_format($section->course);
|
| - |
|
2396 |
$sectionname = $format->get_section_name($section);
|
| - |
|
2397 |
$url = $format->get_view_url($section, ['navigation' => true]);
|
| - |
|
2398 |
|
| - |
|
2399 |
$sectionnode = $parentnode->add(
|
| - |
|
2400 |
text: $sectionname,
|
| - |
|
2401 |
action: $url,
|
| - |
|
2402 |
type: navigation_node::TYPE_SECTION,
|
| - |
|
2403 |
key: $section->id,
|
| - |
|
2404 |
icon: new pix_icon('i/section', ''),
|
| - |
|
2405 |
);
|
| - |
|
2406 |
$sectionnode->nodetype = navigation_node::NODETYPE_BRANCH;
|
| - |
|
2407 |
$sectionnode->hidden = (!$section->visible || !$section->available);
|
| - |
|
2408 |
$sectionnode->add_attribute('data-section-name-for', $section->id);
|
| - |
|
2409 |
|
| - |
|
2410 |
// Sections content are usually loaded via ajax but the sections from the requested breadcrumb.
|
| - |
|
2411 |
if ($this->is_section_in_breadcrumb($section, $url)) {
|
| - |
|
2412 |
$this->load_section_activities_navigation($sectionnode, $section, $activitiesdata);
|
| 2311 |
}
|
2413 |
}
|
| - |
|
2414 |
return $sectionnode;
|
| - |
|
2415 |
}
|
| - |
|
2416 |
|
| 2312 |
return $navigationsections;
|
2417 |
/**
|
| 2313 |
}
|
2418 |
* Loads the activities for a section into the navigation structure.
|
| 2314 |
|
2419 |
*
|
| 2315 |
/**
|
- |
|
| 2316 |
* Loads all of the activities for a section into the navigation structure.
|
2420 |
* This method is called from global_navigation::load_section_navigation(),
|
| 2317 |
*
|
- |
|
| 2318 |
* @param navigation_node $sectionnode
|
2421 |
* It is not intended to be called directly.
|
| 2319 |
* @param int $sectionnumber
|
2422 |
*
|
| - |
|
2423 |
* @param navigation_node $sectionnode
|
| - |
|
2424 |
* @param section_info $section
|
| - |
|
2425 |
* @param stdClass[] $activitiesdata Array of objects containing activities data indexed by cmid.
|
| - |
|
2426 |
*/
|
| 2320 |
* @param array $activities An array of activites as returned by {@link global_navigation::generate_sections_and_activities()}
|
2427 |
protected function load_section_activities_navigation(
|
| 2321 |
* @param stdClass $course The course object the section and activities relate to.
|
- |
|
| 2322 |
* @return array Array of activity nodes
|
- |
|
| Línea 2323... |
Línea 2428... |
| 2323 |
*/
|
2428 |
navigation_node $sectionnode,
|
| 2324 |
protected function load_section_activities(navigation_node $sectionnode, $sectionnumber, array $activities, $course = null) {
|
2429 |
section_info $section,
|
| 2325 |
global $CFG, $SITE;
|
2430 |
array $activitiesdata
|
| 2326 |
// A static counter for JS function naming
|
2431 |
): array {
|
| Línea 2327... |
Línea -... |
| 2327 |
static $legacyonclickcounter = 0;
|
- |
|
| 2328 |
|
2432 |
global $CFG, $SITE;
|
| 2329 |
$activitynodes = array();
|
2433 |
|
| 2330 |
if (empty($activities)) {
|
- |
|
| 2331 |
return $activitynodes;
|
- |
|
| 2332 |
}
|
- |
|
| 2333 |
|
- |
|
| Línea -... |
Línea 2434... |
| - |
|
2434 |
$activitynodes = [];
|
| 2334 |
if (!is_object($course)) {
|
2435 |
if (empty($activitiesdata)) {
|
| - |
|
2436 |
return $activitynodes;
|
| 2335 |
$activity = reset($activities);
|
2437 |
}
|
| - |
|
2438 |
|
| - |
|
2439 |
foreach ($section->get_sequence_cm_infos() as $cm) {
|
| - |
|
2440 |
$activitydata = $activitiesdata[$cm->id];
|
| 2336 |
$courseid = $activity->course;
|
2441 |
|
| 2337 |
} else {
|
2442 |
// If activity is a delegated section, load a section node instead of the activity one.
|
| 2338 |
$courseid = $course->id;
|
- |
|
| 2339 |
}
|
- |
|
| 2340 |
$showactivities = ($courseid != $SITE->id || !empty($CFG->navshowfrontpagemods));
|
- |
|
| 2341 |
|
- |
|
| 2342 |
foreach ($activities as $activity) {
|
- |
|
| Línea 2343... |
Línea -... |
| 2343 |
if ($activity->section != $sectionnumber) {
|
- |
|
| 2344 |
continue;
|
- |
|
| 2345 |
}
|
- |
|
| 2346 |
if ($activity->icon) {
|
- |
|
| 2347 |
$icon = new pix_icon($activity->icon, get_string('modulename', $activity->modname), $activity->iconcomponent);
|
- |
|
| 2348 |
} else {
|
- |
|
| 2349 |
$icon = new pix_icon('monologo', get_string('modulename', $activity->modname), $activity->modname);
|
- |
|
| 2350 |
}
|
- |
|
| 2351 |
|
- |
|
| 2352 |
// Prepare the default name and url for the node
|
- |
|
| 2353 |
$displaycontext = \context_helper::get_navigation_filter_context(context_module::instance($activity->id));
|
- |
|
| 2354 |
$activityname = format_string($activity->name, true, ['context' => $displaycontext]);
|
- |
|
| 2355 |
$action = new moodle_url($activity->url);
|
- |
|
| 2356 |
|
- |
|
| 2357 |
// Check if the onclick property is set (puke!)
|
- |
|
| 2358 |
if (!empty($activity->onclick)) {
|
- |
|
| 2359 |
// Increment the counter so that we have a unique number.
|
- |
|
| 2360 |
$legacyonclickcounter++;
|
- |
|
| 2361 |
// Generate the function name we will use
|
- |
|
| 2362 |
$functionname = 'legacy_activity_onclick_handler_'.$legacyonclickcounter;
|
- |
|
| 2363 |
$propogrationhandler = '';
|
- |
|
| 2364 |
// Check if we need to cancel propogation. Remember inline onclick
|
- |
|
| 2365 |
// events would return false if they wanted to prevent propogation and the
|
- |
|
| 2366 |
// default action.
|
- |
|
| 2367 |
if (strpos($activity->onclick, 'return false')) {
|
- |
|
| 2368 |
$propogrationhandler = 'e.halt();';
|
- |
|
| 2369 |
}
|
- |
|
| 2370 |
// Decode the onclick - it has already been encoded for display (puke)
|
2443 |
if ($activitydata->delegatedsection) {
|
| 2371 |
$onclick = htmlspecialchars_decode($activity->onclick, ENT_QUOTES);
|
- |
|
| 2372 |
// Build the JS function the click event will call
|
- |
|
| 2373 |
$jscode = "function {$functionname}(e) { $propogrationhandler $onclick }";
|
- |
|
| 2374 |
$this->page->requires->js_amd_inline($jscode);
|
- |
|
| 2375 |
// Override the default url with the new action link
|
- |
|
| 2376 |
$action = new action_link($action, $activityname, new component_action('click', $functionname));
|
2444 |
$activitynodes[$activitydata->id] = $this->load_section_navigation(
|
| Línea 2377... |
Línea 2445... |
| 2377 |
}
|
2445 |
parentnode: $sectionnode,
|
| 2378 |
|
2446 |
section: $activitydata->delegatedsection,
|
| - |
|
2447 |
activitiesdata: $activitiesdata,
|
| - |
|
2448 |
);
|
| - |
|
2449 |
continue;
|
| - |
|
2450 |
}
|
| - |
|
2451 |
|
| - |
|
2452 |
$activitynodes[$activitydata->id] = $this->load_activity_navigation($sectionnode, $activitydata);
|
| - |
|
2453 |
}
|
| - |
|
2454 |
|
| - |
|
2455 |
return $activitynodes;
|
| - |
|
2456 |
}
|
| - |
|
2457 |
|
| - |
|
2458 |
/**
|
| - |
|
2459 |
* Loads an activity into the navigation structure.
|
| - |
|
2460 |
*
|
| - |
|
2461 |
* This method is called from global_navigation::load_section_activities_navigation(),
|
| - |
|
2462 |
* It is not intended to be called directly.
|
| - |
|
2463 |
*
|
| - |
|
2464 |
* @param navigation_node $sectionnode
|
| - |
|
2465 |
* @param stdClass $activitydata The acitivy navigation data generated from generate_sections_and_activities
|
| - |
|
2466 |
* @return navigation_node
|
| - |
|
2467 |
*/
|
| - |
|
2468 |
protected function load_activity_navigation(
|
| - |
|
2469 |
navigation_node $sectionnode,
|
| - |
|
2470 |
stdClass $activitydata,
|
| - |
|
2471 |
): navigation_node {
|
| - |
|
2472 |
global $SITE, $CFG;
|
| - |
|
2473 |
|
| - |
|
2474 |
$showactivities = ($activitydata->course != $SITE->id || !empty($CFG->navshowfrontpagemods));
|
| - |
|
2475 |
|
| - |
|
2476 |
$icon = new pix_icon(
|
| - |
|
2477 |
$activitydata->icon ?: 'monologo',
|
| - |
|
2478 |
get_string('modulename', $activitydata->modname),
|
| - |
|
2479 |
$activitydata->icon ? $activitydata->iconcomponent : $activitydata->modname,
|
| - |
|
2480 |
);
|
| - |
|
2481 |
|
| - |
|
2482 |
// Prepare the default name and url for the node.
|
| - |
|
2483 |
$displaycontext = \context_helper::get_navigation_filter_context(context_module::instance($activitydata->id));
|
| - |
|
2484 |
$activityname = format_string($activitydata->name, true, ['context' => $displaycontext]);
|
| - |
|
2485 |
|
| - |
|
2486 |
$activitynode = $sectionnode->add(
|
| - |
|
2487 |
text: $activityname,
|
| - |
|
2488 |
action: $this->get_activity_action($activitydata, $activityname),
|
| - |
|
2489 |
type: navigation_node::TYPE_ACTIVITY,
|
| - |
|
2490 |
key: $activitydata->id,
|
| - |
|
2491 |
icon: $icon,
|
| - |
|
2492 |
);
|
| - |
|
2493 |
$activitynode->title(get_string('modulename', $activitydata->modname));
|
| - |
|
2494 |
$activitynode->hidden = $activitydata->hidden;
|
| - |
|
2495 |
$activitynode->display = $showactivities && $activitydata->display;
|
| - |
|
2496 |
$activitynode->nodetype = $activitydata->nodetype;
|
| - |
|
2497 |
|
| - |
|
2498 |
return $activitynode;
|
| - |
|
2499 |
}
|
| - |
|
2500 |
|
| - |
|
2501 |
/**
|
| - |
|
2502 |
* Returns the action for the activity.
|
| - |
|
2503 |
*
|
| - |
|
2504 |
* @param stdClass $activitydata The acitivy navigation data generated from generate_sections_and_activities
|
| - |
|
2505 |
* @param string $activityname
|
| - |
|
2506 |
* @return moodle_url|action_link
|
| - |
|
2507 |
*/
|
| - |
|
2508 |
protected function get_activity_action(stdClass $activitydata, string $activityname): moodle_url|action_link {
|
| - |
|
2509 |
// A static counter for JS function naming.
|
| - |
|
2510 |
static $legacyonclickcounter = 0;
|
| - |
|
2511 |
|
| - |
|
2512 |
$action = new moodle_url($activitydata->url);
|
| - |
|
2513 |
|
| - |
|
2514 |
// Check if the onclick property is set (puke!).
|
| - |
|
2515 |
if (!empty($activitydata->onclick)) {
|
| - |
|
2516 |
// Increment the counter so that we have a unique number.
|
| - |
|
2517 |
$legacyonclickcounter++;
|
| - |
|
2518 |
// Generate the function name we will use.
|
| - |
|
2519 |
$functionname = 'legacy_activity_onclick_handler_' . $legacyonclickcounter;
|
| - |
|
2520 |
$propogrationhandler = '';
|
| - |
|
2521 |
// Check if we need to cancel propogation. Remember inline onclick
|
| - |
|
2522 |
// events would return false if they wanted to prevent propogation and the
|
| - |
|
2523 |
// default action.
|
| - |
|
2524 |
if (strpos($activitydata->onclick, 'return false')) {
|
| - |
|
2525 |
$propogrationhandler = 'e.halt();';
|
| - |
|
2526 |
}
|
| - |
|
2527 |
// Decode the onclick - it has already been encoded for display (puke).
|
| - |
|
2528 |
$onclick = htmlspecialchars_decode($activitydata->onclick, ENT_QUOTES);
|
| - |
|
2529 |
// Build the JS function the click event will call.
|
| - |
|
2530 |
$jscode = "function {$functionname}(e) { $propogrationhandler $onclick }";
|
| - |
|
2531 |
$this->page->requires->js_amd_inline($jscode);
|
| - |
|
2532 |
// Override the default url with the new action link.
|
| - |
|
2533 |
$action = new action_link($action, $activityname, new component_action('click', $functionname));
|
| - |
|
2534 |
}
|
| - |
|
2535 |
return $action;
|
| - |
|
2536 |
}
|
| - |
|
2537 |
|
| - |
|
2538 |
/**
|
| - |
|
2539 |
* Loads all of the activities for a section into the navigation structure.
|
| - |
|
2540 |
*
|
| - |
|
2541 |
* @param navigation_node $sectionnode
|
| - |
|
2542 |
* @param int $sectionnumber
|
| - |
|
2543 |
* @param array $activities An array of activites as returned by {@link global_navigation::generate_sections_and_activities()}
|
| - |
|
2544 |
* @param stdClass $course The course object the section and activities relate to.
|
| - |
|
2545 |
* @return array Array of activity nodes
|
| - |
|
2546 |
*/
|
| - |
|
2547 |
#[\core\attribute\deprecated(
|
| - |
|
2548 |
replacement: 'load_section_activities_navigation',
|
| - |
|
2549 |
since: '4.5',
|
| - |
|
2550 |
mdl: 'MDL-82845',
|
| - |
|
2551 |
)]
|
| - |
|
2552 |
protected function load_section_activities(navigation_node $sectionnode, $sectionnumber, array $activities, $course = null) {
|
| 2379 |
$activitynode = $sectionnode->add($activityname, $action, navigation_node::TYPE_ACTIVITY, null, $activity->id, $icon);
|
2553 |
\core\deprecation::emit_deprecation([self::class, __FUNCTION__]);
|
| 2380 |
$activitynode->title(get_string('modulename', $activity->modname));
|
2554 |
if (!is_object($course)) {
|
| 2381 |
$activitynode->hidden = $activity->hidden;
|
2555 |
$activity = reset($activities);
|
| 2382 |
$activitynode->display = $showactivities && $activity->display;
|
2556 |
$courseid = $activity->course;
|
| 2383 |
$activitynode->nodetype = $activity->nodetype;
|
2557 |
} else {
|
| Línea 2577... |
Línea 2751... |
| 2577 |
} else {
|
2751 |
} else {
|
| 2578 |
$usernode->add(get_string('viewprofile'), new moodle_url('/user/view.php', $baseargs));
|
2752 |
$usernode->add(get_string('viewprofile'), new moodle_url('/user/view.php', $baseargs));
|
| 2579 |
}
|
2753 |
}
|
| 2580 |
}
|
2754 |
}
|
| Línea 2581... |
Línea -... |
| 2581 |
|
- |
|
| 2582 |
if (!empty($CFG->navadduserpostslinks)) {
|
- |
|
| 2583 |
// Add nodes for forum posts and discussions if the user can view either or both
|
- |
|
| 2584 |
// There are no capability checks here as the content of the page is based
|
- |
|
| 2585 |
// purely on the forums the current user has access too.
|
- |
|
| 2586 |
$forumtab = $usernode->add(get_string('forumposts', 'forum'));
|
- |
|
| 2587 |
$forumtab->add(get_string('posts', 'forum'), new moodle_url('/mod/forum/user.php', $baseargs));
|
- |
|
| 2588 |
$forumtab->add(get_string('discussions', 'forum'), new moodle_url('/mod/forum/user.php',
|
- |
|
| 2589 |
array_merge($baseargs, array('mode' => 'discussions'))));
|
- |
|
| 2590 |
}
|
- |
|
| 2591 |
|
2755 |
|
| 2592 |
// Add blog nodes.
|
2756 |
// Add blog nodes.
|
| 2593 |
if (!empty($CFG->enableblogs)) {
|
2757 |
if (!empty($CFG->enableblogs)) {
|
| 2594 |
if (!$this->cache->cached('userblogoptions'.$user->id)) {
|
2758 |
if (!$this->cache->cached('userblogoptions'.$user->id)) {
|
| 2595 |
require_once($CFG->dirroot.'/blog/lib.php');
|
2759 |
require_once($CFG->dirroot.'/blog/lib.php');
|
| Línea 2973... |
Línea 3137... |
| 2973 |
$siteparticipantsnode->remove();
|
3137 |
$siteparticipantsnode->remove();
|
| 2974 |
}
|
3138 |
}
|
| Línea 2975... |
Línea 3139... |
| 2975 |
|
3139 |
|
| 2976 |
// Badges.
|
3140 |
// Badges.
|
| 2977 |
if ($navoptions->badges) {
|
3141 |
if ($navoptions->badges) {
|
| Línea 2978... |
Línea 3142... |
| 2978 |
$url = new moodle_url('/badges/view.php', array('type' => 2, 'id' => $course->id));
|
3142 |
$url = new moodle_url('/badges/index.php', ['type' => 2, 'id' => $course->id]);
|
| 2979 |
|
3143 |
|
| 2980 |
$coursenode->add(get_string('coursebadges', 'badges'), $url,
|
3144 |
$coursenode->add(get_string('coursebadges', 'badges'), $url,
|
| 2981 |
navigation_node::TYPE_SETTING, null, 'badgesview',
|
3145 |
navigation_node::TYPE_SETTING, null, 'badgesview',
|
| Línea 3010... |
Línea 3174... |
| 3010 |
]);
|
3174 |
]);
|
| 3011 |
$coursenode->add(get_string('communication', 'communication'), $url,
|
3175 |
$coursenode->add(get_string('communication', 'communication'), $url,
|
| 3012 |
navigation_node::TYPE_SETTING, null, 'communication');
|
3176 |
navigation_node::TYPE_SETTING, null, 'communication');
|
| 3013 |
}
|
3177 |
}
|
| Línea -... |
Línea 3178... |
| - |
|
3178 |
|
| - |
|
3179 |
if ($navoptions->overview) {
|
| - |
|
3180 |
$coursenode->add(
|
| - |
|
3181 |
text: get_string('activities'),
|
| - |
|
3182 |
action: new moodle_url('/course/overview.php', ['id' => $course->id]),
|
| - |
|
3183 |
type: self::TYPE_CONTAINER,
|
| - |
|
3184 |
key: 'courseoverview',
|
| - |
|
3185 |
icon: new pix_icon('i/info', ''),
|
| - |
|
3186 |
);
|
| - |
|
3187 |
}
|
| 3014 |
|
3188 |
|
| 3015 |
return true;
|
3189 |
return true;
|
| 3016 |
}
|
3190 |
}
|
| 3017 |
/**
|
3191 |
/**
|
| 3018 |
* This generates the structure of the course that won't be generated when
|
3192 |
* This generates the structure of the course that won't be generated when
|
| Línea 3057... |
Línea 3231... |
| 3057 |
|
3231 |
|
| Línea 3058... |
Línea 3232... |
| 3058 |
$filterselect = 0;
|
3232 |
$filterselect = 0;
|
| 3059 |
|
3233 |
|
| 3060 |
// Badges.
|
3234 |
// Badges.
|
| 3061 |
if ($navoptions->badges) {
|
3235 |
if ($navoptions->badges) {
|
| 3062 |
$url = new moodle_url($CFG->wwwroot . '/badges/view.php', array('type' => 1));
|
3236 |
$url = new moodle_url($CFG->wwwroot . '/badges/index.php', ['type' => 1]);
|
| Línea 3063... |
Línea 3237... |
| 3063 |
$coursenode->add(get_string('sitebadges', 'badges'), $url, navigation_node::TYPE_CUSTOM);
|
3237 |
$coursenode->add(get_string('sitebadges', 'badges'), $url, navigation_node::TYPE_CUSTOM);
|
| 3064 |
}
|
3238 |
}
|
| Línea 3888... |
Línea 4062... |
| 3888 |
* @param string $shorttext
|
4062 |
* @param string $shorttext
|
| 3889 |
* @param string|int $key A key to identify this node with. Key + type is unique to a parent.
|
4063 |
* @param string|int $key A key to identify this node with. Key + type is unique to a parent.
|
| 3890 |
* @param pix_icon $icon An optional icon to use for this node.
|
4064 |
* @param pix_icon $icon An optional icon to use for this node.
|
| 3891 |
* @return navigation_node
|
4065 |
* @return navigation_node
|
| 3892 |
*/
|
4066 |
*/
|
| 3893 |
public function add($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, pix_icon $icon=null) {
|
4067 |
public function add($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 3894 |
if ($this->content !== null) {
|
4068 |
if ($this->content !== null) {
|
| 3895 |
debugging('Nav bar items must be printed before $OUTPUT->header() has been called', DEBUG_DEVELOPER);
|
4069 |
debugging('Nav bar items must be printed before $OUTPUT->header() has been called', DEBUG_DEVELOPER);
|
| 3896 |
}
|
4070 |
}
|
| Línea 3897... |
Línea 4071... |
| 3897 |
|
4071 |
|
| Línea 3934... |
Línea 4108... |
| 3934 |
* @param string $shorttext
|
4108 |
* @param string $shorttext
|
| 3935 |
* @param string|int $key A key to identify this node with. Key + type is unique to a parent.
|
4109 |
* @param string|int $key A key to identify this node with. Key + type is unique to a parent.
|
| 3936 |
* @param pix_icon $icon An optional icon to use for this node.
|
4110 |
* @param pix_icon $icon An optional icon to use for this node.
|
| 3937 |
* @return navigation_node
|
4111 |
* @return navigation_node
|
| 3938 |
*/
|
4112 |
*/
|
| 3939 |
public function prepend($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, pix_icon $icon=null) {
|
4113 |
public function prepend($text, $action=null, $type=self::TYPE_CUSTOM, $shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 3940 |
if ($this->content !== null) {
|
4114 |
if ($this->content !== null) {
|
| 3941 |
debugging('Nav bar items must be printed before $OUTPUT->header() has been called', DEBUG_DEVELOPER);
|
4115 |
debugging('Nav bar items must be printed before $OUTPUT->header() has been called', DEBUG_DEVELOPER);
|
| 3942 |
}
|
4116 |
}
|
| 3943 |
// Properties array used when creating the new navigation node.
|
4117 |
// Properties array used when creating the new navigation node.
|
| 3944 |
$itemarray = array(
|
4118 |
$itemarray = array(
|
| Línea 4466... |
Línea 4640... |
| 4466 |
* @param string $shorttext
|
4640 |
* @param string $shorttext
|
| 4467 |
* @param string|int $key a key to access the node by.
|
4641 |
* @param string|int $key a key to access the node by.
|
| 4468 |
* @param pix_icon $icon An icon that appears next to the node.
|
4642 |
* @param pix_icon $icon An icon that appears next to the node.
|
| 4469 |
* @return navigation_node with the new node added to it.
|
4643 |
* @return navigation_node with the new node added to it.
|
| 4470 |
*/
|
4644 |
*/
|
| 4471 |
public function add($text, $url=null, $type=null, $shorttext=null, $key=null, pix_icon $icon=null) {
|
4645 |
public function add($text, $url=null, $type=null, $shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 4472 |
$node = parent::add($text, $url, $type, $shorttext, $key, $icon);
|
4646 |
$node = parent::add($text, $url, $type, $shorttext, $key, $icon);
|
| 4473 |
$node->add_class('root_node');
|
4647 |
$node->add_class('root_node');
|
| 4474 |
return $node;
|
4648 |
return $node;
|
| 4475 |
}
|
4649 |
}
|
| Línea 4484... |
Línea 4658... |
| 4484 |
* @param string $shorttext
|
4658 |
* @param string $shorttext
|
| 4485 |
* @param string|int $key a key to access the node by.
|
4659 |
* @param string|int $key a key to access the node by.
|
| 4486 |
* @param pix_icon $icon An icon that appears next to the node.
|
4660 |
* @param pix_icon $icon An icon that appears next to the node.
|
| 4487 |
* @return navigation_node $node with the new node added to it.
|
4661 |
* @return navigation_node $node with the new node added to it.
|
| 4488 |
*/
|
4662 |
*/
|
| 4489 |
public function prepend($text, $url=null, $type=null, $shorttext=null, $key=null, pix_icon $icon=null) {
|
4663 |
public function prepend($text, $url=null, $type=null, $shorttext=null, $key=null, ?pix_icon $icon=null) {
|
| 4490 |
$children = $this->children;
|
4664 |
$children = $this->children;
|
| 4491 |
$childrenclass = get_class($children);
|
4665 |
$childrenclass = get_class($children);
|
| 4492 |
$this->children = new $childrenclass;
|
4666 |
$this->children = new $childrenclass;
|
| 4493 |
$node = $this->add($text, $url, $type, $shorttext, $key, $icon);
|
4667 |
$node = $this->add($text, $url, $type, $shorttext, $key, $icon);
|
| 4494 |
foreach ($children as $child) {
|
4668 |
foreach ($children as $child) {
|
| Línea 4529... |
Línea 4703... |
| 4529 |
* navigation tree
|
4703 |
* navigation tree
|
| 4530 |
* @param part_of_admin_tree $adminbranch The branch to add, if null generate the admin
|
4704 |
* @param part_of_admin_tree $adminbranch The branch to add, if null generate the admin
|
| 4531 |
* tree and start at the beginning
|
4705 |
* tree and start at the beginning
|
| 4532 |
* @return mixed A key to access the admin tree by
|
4706 |
* @return mixed A key to access the admin tree by
|
| 4533 |
*/
|
4707 |
*/
|
| 4534 |
protected function load_administration_settings(navigation_node $referencebranch=null, part_of_admin_tree $adminbranch=null) {
|
4708 |
protected function load_administration_settings(?navigation_node $referencebranch=null, ?part_of_admin_tree $adminbranch=null) {
|
| 4535 |
global $CFG;
|
4709 |
global $CFG;
|
| Línea 4536... |
Línea 4710... |
| 4536 |
|
4710 |
|
| 4537 |
// Check if we are just starting to generate this navigation.
|
4711 |
// Check if we are just starting to generate this navigation.
|
| Línea 4697... |
Línea 4871... |
| 4697 |
$coursenode->add(get_string('coursecompletion', 'completion'), $url, self::TYPE_SETTING, null, 'coursecompletion',
|
4871 |
$coursenode->add(get_string('coursecompletion', 'completion'), $url, self::TYPE_SETTING, null, 'coursecompletion',
|
| 4698 |
new pix_icon('i/settings', ''));
|
4872 |
new pix_icon('i/settings', ''));
|
| 4699 |
}
|
4873 |
}
|
| Línea 4700... |
Línea 4874... |
| 4700 |
|
4874 |
|
| - |
|
4875 |
if (!$adminoptions->update && $adminoptions->tags) {
|
| - |
|
4876 |
$url = \core\router\util::get_path_for_callable([
|
| - |
|
4877 |
\core_course\route\controller\tags_controller::class,
|
| 4701 |
if (!$adminoptions->update && $adminoptions->tags) {
|
4878 |
'administer_tags',
|
| 4702 |
$url = new moodle_url('/course/tags.php', array('id' => $course->id));
|
4879 |
], ['course' => $course->id]);
|
| 4703 |
$coursenode->add(get_string('coursetags', 'tag'), $url, self::TYPE_SETTING, null, 'coursetags', new pix_icon('i/settings', ''));
|
4880 |
$coursenode->add(get_string('coursetags', 'tag'), $url, self::TYPE_SETTING, null, 'coursetags', new pix_icon('i/settings', ''));
|
| 4704 |
$coursenode->get('coursetags')->set_force_into_more_menu();
|
4881 |
$coursenode->get('coursetags')->set_force_into_more_menu();
|
| Línea 4705... |
Línea 4882... |
| 4705 |
}
|
4882 |
}
|
| Línea 4739... |
Línea 4916... |
| 4739 |
if (!$reportnav->has_children()) {
|
4916 |
if (!$reportnav->has_children()) {
|
| 4740 |
$reportnav->remove();
|
4917 |
$reportnav->remove();
|
| 4741 |
}
|
4918 |
}
|
| 4742 |
}
|
4919 |
}
|
| Línea -... |
Línea 4920... |
| - |
|
4920 |
|
| - |
|
4921 |
// Grade penalty navigation.
|
| - |
|
4922 |
\core_grades\penalty_manager::extend_navigation_course($coursenode, $course, $coursecontext);
|
| 4743 |
|
4923 |
|
| 4744 |
// Check if we can view the gradebook's setup page.
|
4924 |
// Check if we can view the gradebook's setup page.
|
| 4745 |
if ($adminoptions->gradebook) {
|
4925 |
if ($adminoptions->gradebook) {
|
| 4746 |
$url = new moodle_url('/grade/edit/tree/index.php', array('id' => $course->id));
|
4926 |
$url = new moodle_url('/grade/edit/tree/index.php', array('id' => $course->id));
|
| 4747 |
$coursenode->add(get_string('gradebooksetup', 'grades'), $url, self::TYPE_SETTING,
|
4927 |
$coursenode->add(get_string('gradebooksetup', 'grades'), $url, self::TYPE_SETTING,
|
| Línea 4763... |
Línea 4943... |
| 4763 |
badges_add_course_navigation($coursenode, $course);
|
4943 |
badges_add_course_navigation($coursenode, $course);
|
| 4764 |
}
|
4944 |
}
|
| Línea 4765... |
Línea 4945... |
| 4765 |
|
4945 |
|
| 4766 |
// Questions
|
4946 |
// Questions
|
| - |
|
4947 |
require_once($CFG->libdir . '/questionlib.php');
|
| 4767 |
require_once($CFG->libdir . '/questionlib.php');
|
4948 |
$baseurl = \core_question\local\bank\question_bank_helper::get_url_for_qbank_list($course->id);
|
| Línea 4768... |
Línea 4949... |
| 4768 |
question_extend_settings_navigation($coursenode, $coursecontext)->trim_if_empty();
|
4949 |
question_extend_settings_navigation($coursenode, $coursecontext, $baseurl)->trim_if_empty();
|
| 4769 |
|
4950 |
|
| 4770 |
if ($adminoptions->update) {
|
4951 |
if ($adminoptions->update) {
|
| 4771 |
// Repository Instances
|
4952 |
// Repository Instances
|
| Línea 4793... |
Línea 4974... |
| 4793 |
}
|
4974 |
}
|
| Línea 4794... |
Línea 4975... |
| 4794 |
|
4975 |
|
| 4795 |
// Let plugins hook into course navigation.
|
4976 |
// Let plugins hook into course navigation.
|
| 4796 |
$pluginsfunction = get_plugins_with_function('extend_navigation_course', 'lib.php');
|
4977 |
$pluginsfunction = get_plugins_with_function('extend_navigation_course', 'lib.php');
|
| 4797 |
foreach ($pluginsfunction as $plugintype => $plugins) {
|
4978 |
foreach ($pluginsfunction as $plugintype => $plugins) {
|
| 4798 |
// Ignore the report plugin as it was already loaded above.
|
4979 |
// Ignore the report and gradepenalty plugins as they were already loaded above.
|
| 4799 |
if ($plugintype == 'report') {
|
4980 |
if ($plugintype == 'report' || $plugintype == 'gradepenalty') {
|
| 4800 |
continue;
|
4981 |
continue;
|
| 4801 |
}
|
4982 |
}
|
| 4802 |
foreach ($plugins as $pluginfunction) {
|
4983 |
foreach ($plugins as $pluginfunction) {
|
| 4803 |
$pluginfunction($coursenode, $course, $coursecontext);
|
4984 |
$pluginfunction($coursenode, $course, $coursecontext);
|
| Línea 5189... |
Línea 5370... |
| 5189 |
|
5370 |
|
| 5190 |
// Add the user profile to the dashboard.
|
5371 |
// Add the user profile to the dashboard.
|
| 5191 |
$profilenode = $mainpage->add(get_string('profile'), new moodle_url('/user/profile.php',
|
5372 |
$profilenode = $mainpage->add(get_string('profile'), new moodle_url('/user/profile.php',
|
| Línea 5192... |
Línea -... |
| 5192 |
array('id' => $user->id)), self::TYPE_SETTING, null, 'myprofile');
|
- |
|
| 5193 |
|
- |
|
| 5194 |
if (!empty($CFG->navadduserpostslinks)) {
|
- |
|
| 5195 |
// Add nodes for forum posts and discussions if the user can view either or both
|
- |
|
| 5196 |
// There are no capability checks here as the content of the page is based
|
- |
|
| 5197 |
// purely on the forums the current user has access too.
|
- |
|
| 5198 |
$forumtab = $profilenode->add(get_string('forumposts', 'forum'));
|
- |
|
| 5199 |
$forumtab->add(get_string('posts', 'forum'), new moodle_url('/mod/forum/user.php', $baseargs), null, 'myposts');
|
- |
|
| 5200 |
$forumtab->add(get_string('discussions', 'forum'), new moodle_url('/mod/forum/user.php',
|
- |
|
| 5201 |
array_merge($baseargs, array('mode' => 'discussions'))), null, 'mydiscussions');
|
- |
|
| 5202 |
}
|
5373 |
array('id' => $user->id)), self::TYPE_SETTING, null, 'myprofile');
|
| 5203 |
|
5374 |
|
| 5204 |
// Add blog nodes.
|
5375 |
// Add blog nodes.
|
| 5205 |
if (!empty($CFG->enableblogs)) {
|
5376 |
if (!empty($CFG->enableblogs)) {
|
| 5206 |
if (!$this->cache->cached('userblogoptions'.$user->id)) {
|
5377 |
if (!$this->cache->cached('userblogoptions'.$user->id)) {
|
| Línea 5757... |
Línea 5928... |
| 5757 |
}
|
5928 |
}
|
| 5758 |
}
|
5929 |
}
|
| Línea 5759... |
Línea 5930... |
| 5759 |
|
5930 |
|
| 5760 |
// Questions
|
5931 |
// Questions
|
| - |
|
5932 |
require_once($CFG->libdir . '/questionlib.php');
|
| 5761 |
require_once($CFG->libdir . '/questionlib.php');
|
5933 |
$baseurl = \core_question\local\bank\question_bank_helper::get_url_for_qbank_list($course->id);
|
| Línea 5762... |
Línea 5934... |
| 5762 |
question_extend_settings_navigation($frontpage, $coursecontext)->trim_if_empty();
|
5934 |
question_extend_settings_navigation($frontpage, $coursecontext, $baseurl)->trim_if_empty();
|
| 5763 |
|
5935 |
|
| 5764 |
// Manage files
|
5936 |
// Manage files
|
| 5765 |
if ($adminoptions->files) {
|
5937 |
if ($adminoptions->files) {
|
| Línea 5995... |
Línea 6167... |
| 5995 |
}
|
6167 |
}
|
| 5996 |
}
|
6168 |
}
|
| 5997 |
}
|
6169 |
}
|
| Línea 5998... |
Línea 6170... |
| 5998 |
|
6170 |
|
| 5999 |
/**
|
6171 |
/**
|
| 6000 |
* The cache class used by global navigation and settings navigation.
|
6172 |
* The navigation_cache class is used for global and settings navigation data.
|
| 6001 |
*
|
6173 |
*
|
| 6002 |
* It is basically an easy access point to session with a bit of smarts to make
|
- |
|
| 6003 |
* sure that the information that is cached is valid still.
|
6174 |
* It provides an easy access to the session cache with TTL of 1800 seconds.
|
| 6004 |
*
|
6175 |
*
|
| 6005 |
* Example use:
|
6176 |
* Example use:
|
| 6006 |
* <code php>
|
6177 |
* <code php>
|
| 6007 |
* if (!$cache->viewdiscussion()) {
|
6178 |
* if (!$cache->viewdiscussion()) {
|
| Línea 6015... |
Línea 6186... |
| 6015 |
* @category navigation
|
6186 |
* @category navigation
|
| 6016 |
* @copyright 2009 Sam Hemelryk
|
6187 |
* @copyright 2009 Sam Hemelryk
|
| 6017 |
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
6188 |
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
| 6018 |
*/
|
6189 |
*/
|
| 6019 |
class navigation_cache {
|
6190 |
class navigation_cache {
|
| 6020 |
/** @var int represents the time created */
|
6191 |
/** @var cache_session The session cache instance */
|
| 6021 |
protected $creation;
|
6192 |
protected $cache;
|
| 6022 |
/** @var array An array of session keys */
|
6193 |
/** @var array The current cache area data */
|
| 6023 |
protected $session;
|
6194 |
protected $session = [];
|
| - |
|
6195 |
|
| 6024 |
/**
|
6196 |
/**
|
| 6025 |
* The string to use to segregate this particular cache. It can either be
|
6197 |
* @var string A unique string to segregate this particular cache.
|
| 6026 |
* unique to start a fresh cache or if you want to share a cache then make
|
6198 |
* It can either be unique to start a fresh cache or shared to use an existing cache.
|
| 6027 |
* it the string used in the original cache.
|
- |
|
| 6028 |
* @var string
|
- |
|
| 6029 |
*/
|
6199 |
*/
|
| 6030 |
protected $area;
|
6200 |
protected $area;
|
| 6031 |
/** @var int a time that the information will time out */
|
- |
|
| 6032 |
protected $timeout;
|
- |
|
| 6033 |
/** @var stdClass The current context */
|
- |
|
| 6034 |
protected $currentcontext;
|
- |
|
| 6035 |
/** @var int cache time information */
|
6201 |
/** @var int cache time information */
|
| - |
|
6202 |
#[\core\attribute\deprecated(null, since: '4.5', reason: 'This constant is no longer needed.', mdl: 'MDL-79628')]
|
| 6036 |
const CACHETIME = 0;
|
6203 |
const CACHETIME = 0;
|
| 6037 |
/** @var int cache user id */
|
6204 |
/** @var int cache user id */
|
| - |
|
6205 |
#[\core\attribute\deprecated(null, since: '4.5', reason: 'This constant is no longer needed.', mdl: 'MDL-79628')]
|
| 6038 |
const CACHEUSERID = 1;
|
6206 |
const CACHEUSERID = 1;
|
| 6039 |
/** @var int cache value */
|
6207 |
/** @var int cache value */
|
| 6040 |
const CACHEVALUE = 2;
|
6208 |
const CACHEVALUE = 2;
|
| 6041 |
/** @var null|array An array of navigation cache areas to expire on shutdown */
|
6209 |
/** @var null|array An array of cache areas to expire on shutdown */
|
| 6042 |
public static $volatilecaches;
|
6210 |
public static $volatilecaches = null;
|
| Línea 6043... |
Línea 6211... |
| 6043 |
|
6211 |
|
| 6044 |
/**
|
6212 |
/**
|
| 6045 |
* Contructor for the cache. Requires two arguments
|
6213 |
* Contructor for the cache. Requires a area string be passed in.
|
| 6046 |
*
|
6214 |
*
|
| 6047 |
* @param string $area The string to use to segregate this particular cache
|
- |
|
| 6048 |
* it can either be unique to start a fresh cache or if you want
|
- |
|
| 6049 |
* to share a cache then make it the string used in the original
|
- |
|
| 6050 |
* cache
|
6215 |
* @param string $area The unique string to segregate this particular cache.
|
| 6051 |
* @param int $timeout The number of seconds to time the information out after
|
6216 |
* @param int $timeout Deprecated since Moodle 4.5. The number of seconds to time the information out after
|
| 6052 |
*/
|
6217 |
*/
|
| 6053 |
public function __construct($area, $timeout=1800) {
|
6218 |
public function __construct($area, $timeout = null) {
|
| 6054 |
$this->creation = time();
|
6219 |
if ($timeout !== null) {
|
| 6055 |
$this->area = $area;
|
6220 |
debugging(
|
| 6056 |
$this->timeout = time() - $timeout;
|
6221 |
'The timeout argument has been deprecated. Please remove it from your method calls.',
|
| 6057 |
if (rand(0,100) === 0) {
|
6222 |
DEBUG_DEVELOPER,
|
| 6058 |
$this->garbage_collection();
|
6223 |
);
|
| - |
|
6224 |
}
|
| - |
|
6225 |
global $USER;
|
| - |
|
6226 |
$this->area = "user_{$USER->id}_{$area}";
|
| 6059 |
}
|
6227 |
$this->cache = cache::make('core', 'navigation_cache');
|
| Línea 6060... |
Línea 6228... |
| 6060 |
}
|
6228 |
}
|
| 6061 |
|
6229 |
|
| 6062 |
/**
|
6230 |
/**
|
| 6063 |
* Used to set up the cache within the SESSION.
|
6231 |
* Ensure the navigation cache is initialised
|
| 6064 |
*
|
- |
|
| 6065 |
* This is called for each access and ensure that we don't put anything into the session before
|
6232 |
*
|
| 6066 |
* it is required.
|
6233 |
* This is called for each access and ensures that no data is put into the cache before it is required.
|
| 6067 |
*/
|
- |
|
| 6068 |
protected function ensure_session_cache_initialised() {
|
6234 |
*/
|
| - |
|
6235 |
protected function ensure_navigation_cache_initialised() {
|
| 6069 |
global $SESSION;
|
6236 |
if (empty($this->session)) {
|
| 6070 |
if (empty($this->session)) {
|
6237 |
$this->session = $this->cache->get($this->area);
|
| 6071 |
if (!isset($SESSION->navcache)) {
|
6238 |
if (!is_array($this->session)) {
|
| 6072 |
$SESSION->navcache = new stdClass;
|
- |
|
| 6073 |
}
|
- |
|
| 6074 |
if (!isset($SESSION->navcache->{$this->area})) {
|
- |
|
| 6075 |
$SESSION->navcache->{$this->area} = array();
|
- |
|
| 6076 |
}
|
6239 |
$this->session = [];
|
| 6077 |
$this->session = &$SESSION->navcache->{$this->area}; // pointer to array, =& is correct here
|
6240 |
}
|
| Línea 6078... |
Línea 6241... |
| 6078 |
}
|
6241 |
}
|
| 6079 |
}
|
6242 |
}
|
| 6080 |
|
6243 |
|
| 6081 |
/**
|
6244 |
/**
|
| 6082 |
* Magic Method to retrieve something by simply calling using = cache->key
|
6245 |
* Magic Method to retrieve a cached item by simply calling using = cache->key
|
| 6083 |
*
|
6246 |
*
|
| 6084 |
* @param mixed $key The identifier for the information you want out again
|
6247 |
* @param mixed $key The identifier for the cached information
|
| 6085 |
* @return void|mixed Either void or what ever was put in
|
6248 |
* @return mixed|void The cached information or void if not found
|
| 6086 |
*/
|
6249 |
*/
|
| 6087 |
public function __get($key) {
|
6250 |
public function __get($key) {
|
| 6088 |
if (!$this->cached($key)) {
|
6251 |
if (!$this->cached($key)) {
|
| 6089 |
return;
|
- |
|
| 6090 |
}
|
6252 |
return;
|
| Línea 6091... |
Línea 6253... |
| 6091 |
$information = $this->session[$key][self::CACHEVALUE];
|
6253 |
}
|
| 6092 |
return unserialize($information);
|
6254 |
return unserialize($this->session[$key][self::CACHEVALUE]);
|
| 6093 |
}
|
6255 |
}
|
| 6094 |
|
6256 |
|
| 6095 |
/**
|
6257 |
/**
|
| 6096 |
* Magic method that simply uses {@link set();} to store something in the cache
|
6258 |
* Magic method that simply uses {@see navigation_cache::set()} to store an item in the cache
|
| 6097 |
*
|
6259 |
*
|
| 6098 |
* @param string|int $key
|
6260 |
* @param string|int $key The key to store the information against
|
| 6099 |
* @param mixed $information
|
6261 |
* @param mixed $information The information to cache
|
| Línea 6100... |
Línea 6262... |
| 6100 |
*/
|
6262 |
*/
|
| 6101 |
public function __set($key, $information) {
|
6263 |
public function __set($key, $information) {
|
| 6102 |
$this->set($key, $information);
|
6264 |
$this->set($key, $information);
|
| 6103 |
}
|
6265 |
}
|
| 6104 |
|
6266 |
|
| 6105 |
/**
|
6267 |
/**
|
| 6106 |
* Sets some information against the cache (session) for later retrieval
|
6268 |
* Sets some information in the session cache for later retrieval
|
| 6107 |
*
|
- |
|
| 6108 |
* @param string|int $key
|
6269 |
*
|
| 6109 |
* @param mixed $information
|
6270 |
* @param string|int $key
|
| 6110 |
*/
|
6271 |
* @param mixed $information
|
| - |
|
6272 |
*/
|
| 6111 |
public function set($key, $information) {
|
6273 |
public function set($key, $information) {
|
| 6112 |
global $USER;
|
6274 |
$this->ensure_navigation_cache_initialised();
|
| 6113 |
$this->ensure_session_cache_initialised();
|
6275 |
$information = serialize($information);
|
| 6114 |
$information = serialize($information);
|
6276 |
$this->session[$key] = [self::CACHEVALUE => $information];
|
| 6115 |
$this->session[$key]= array(self::CACHETIME=>time(), self::CACHEUSERID=>$USER->id, self::CACHEVALUE=>$information);
|
6277 |
$this->cache->set($this->area, $this->session);
|
| 6116 |
}
|
6278 |
}
|
| 6117 |
/**
|
6279 |
/**
|
| 6118 |
* Check the existence of the identifier in the cache
|
6280 |
* Check the existence of the identifier in the cache
|
| 6119 |
*
|
- |
|
| 6120 |
* @param string|int $key
|
6281 |
*
|
| 6121 |
* @return bool
|
- |
|
| 6122 |
*/
|
6282 |
* @param string|int $key The identifier to check
|
| 6123 |
public function cached($key) {
|
- |
|
| 6124 |
global $USER;
|
6283 |
* @return bool True if the item exists in the cache, false otherwise
|
| 6125 |
$this->ensure_session_cache_initialised();
|
6284 |
*/
|
| 6126 |
if (!array_key_exists($key, $this->session) || !is_array($this->session[$key]) || $this->session[$key][self::CACHEUSERID]!=$USER->id || $this->session[$key][self::CACHETIME] < $this->timeout) {
|
6285 |
public function cached($key) {
|
| 6127 |
return false;
|
6286 |
$this->ensure_navigation_cache_initialised();
|
| 6128 |
}
|
6287 |
return isset($this->session[$key]) &&
|
| 6129 |
return true;
|
6288 |
is_array($this->session[$key]);
|
| 6130 |
}
|
6289 |
}
|
| 6131 |
/**
|
6290 |
/**
|
| 6132 |
* Compare something to it's equivilant in the cache
|
6291 |
* Compare something to it's equivilant in the cache
|
| 6133 |
*
|
6292 |
*
|
| 6134 |
* @param string $key
|
6293 |
* @param string $key The key to check
|
| 6135 |
* @param mixed $value
|
6294 |
* @param mixed $value The value to compare
|
| 6136 |
* @param bool $serialise Whether to serialise the value before comparison
|
6295 |
* @param bool $serialise Whether to serialise the value before comparison
|
| 6137 |
* this should only be set to false if the value is already
|
6296 |
* this should only be set to false if the value is already
|
| 6138 |
* serialised
|
6297 |
* serialised
|
| 6139 |
* @return bool If the value is the same false if it is not set or doesn't match
|
6298 |
* @return bool True if the value is the same as the cached one, false otherwise
|
| 6140 |
*/
|
6299 |
*/
|
| 6141 |
public function compare($key, $value, $serialise = true) {
|
6300 |
public function compare($key, $value, $serialise = true) {
|
| 6142 |
if ($this->cached($key)) {
|
- |
|
| 6143 |
if ($serialise) {
|
- |
|
| 6144 |
$value = serialize($value);
|
6301 |
if ($this->cached($key)) {
|
| 6145 |
}
|
6302 |
if ($serialise) {
|
| 6146 |
if ($this->session[$key][self::CACHEVALUE] === $value) {
|
6303 |
$value = serialize($value);
|
| 6147 |
return true;
|
6304 |
}
|
| 6148 |
}
|
6305 |
return $this->session[$key][self::CACHEVALUE] === $value;
|
| 6149 |
}
|
6306 |
}
|
| 6150 |
return false;
|
6307 |
return false;
|
| 6151 |
}
|
- |
|
| 6152 |
/**
|
6308 |
}
|
| 6153 |
* Wipes the entire cache, good to force regeneration
|
6309 |
/**
|
| 6154 |
*/
|
6310 |
* Deletes the entire cache area, forcing a fresh cache to be created
|
| 6155 |
public function clear() {
|
6311 |
*/
|
| 6156 |
global $SESSION;
|
- |
|
| 6157 |
unset($SESSION->navcache);
|
- |
|
| 6158 |
$this->session = null;
|
- |
|
| 6159 |
}
|
- |
|
| 6160 |
/**
|
- |
|
| 6161 |
* Checks all cache entries and removes any that have expired, good ole cleanup
|
- |
|
| 6162 |
*/
|
- |
|
| 6163 |
protected function garbage_collection() {
|
- |
|
| 6164 |
if (empty($this->session)) {
|
- |
|
| 6165 |
return true;
|
- |
|
| 6166 |
}
|
- |
|
| 6167 |
foreach ($this->session as $key=>$cachedinfo) {
|
- |
|
| 6168 |
if (is_array($cachedinfo) && $cachedinfo[self::CACHETIME]<$this->timeout) {
|
- |
|
| 6169 |
unset($this->session[$key]);
|
- |
|
| 6170 |
}
|
6312 |
public function clear() {
|
| 6171 |
}
|
6313 |
$this->cache->delete($this->area);
|
| 6172 |
}
|
6314 |
$this->session = [];
|
| 6173 |
|
- |
|
| 6174 |
/**
|
- |
|
| 6175 |
* Marks the cache as being volatile (likely to change)
|
6315 |
}
|
| 6176 |
*
|
6316 |
/**
|
| 6177 |
* Any caches marked as volatile will be destroyed at the on shutdown by
|
6317 |
* Marks the cache as volatile (likely to change)
|
| 6178 |
* {@link navigation_node::destroy_volatile_caches()} which is registered
|
6318 |
*
|
| 6179 |
* as a shutdown function if any caches are marked as volatile.
|
6319 |
* Any caches marked as volatile will be destroyed on shutdown by {@see navigation_node::destroy_volatile_caches()}
|
| 6180 |
*
|
6320 |
*
|
| 6181 |
* @param bool $setting True to destroy the cache false not too
|
6321 |
* @param bool $setting True to mark the cache as volatile, false to remove the volatile flag
|
| 6182 |
*/
|
6322 |
*/
|
| Línea 6183... |
Línea 6323... |
| 6183 |
public function volatile($setting = true) {
|
6323 |
public function volatile($setting = true) {
|
| 6184 |
if (self::$volatilecaches===null) {
|
6324 |
if (self::$volatilecaches === null) {
|
| 6185 |
self::$volatilecaches = array();
|
6325 |
self::$volatilecaches = [];
|
| Línea 6194... |
Línea 6334... |
| 6194 |
}
|
6334 |
}
|
| Línea 6195... |
Línea 6335... |
| 6195 |
|
6335 |
|
| 6196 |
/**
|
6336 |
/**
|
| 6197 |
* Destroys all caches marked as volatile
|
6337 |
* Destroys all caches marked as volatile
|
| 6198 |
*
|
6338 |
*
|
| 6199 |
* This function is static and works in conjunction with the static volatilecaches
|
- |
|
| 6200 |
* property of navigation cache.
|
6339 |
* This function is static and works with the static volatilecaches property of navigation cache.
|
| 6201 |
* Because this function is static it manually resets the cached areas back to an
|
- |
|
| 6202 |
* empty array.
|
6340 |
* It manually resets the cached areas back to an empty array.
|
| 6203 |
*/
|
6341 |
*/
|
| 6204 |
public static function destroy_volatile_caches() {
|
- |
|
| 6205 |
global $SESSION;
|
6342 |
public static function destroy_volatile_caches() {
|
| - |
|
6343 |
if (is_array(self::$volatilecaches) && count(self::$volatilecaches) > 0) {
|
| 6206 |
if (is_array(self::$volatilecaches) && count(self::$volatilecaches)>0) {
|
6344 |
$cache = cache::make('core', 'navigation_cache');
|
| 6207 |
foreach (self::$volatilecaches as $area) {
|
6345 |
foreach (self::$volatilecaches as $area) {
|
| 6208 |
$SESSION->navcache->{$area} = array();
|
6346 |
$cache->delete($area);
|
| 6209 |
}
|
- |
|
| 6210 |
} else {
|
6347 |
}
|
| 6211 |
$SESSION->navcache = new stdClass;
|
6348 |
self::$volatilecaches = null;
|
| 6212 |
}
|
6349 |
}
|
| 6213 |
}
|
6350 |
}
|