/**
  * 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;
}