diff --git a/og_menu.module b/og_menu.module index 4aa01dd..2e29da8 100644 --- a/og_menu.module +++ b/og_menu.module @@ -182,9 +182,9 @@ function og_menu_theme($existing, $type, $theme, $path) { function theme_og_menu_node_form($form) { $menus = og_menu_get_menus(); foreach ($menus as $menu) { - $settings['menus'][$menu->mname] = $menu->gid; + $settings['menus'][$menu->menu_name] = $menu->gid; } - $settings['admin'] = user_access('administer menu'); + $settings['admin'] = user_access('administer og menu'); drupal_add_js(array('og_menu' => $settings), 'setting'); drupal_add_js(drupal_get_path('module', 'og_menu') . '/og_menu.js'); } @@ -207,18 +207,21 @@ function og_menu_block_view($delta = '') { $block = array(); if ($delta == 'og_single_menu_block') { $context = og_context(); - $group = isset($context->gid) ? $context->gid : 0; - $menus = og_menu_get_menus(array($group)); + + if(!isset($context->gid)) + return; // skip, we are not in a group + + $menus = og_menu_get_menus(array($context->gid)); $menu = array_shift($menus); if ($menu) { if (variable_get('og_menu_block_links', FALSE)) { - $block['subject'] = l($menu->mtitle, 'node/' . $context->etid); + $block['subject'] = l($menu->title, 'node/' . $context->etid); } else { - $block['subject'] = check_plain($menu->mtitle); + $block['subject'] = check_plain($menu->title); } - $block['content'] = menu_tree($menu->mname); + $block['content'] = menu_tree($menu->menu_name); } } if ($delta == 'og_multi_menu_block') { // @todo Test this!! @@ -227,19 +230,22 @@ function og_menu_block_view($delta = '') { $gids = array(); if ($node) { if (og_is_group_content_type('node', $node->type)) { - $nodegroups = og_load_multiple(og_get_entity_groups('node', $node)); - foreach ($nodegroups as $ng) - $gids[] = $ng->gid; + $nodegroups = og_get_entity_groups('node', $node); + if (!empty($nodegroups)) { + $gids = $nodegroups; + } } elseif (og_is_group_type('node', $node->type)) { - $group = og_get_group('node', $node->nid); - $gids = array($group->gid); + $groups = og_get_group_ids('node', array($node->nid)); + $gids = array($groups[$node->nid]); } } // If no group was found, fallback to the regular og_get_group_context // function. Unfortunately, this function only returns one group. if (empty($gids)) { $group = og_menu_get_context(); + // if no group was found return no block + if($group == 0) return; $gids = array($group); } $menus = og_menu_get_menus($gids); @@ -248,7 +254,7 @@ function og_menu_block_view($delta = '') { } $block['content'] = ''; foreach ($menus as $menu) { - $block['content'] .= render(menu_tree($menu->mname)); + $block['content'] .= render(menu_tree($menu->menu_name)); } } @@ -279,7 +285,7 @@ function og_menu_field_extra_fields() { */ function og_menu_get_context() { $context = og_context(); - return (isset($context->gid) ? $context->gid : 0); + return (isset($context['gid']) ? $context['gid'] : 0); } /** @@ -304,8 +310,8 @@ function og_menu_form_node_form_alter(&$form, &$form_state) { if (!empty($menus)) { foreach ($menus as $menu) { - $list[$menu->mname] = $menu->mtitle; - $settings[$menu->mname] = $menu->gid; + $list[$menu->menu_name] = $menu->title; + $settings[$menu->menu_name] = $menu->gid; } // If user has administer menu permission, also show other menu options. if (user_access('administer menu')) { @@ -326,11 +332,6 @@ function og_menu_form_node_form_alter(&$form, &$form_state) { $merged_list = $list; } - $menus = og_menu_get_menus(); - foreach ($menus as $menu) { - $settings[$menu->mname] = $menu->gid; - } - // Menu parent options will format the list in a way Drupal expects and give children, etc $options = menu_parent_options($merged_list, array('mlid' => 0)); if ($nid = $form['nid']['#value']) { @@ -387,9 +388,9 @@ function og_menu_form_menu_edit_menu_alter(&$form, &$form_state) { $values = array(); // Populate gids if (user_access('administer organic groups')) { - $result = db_query("SELECT gid, label FROM {og} WHERE entity_type='node'"); + $result = db_query("SELECT ogm.gid, n.title FROM {og_membership} ogm LEFT JOIN {node} n ON n.nid = ogm.gid WHERE entity_type='node'"); foreach ($result as $group) { - $options[$group->gid] = $group->label; + $options[$group->gid] = $group->title; } } else { @@ -466,14 +467,9 @@ function og_menu_form_menu_delete_menu_confirm_alter(&$form, &$form_state) { */ function og_menu_node_prepare($node) { // $node is a group type. - if (og_is_group_type('node', $node->type)) { - $node->og_menu = og_menu_get_menus(); - if (!empty($node->nid)) { - $og = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); - if (isset($og->gid)) { - $node->og_menu = og_menu_get_menus(array($og->gid)); - } - } + if (og_is_group_type('node', $node->type) && !empty($node->nid)) { + $gids = og_get_group_ids('node', array($node->nid)); + $node->og_menu = og_menu_get_menus(array($gids[$node->nid])); } // $node is not a new node and is a group content type, menu link is not set. // @todo This used to exclude users with user_access('administer menu'), test the consequences of this change. @@ -505,19 +501,17 @@ function og_menu_node_prepare($node) { } /** - * Implementation of hook_node_insert() + * Implementation of hook_group_insert() */ -function og_menu_node_insert($node) { - if (og_is_group_type('node', $node->type)) { - $og = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); - if ($node->og_menu) { - menu_save(array( - 'menu_name' => 'menu-og-' . $og->gid, - 'title' => $node->title, - 'description' => t('OG Menu for') . ' ' . check_plain($node->title), - )); - og_menu_update_menu('menu-og-' . $og->gid, $og->gid); - } + +function og_menu_group_insert($og_group) { + if (!empty($og_group->gid)) { + menu_save(array( + 'menu_name' => 'menu-og-' . $og_group->gid, + 'title' => $og_group->label, + 'description' => t('OG Menu for') . ' ' . check_plain($og_group->label), + )); + og_menu_update_menu('menu-og-' . $og_group->gid, $og_group->gid); } } @@ -526,26 +520,27 @@ function og_menu_node_insert($node) { */ function og_menu_node_update($node) { if (og_is_group_type('node', $node->type)) { - $og = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); - if ($node->og_menu) { - $menu = og_menu_get_menus(array($og->gid)); + if ( $node->og_menu) { + $group = og_get_group('node',$node->nid); + $menu = og_menu_get_menus(array($group->gid)); if (empty($menu)) { menu_save(array( - 'menu_name' => 'menu-og-' . $og->gid, - 'title' => $node->title, - 'description' => t('OG Menu for') . ' ' . check_plain($node->title), + 'menu_name' => 'menu-og-' . $group->gid, + 'title' => $group->label, + 'description' => t('OG Menu for') . ' ' . check_plain($group->label), )); - og_menu_update_menu('menu-og-' . $og->gid, $og->gid); + og_menu_update_menu('menu-og-' . $group->gid, $group->gid); } } else { // We can't assume that the menu name is 'menu-og-[gid]' - we need to look up menus associated with this group - $result = db_query('SELECT menu_name FROM {og_menu} WHERE gid = :gid', array(':gid' => $og->gid))->fetchCol(); + $group = og_get_group('node', $node->nid); + $result = db_query('SELECT menu_name FROM {og_menu} WHERE gid = :gid', array(':gid' => $group->gid))->fetchCol(); foreach ($result as $menu_name) { menu_delete(array( 'menu_name' => $menu_name, - 'title' => $node->title, - 'description' => t('OG Menu for') . ' ' . check_plain($node->title), + 'title' => $group->label, + 'description' => t('OG Menu for') . ' ' . check_plain($group->label), )); og_menu_update_menu($menu_name); } @@ -558,13 +553,12 @@ function og_menu_node_update($node) { */ function og_menu_node_delete($node) { if (og_is_group_type('node', $node->type)) { + $group = og_get_group('node', $node->nid); /* We need to be careful here. As users can create menu of whatever name, we can't just delete from menu_custom looking for * 'menu-og-' . [gid] - we need the gid of the group being deleted, see if its an og assosiated menu from og_menu and then from * that menu name, delete it. */ - $gid = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING))->gid; - - $results = db_query('SELECT menu_name FROM {og_menu} WHERE gid = :gid', array(':gid' => $gid))->fetchCol(); + $results = db_query('SELECT menu_name FROM {og_menu} WHERE gid = :gid', array(':gid' => $group->gid))->fetchCol(); // @todo This can be replaced with two db_delete queries foreach ($results as $menu_name) { @@ -601,7 +595,7 @@ function og_menu_node_form_validate($form, &$form_state) { } foreach ($menus as $menu) { - if ($menu->mname == $parent) { + if ($menu->menu_name == $parent) { // Check if user has access to the chosen menu parent $has_menu_access = TRUE; // Check if menu belongs to one of the selected groups @@ -640,24 +634,29 @@ function og_menu_get_menus($gids = NULL, $user = NULL) { if (!$user) { global $user; } + if (!$gids) { - $nodegroups = og_load_multiple(og_get_entity_groups('user', $user)); - foreach ($nodegroups as $ng) { - $gids[] = $ng->gid; + $nodegroups = og_get_entity_groups('user'); + if (!empty($nodegroups)) { + $gids = $nodegroups; } } + $menus = array(); if ($gids) { - // @todo Convert this query to use db_select(). - $result = db_query("SELECT - om.gid, - om.menu_name as omname, - m.menu_name as mname, - m.title as mtitle - FROM {og_menu} om - LEFT JOIN {menu_custom} m ON om.menu_name = m.menu_name - WHERE om.gid IN (:gids) - ORDER BY mtitle", array(':gids' => $gids)); + + foreach ($gids as $gid) { + if(!og_user_access($gid, 'administer og menu',$user)) { + unset($gids[$gid]); + } + } + + $query = db_select('og_menu', 'om'); + $query->join('menu_custom', 'm', 'm.menu_name = om.menu_name'); + $query->fields('om', array('gid', 'menu_name')); + $query->fields('m', array('title')); + $query->condition('gid', $gids, 'IN'); + $result = $query->execute(); foreach ($result as $menu) { $menus[] = $menu; } @@ -683,11 +682,10 @@ function og_menu_access($node, $menu = NULL, $op = NULL) { elseif (user_access('administer menu')) { return TRUE; } - elseif (user_access('administer og menu') || og_user_access_by_entity('administer og menu', 'node', $node->nid)) { + elseif (user_access('administer og menu') || og_user_access_entity('administer og menu', 'node', $node)) { if ($op == 'new-menu') { - $group = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); $query = db_select('og_menu', 'ogm'); - $query->condition('ogm.gid', $group->gid, '='); + $query->condition('ogm.gid', $node->nid, '='); $count = $query->countQuery()->execute()->fetchField(); $max = variable_get('og_menu_max_menus_per_group', 1); if ($max > 0 && $count >= $max) { @@ -823,14 +821,15 @@ function og_menu_menu_alter(&$items) { */ function _og_menu_autocomplete($string) { $matches = array(); - $query = db_select('og', 'og'); - $return = $query - ->fields('og', array('gid', 'label')) - ->condition('og.label', '%' . db_like($string) . '%', 'LIKE') - ->range(0, 10) - ->execute(); + $query = db_select('og_membership', 'og'); + $query->join('node', 'n', 'n.nid = og.gid'); + $return = $query->fields('og', array('gid')) + ->fields('n', array('title')) + ->condition('n.title', '%' . db_like($string) . '%', 'LIKE') + ->range(0, 10) + ->execute(); foreach ($return as $row) { - $matches[$row->label . " [gid:$row->gid]"] = '
' . $row->label . '
'; + $matches[$row->title . " [gid:$row->gid]"] = '
' . $row->title. '
'; } // return for JS drupal_json_output($matches); diff --git a/og_menu.pages.inc b/og_menu.pages.inc index 41bc024..986f6bc 100644 --- a/og_menu.pages.inc +++ b/og_menu.pages.inc @@ -9,22 +9,21 @@ * Menu callback which shows an overview page of all the custom menus in user's groups and their descriptions. */ function og_menu_overview_page($node) { - $gid = og_get_group_ids('node', array($node->nid), FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); - $gid = $gid[$node->nid]; - // Set the title of the page. drupal_set_title(t('List menus for @title', array('@title' => $node->title)), PASS_THROUGH); + $group = og_get_group('node', $node->nid); + $result = db_query(" SELECT om.gid, om.menu_name as name, m.title as title, m.description as description FROM {og_menu} om LEFT JOIN {menu_custom} m ON om.menu_name = m.menu_name WHERE om.gid = :gid - ORDER BY title", array(':gid' => $gid)); + ORDER BY title", array(':gid' => $group->gid)); $header = array(t('Title'), array('data' => t('Operations'), 'colspan' => '3')); $rows = array(); foreach ($result as $menu) { - $row = array(theme('menu_admin_overview', array('title' => $menu->title, 'name' => $menu->name, 'description' => $menu->description))); + $row = array(theme('menu_admin_overview', array('title' => $menu->title, 'name' => $menu->name))); $row[] = array('data' => l(t('list links'), 'node/' . $node->nid . '/og_menu/' . $menu->name)); $row[] = array('data' => l(t('edit menu'), 'node/' . $node->nid . '/og_menu/' . $menu->name . '/edit')); $row[] = array('data' => l(t('add link'), 'node/' . $node->nid . '/og_menu/' . $menu->name . '/add')); @@ -45,7 +44,7 @@ function og_menu_overview_page($node) { function og_menu_edit_menu_form($form, &$form_state, $type, $menu = array()) { module_load_include('inc', 'menu', 'menu.admin'); $node = menu_get_object('node', 1); - $og = og_get_group('node', $node->nid, FALSE, array(OG_STATE_ACTIVE, OG_STATE_PENDING)); + $gids = og_get_group_ids('node', array($node->nid)); // Set the title of the page. switch ($type) { @@ -56,11 +55,11 @@ function og_menu_edit_menu_form($form, &$form_state, $type, $menu = array()) { break; } - // Build the form. + $form = drupal_retrieve_form('menu_edit_menu', $form_state, $type, $menu); $form['og_menu_gid'] = array( '#type' => 'value', - '#value' => $og->gid, + '#value' => $gids[$node->nid], ); // Add submit handlers. $form['#submit'][] = 'menu_edit_menu_submit'; @@ -162,9 +161,9 @@ function og_menu_edit_item_form($form, &$form_state, $type, $item, $menu, $node) module_load_include('inc', 'menu', 'menu.admin'); $form = drupal_retrieve_form('menu_edit_item', $form_state, $form, $type, $item, $menu); $list = array(); - $menus = og_menu_get_menus(array(og_get_group('node', $node->nid)->gid)); + $menus = og_menu_get_menus(array($node->nid)); foreach ($menus as $option) { - $list[$option->mname] = $option->mtitle; + $list[$option->menu_name] = $option->menu_title; } // Set the title of the page.