diff options
-rw-r--r-- | CHANGELOG.txt | 1 | ||||
-rw-r--r-- | modules/menu.module | 72 | ||||
-rw-r--r-- | modules/menu/menu.module | 72 |
3 files changed, 145 insertions, 0 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 83edc259e..d113ddbf3 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -10,6 +10,7 @@ Drupal x.x.x, xxxx-xx-xx (development version) - usability: * reworked the 'request new password' functionality. * reworked the node edit form. + * improve menu system integration. * added support for auto-complete forms (AJAX). * reorganized some settings pages. - profiles: diff --git a/modules/menu.module b/modules/menu.module index 3cd6a58ee..729864a70 100644 --- a/modules/menu.module +++ b/modules/menu.module @@ -92,6 +92,40 @@ function menu_block($op = 'list', $delta = 0) { } /** + * Implementation of hook_nodeapi(). + */ +function menu_nodeapi(&$node, $op) { + + if (user_access('administer menu')) { + switch ($op) { + case 'form post': + $edit = $_POST['edit']; + $edit['nid'] = $node->nid; + return menu_node_form($edit); + break; + + case 'insert': + case 'update': + if ($node->menu['delete']) { + menu_node_form_delete($node); + menu_rebuild(); + } + elseif ($node->menu['title']) { + $node->menu['path'] = ($node->menu['path']) ? $node->menu['path'] : "node/$node->nid"; + menu_edit_item_save($node->menu); + menu_rebuild(); + } + break; + + case 'delete': + menu_node_form_delete($node); + menu_rebuild(); + break; + } + } +} + +/** * Implementation of hook_perm(). */ function menu_perm() { @@ -502,4 +536,42 @@ function menu_parent_options($mid, $pid = 0, $depth = 0) { return $options; } +/** + * Add menu item fields to the node form. + */ +function menu_node_form($edit = array()) { + $item = array(); + if ($edit['nid'] > 0) { + $item = db_fetch_array(db_query("SELECT * FROM {menu} WHERE path = 'node/%d'", $edit['nid'])); + if (is_array($edit['menu'])) { + $item = ($_POST['op'] == t('Preview')) ? array_merge($item, $edit['menu']) : array_merge($edit['menu'], $item); + } + } + + $group = form_textfield(t('Title'), 'menu][title', $item['title'], 60, 128, t('The name to display for this link.')); + // Generate a list of possible parents (not including this item or descendants). + $options = menu_parent_options($edit['mid']); + $group .= form_select(t('Parent item'), 'menu][pid', $item['pid'], $options); + $group .= form_hidden('menu][description', $item['description']); + $group .= form_hidden('menu][path', $item['path']); + $group .= form_hidden('menu][weight', ($item['weight']) ? $item['weight'] : 0); + $group .= form_hidden('menu][mid', ($item['mid']) ? $item['mid'] : 0); + $group .= form_hidden('menu][type', ($item['type']) ? $item['type'] : MENU_CUSTOM_ITEM); + + if ($item['mid'] > 0) { + $group .= form_checkbox(t('Check to delete this menu item.'), 'menu][delete', 1, $item['delete'], null); + } + $form = form_group_collapsible(t('Menu item settings'), $group, TRUE); + + return $form; +} + +/** + * Remove the menu item. + */ +function menu_node_form_delete($node) { + if (db_query("DELETE FROM {menu} WHERE path = 'node/%s'", $node->nid)) { + drupal_set_message(t('The menu item has been removed.')); + } +} ?> diff --git a/modules/menu/menu.module b/modules/menu/menu.module index 3cd6a58ee..729864a70 100644 --- a/modules/menu/menu.module +++ b/modules/menu/menu.module @@ -92,6 +92,40 @@ function menu_block($op = 'list', $delta = 0) { } /** + * Implementation of hook_nodeapi(). + */ +function menu_nodeapi(&$node, $op) { + + if (user_access('administer menu')) { + switch ($op) { + case 'form post': + $edit = $_POST['edit']; + $edit['nid'] = $node->nid; + return menu_node_form($edit); + break; + + case 'insert': + case 'update': + if ($node->menu['delete']) { + menu_node_form_delete($node); + menu_rebuild(); + } + elseif ($node->menu['title']) { + $node->menu['path'] = ($node->menu['path']) ? $node->menu['path'] : "node/$node->nid"; + menu_edit_item_save($node->menu); + menu_rebuild(); + } + break; + + case 'delete': + menu_node_form_delete($node); + menu_rebuild(); + break; + } + } +} + +/** * Implementation of hook_perm(). */ function menu_perm() { @@ -502,4 +536,42 @@ function menu_parent_options($mid, $pid = 0, $depth = 0) { return $options; } +/** + * Add menu item fields to the node form. + */ +function menu_node_form($edit = array()) { + $item = array(); + if ($edit['nid'] > 0) { + $item = db_fetch_array(db_query("SELECT * FROM {menu} WHERE path = 'node/%d'", $edit['nid'])); + if (is_array($edit['menu'])) { + $item = ($_POST['op'] == t('Preview')) ? array_merge($item, $edit['menu']) : array_merge($edit['menu'], $item); + } + } + + $group = form_textfield(t('Title'), 'menu][title', $item['title'], 60, 128, t('The name to display for this link.')); + // Generate a list of possible parents (not including this item or descendants). + $options = menu_parent_options($edit['mid']); + $group .= form_select(t('Parent item'), 'menu][pid', $item['pid'], $options); + $group .= form_hidden('menu][description', $item['description']); + $group .= form_hidden('menu][path', $item['path']); + $group .= form_hidden('menu][weight', ($item['weight']) ? $item['weight'] : 0); + $group .= form_hidden('menu][mid', ($item['mid']) ? $item['mid'] : 0); + $group .= form_hidden('menu][type', ($item['type']) ? $item['type'] : MENU_CUSTOM_ITEM); + + if ($item['mid'] > 0) { + $group .= form_checkbox(t('Check to delete this menu item.'), 'menu][delete', 1, $item['delete'], null); + } + $form = form_group_collapsible(t('Menu item settings'), $group, TRUE); + + return $form; +} + +/** + * Remove the menu item. + */ +function menu_node_form_delete($node) { + if (db_query("DELETE FROM {menu} WHERE path = 'node/%s'", $node->nid)) { + drupal_set_message(t('The menu item has been removed.')); + } +} ?> |