Drupal hook_forms

http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_forms/7

定义form id 对应 调用的函数名

function hook_forms($form_id, $args) {
  // Simply reroute the (non-existing) $form_id 'mymodule_first_form' to
  // 'mymodule_main_form'.
  $forms['mymodule_first_form'] = array(
    'callback' => 'mymodule_main_form',
  );

  // Reroute the $form_id and prepend an additional argument that gets passed to
  // the 'mymodule_main_form' form builder function.
  $forms['mymodule_second_form'] = array(
    'callback' => 'mymodule_main_form',
    'callback arguments' => array('some parameter'),
  );

  // Reroute the $form_id, but invoke the form builder function
  // 'mymodule_main_form_wrapper' first, so we can prepopulate the $form array
  // that is passed to the actual form builder 'mymodule_main_form'.
  $forms['mymodule_wrapped_form'] = array(
    'callback' => 'mymodule_main_form',
    'wrapper_callback' => 'mymodule_main_form_wrapper',
  );

  return $forms;
}

在commerce product 模块中, 我看到有 menu 的callback是 drupal_get_form(), 并且参数是commerce_product_ui_product_form. 但是我并没有找到这个function. 最后通过搜索过终于找到它是如何定义commerce_product_ui_product_form这个form

/**
 * Implements hook_forms().
 */
function commerce_product_ui_forms($form_id, $args) {
  $forms = array();

  // Define a wrapper ID for the product add / edit form.
  $forms['commerce_product_ui_product_form'] = array(
    'callback' => 'commerce_product_product_form',
  );

  // Define a wrapper ID for the product delete confirmation form.
  $forms['commerce_product_ui_product_delete_form'] = array(
    'callback' => 'commerce_product_product_delete_form',
  );

  return $forms;
}

Drupal admin path

hook_admin_paths($path)

定义一个admin path. 当你自定义一个path为admin path以后,这个path可以使用admin theme. 并且可以使用
path_is_admin($path) 这个函数来判断它是否属于admin

http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_admin_paths/7

hook_admin_paths_alter(&$paths)

过滤admin path

hook_menu_site_status_alter

这个模块有很多作用,他可以改变你的网站的状态,比如你的网站处于维护模式,你把改变你网站的状态.再做一些判断,执行自己自定义的path。 改变你的path. 这里说到改path功能就很强了。比如你的path是views/aa 你想执行 views/bb.这个hook是个神器.

状态参考:

MENU_FOUND          #页面找到了 
MENU_NOT_FOUND      #页面没有找到,404页面,drupal_not_found函数是设置为404页面,其实就是把状态改成成这个值。
MENU_ACCESS_DENIED  #没有权限
MENU_SITE_OFFLINE   #网站处于关闭状态,维护状态
MENU_SITE_ONLINE    #在线状态

http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_menu_site_status_alter/7

function hook_menu_site_status_alter(&$menu_site_status, $path) {
  // Allow access to my_module/authentication even if site is in offline mode.
  if ($menu_site_status == MENU_SITE_OFFLINE && user_is_anonymous() && $path == 'my_module/authentication') {
    $menu_site_status = MENU_SITE_ONLINE;
  }
}