'DHTML Menu', 'description' => 'Adds new menus with DHTML to reduce page refreshes', 'page callback' => 'drupal_get_form', 'page arguments' => array('dhtml_menu_settings'), 'access arguments' => array('administer site configuration'), 'file' => 'dhtml_menu.admin.inc', ); return $items; } /** * Implementation of hook_form_alter(). * @ingroup form */ function dhtml_menu_form_block_admin_configure_alter(&$form, $form_state) { // Modify the form if it is a menu or the navigation block. if ($form['module']['#value'] == 'menu' || ($form['module']['#value'] == 'user' && $form['delta']['#value'] == 1)) { $dhtml = variable_get('dhtml_menu_menus', array()); $form['dhtml_menu'] = array( '#default_value' => !empty($dhtml[$form['module']['#value']][$form['delta']['#value']]), '#title' => t('Use the DHTML effect'), '#type' => 'checkbox', '#weight' => -3, ); $form['#submit']['_dhtml_menu_form_block_submit'] = '_dhtml_menu_form_block_submit'; } } /** * Save the DHTML options * * @ingroup form */ function _dhtml_menu_form_block_submit(&$form, $form_state) { $dhtml = variable_get('dhtml_menu_menus', array()); $dhtml[$form_state['values']['module']][$form_state['values']['delta']] = $form_state['values']['dhtml_menu']; variable_set('dhtml_menu_menus', $dhtml); } /** * Implementation of hook_preprocess(). * Change the normal behaviour ('theming') of hook_block(). * * @ingroup themable */ function dhtml_menu_preprocess_block(&$variables) { $delta = $variables['block']->delta; $module = $variables['block']->module; $dhtml = variable_get('dhtml_menu_menus', array()); // If the menu has the DHTML menu option enabled, // replace the entire block content with its DHTML equivalent if (!empty($dhtml[$module][$delta])) { $variables['block']->content = _dhtml_menu_build_block($module, $delta); } } /** * Build a specific DHTML Menu block's content. */ function _dhtml_menu_build_block($module, $delta) { $menu_name = $module == 'user' ? 'navigation' : $delta; // Retrieve menu tree data and build a DHTML menu from it. return theme('dhtml_menu_tree', menu_tree_all_data($menu_name)); } /** * Implementation of hook_theme(). */ function dhtml_menu_theme($existing, $type) { $theme['dhtml_menu_item'] = array( 'file' => 'dhtml_menu.theme.inc', 'arguments' => array('item' => array(), 'id' => NULL), ); $theme['dhtml_menu_tree'] = array( 'file' => 'dhtml_menu.theme.inc', 'arguments' => array('tree' => array(), 'parent' => NULL, 'pid' => NULL), ); return $theme; }