/** * Constructor - basic setup * * @param int $pagemenuid Page menu instance ID * @param array $links Page menu link records that belong to this page menu * @param array $data Link data for the links * @param int $firstlinkid First link ID * @return void **/ public function __construct($pagemenuid, $links = NULL, $data = NULL, $firstlinkid = false) { $this->pagemenuid = $pagemenuid; if ($links === NULL) { $links = get_records('pagemenu_links', 'pagemenuid', $this->pagemenuid); } if (!$firstlinkid) { $firstlinkid = pagemenu_get_first_linkid($this->pagemenuid); } if ($data === NULL) { if (!empty($links)) { $data = pagemenu_get_link_data($links); } else { $data = array(); } } if (!empty($links) and !empty($firstlinkid)) { $linkid = $firstlinkid; while ($linkid) { if (array_key_exists($linkid, $data)) { $datum = $data[$linkid]; } else { $datum = NULL; } $link = $links[$linkid]; $linkid = $link->nextid; $this->links[$link->id] = mod_pagemenu_link::factory($link->type, $link, $datum); } } $this->init(); }
/** * Bulk menu builder * * @param array $pagemenus An array of pagemenu course module records with id, instance and visible set * @param string $render The renderer to use for all menus * @param boolean $menuinfo True, returns menu information object. False, return menu HTML * @param int $courseid ID of the course that the menus belong * @return array **/ function pagemenu_build_menus($pagemenus, $render = 'list', $menuinfo = false, $courseid = NULL) { global $COURSE; if ($courseid === NULL) { $courseid = $COURSE->id; } /// Filter out the menus that the user cannot see $canviewhidden = has_capability('moodle/course:viewhiddenactivities', get_context_instance(CONTEXT_COURSE, $courseid)); // Load all the context instances at once $instances = get_context_instance(CONTEXT_MODULE, array_keys($pagemenus)); $pagemenuids = array(); foreach ($pagemenus as $pagemenu) { if (has_capability('mod/pagemenu:view', $instances[$pagemenu->id]) and ($pagemenu->visible or $canviewhidden)) { $pagemenuids[$pagemenu->id] = $pagemenu->instance; } } if (empty($pagemenuids)) { // Cannot see any of them return false; } /// Start fetching links and link data for ALL of the menus if (!($links = get_records_list('pagemenu_links', 'pagemenuid', implode(',', $pagemenuids)))) { // None of the menus have links... return false; } $data = pagemenu_get_link_data($links); /// Find all the first link IDs - this avoids going to the db /// for each menu or looping through all links for each module $firstlinkids = array(); foreach ($links as $link) { if ($link->previd == 0) { $firstlinkids[$link->pagemenuid] = $link->id; } } $menus = array(); foreach ($pagemenuids as $cmid => $pagemenuid) { if (array_key_exists($pagemenuid, $firstlinkids)) { $firstlinkid = $firstlinkids[$pagemenuid]; } else { $firstlinkid = false; } $menus[$cmid] = pagemenu_build_menu($pagemenuid, $render, $menuinfo, $links, $data, $firstlinkid); } return $menus; }