Drupal _menu_site_is_offline

这个函数是判断你的网站是否处理维护状态,如果开启了维护状态。并且没有权限,就直接显示了维护的信息。如果我有权限就会继续运行,返回true和false ,
设置:

admin/config/development/maintenance

如果要直接判断你的网站是否维护状态。可以直接用:

variable_get('maintenance_mode', 0)

此函数在 includes/bootstrap.inc menu_execute_active_handler函数里面用到

function _menu_site_is_offline($check_only = FALSE) {
  // Check if site is in maintenance mode.
  //使用variable_get 获取系统设置
  if (variable_get('maintenance_mode', 0)) {
    //判断用户是否有权限,如果没有权限就直接显示维护状态的信息
    //如果有权限将继续执行
    if (user_access('access site in maintenance mode')) {
      // Ensure that the maintenance mode message is displayed only once
      // (allowing for page redirects) and specifically suppress its display on
      // the maintenance mode settings page.
      //如果你在设置维护模式的这个页面就不提示:你当前处于维护模式状态。点击这个url开启大概是这个意思了
      if (!$check_only && $_GET['q'] != 'admin/config/development/maintenance') {
        if (user_access('administer site configuration')) {
          drupal_set_message(t('Operating in maintenance mode. Go online.', array('@url' => url('admin/config/development/maintenance'))), 'status', FALSE);
        }
        else {
          drupal_set_message(t('Operating in maintenance mode.'), 'status', FALSE);
        }
      }
    }
    else {
      return TRUE;
    }
  }
  return FALSE;
}

Views_page

/**
显示一个views
第一个参数$display_id好像是系统生成的
*/
function views_page($name, $display_id) {
  $args = func_get_args();
  // Remove $name and $display_id from the arguments.
  array_shift($args);
  array_shift($args);

  // Load the view and render it.
  //获取整个views
  if ($view = views_get_view($name)) {
    显示指定的$display_id,将参数传过去
    return $view->execute_display($display_id, $args);
  }

  // Fallback; if we get here no view was found or handler was not valid.
  return MENU_NOT_FOUND;
}

module_invoke_all

/**
 * @param return Array
 * 调用指定所有模块中有 hook_$hook的方法,并将后面的参数传过去.执行后返回数组
 */
function module_invoke_all($hook) {
  //接收传过来的参数
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);  //因为args[0]是要调用的hook_name,所以要删除掉.现在$args变量就只剩下纯的参数了
  $return = array();
  
  /**
   * 循环所有模块中带有指定$hook的方法,调用并且把参数传过去
   * 
   * 执行后将数据返回
   */
  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }

  return $return;
}

module_hook_info


/**
 * Retrieve a list of what hooks are explicitly declared.
 * 
 * 此方法会查找所有启用模块带 模块名_hook_info的方法.  将方法返回数组合并. 
 * 接着继续循环所有启用模块带 模块名_hook_info_alter的方法. 将 模块名_hook_info得到的值传进去过滤
 * 缓存起来. 返回数组  下次直接读取缓存
 */
function module_hook_info() {
  // This function is indirectly invoked from bootstrap_invoke_all(), in which
  // case common.inc, subsystems, and modules are not loaded yet, so it does not
  // make sense to support hook groups resp. lazy-loaded include files prior to
  // full bootstrap.
  if (drupal_bootstrap(NULL, FALSE) != DRUPAL_BOOTSTRAP_FULL) {
    return array();
  }
  
  /**
   * 读取缓存之前先查看静态变量里面是否已经读过了.如果读过就直接返回
   */
  $hook_info = &drupal_static(__FUNCTION__);

  if (!isset($hook_info)) {
    $hook_info = array();
    
    /**
     * 如果静态变量不存在就读取缓存
     */
    $cache = cache_get('hook_info', 'cache_bootstrap');
    if ($cache === FALSE) {
        
      //如果缓存不存在就读取 模块名_hook_info的方法.  将方法返回数组合并
      // Rebuild the cache and save it.
      // We can't use module_invoke_all() here or it would cause an infinite
      // loop.
      foreach (module_list() as $module) {
        $function = $module . '_hook_info';
        if (function_exists($function)) {
          $result = $function();
          if (isset($result) && is_array($result)) {
            /**
             * array_merge_recursive 递归地合并一个或者多个数组.如果存在相同的键不会被覆盖.而是加在后面
             * http://cn.php.net/manual/zh/function.array-merge-recursive.php
             */
            $hook_info = array_merge_recursive($hook_info, $result);
          }
        }
      }
      
      /**
       * 寻找是否有 模块名_hook_info_alter的方法. 将 模块名_hook_info得到的值传进去过滤
       * 这里也是给用户留接口.使用户可以进行过滤
       */
      // We can't use drupal_alter() for the same reason as above.
      foreach (module_list() as $module) {
        $function = $module . '_hook_info_alter';
        if (function_exists($function)) {
          $function($hook_info);
        }
      }
      
      //设置缓存
      cache_set('hook_info', $hook_info, 'cache_bootstrap');
    }
    else {
      $hook_info = $cache->data;
    }
  }
  
  /**
   * 返回数据
   */
  return $hook_info;
}