diff --git a/includes/menu.inc b/includes/menu.inc index 580d2ad3f78d502d77dec6d57668aa2d8f5d2a05..ecdd15075baa0cd59229333d043df318b0254dd7 100644 --- a/includes/menu.inc +++ b/includes/menu.inc @@ -190,6 +190,14 @@ * Flags for use in the "context" attribute of menu router items. */ +/** + * Internal menu flag: Invisible local task. + * + * This flag may be used for local tasks like "Delete", so custom modules and + * themes can alter the default context and expose the task by altering menu. + */ +define('MENU_CONTEXT_NONE', 0x0000); + /** * Internal menu flag: Local task should be displayed in page context. */ @@ -1859,6 +1867,7 @@ function menu_contextual_links($module, $parent_path, $args) { $data[$root_path] = db_select('menu_router', 'm') ->fields('m') ->condition('tab_parent', $router_item['tab_root']) + ->condition('context', MENU_CONTEXT_NONE, '<>') ->condition('context', MENU_CONTEXT_PAGE, '<>') ->orderBy('weight') ->orderBy('title') diff --git a/modules/block/block.admin.inc b/modules/block/block.admin.inc index e6b737c8f7a05e96f329ebdc32d232d6bbcaabcf..c605424a86311a2e0a96c532cdebb80946ee0dad 100644 --- a/modules/block/block.admin.inc +++ b/modules/block/block.admin.inc @@ -176,7 +176,8 @@ function _block_compare($a, $b) { /** * Menu callback; displays the block configuration form. */ -function block_admin_configure($form, &$form_state, $block) { +function block_admin_configure($form, &$form_state, $module, $delta) { + $block = block_load($module, $delta); $form['module'] = array( '#type' => 'value', '#value' => $block->module, @@ -426,10 +427,7 @@ function block_admin_configure_submit($form, &$form_state) { * Menu callback: display the custom block addition form. */ function block_add_block_form($form, &$form_state) { - $block = new stdClass; - $block->module = 'block'; - $block->delta = NULL; - return block_admin_configure($form, $form_state, $block); + return block_admin_configure($form, $form_state, 'block', NULL); } function block_add_block_form_validate($form, &$form_state) { @@ -511,7 +509,8 @@ function block_add_block_form_submit($form, &$form_state) { /** * Menu callback; confirm deletion of custom blocks. */ -function block_custom_block_delete($form, &$form_state, $block) { +function block_custom_block_delete($form, &$form_state, $module, $delta) { + $block = block_load($module, $delta); $custom_block = block_custom_block_get($block->delta); $form['info'] = array('#type' => 'hidden', '#value' => $custom_block['info'] ? $custom_block['info'] : $custom_block['title']); $form['bid'] = array('#type' => 'hidden', '#value' => $block->delta); diff --git a/modules/block/block.module b/modules/block/block.module index 4dd9e48551018fb782e9279da0d749a1e1cece56..306870b99de6714b0442aa9802458aa0a8127e25 100644 --- a/modules/block/block.module +++ b/modules/block/block.module @@ -88,27 +88,25 @@ function block_menu() { 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); - $items['admin/structure/block/manage/%block/%'] = array( + $items['admin/structure/block/manage/%/%'] = array( 'title' => 'Configure block', 'page callback' => 'drupal_get_form', - 'page arguments' => array('block_admin_configure', 4), - 'load arguments' => array(5), + 'page arguments' => array('block_admin_configure', 4, 5), 'access arguments' => array('administer blocks'), 'file' => 'block.admin.inc', ); - $items['admin/structure/block/manage/%block/%/configure'] = array( + $items['admin/structure/block/manage/%/%/configure'] = array( 'title' => 'Configure block', - 'load arguments' => array(5), 'type' => MENU_DEFAULT_LOCAL_TASK, 'context' => MENU_CONTEXT_INLINE, ); - $items['admin/structure/block/manage/%block/%/delete'] = array( + $items['admin/structure/block/manage/%/%/delete'] = array( 'title' => 'Delete block', 'page callback' => 'drupal_get_form', - 'page arguments' => array('block_custom_block_delete', 4), - 'load arguments' => array(5), + 'page arguments' => array('block_custom_block_delete', 4, 5), 'access arguments' => array('administer blocks'), - 'type' => MENU_CALLBACK, + 'type' => MENU_LOCAL_TASK, + 'context' => MENU_CONTEXT_NONE, 'file' => 'block.admin.inc', ); $items['admin/structure/block/add'] = array( @@ -598,22 +596,20 @@ function block_list($region) { * @param $module * Name of the module that implements the block to load. * @param $delta - * Unique ID of the block within the context of $module. + * Unique ID of the block within the context of $module. Pass NULL to return + * an empty $block object for $module. * * @return * A block object. */ function block_load($module, $delta) { - $block = db_query('SELECT * FROM {block} WHERE module = :module AND delta = :delta', - array( - ':module' => $module, - ':delta' => $delta - )) - ->fetchObject(); + if (isset($delta)) { + $block = db_query('SELECT * FROM {block} WHERE module = :module AND delta = :delta', array(':module' => $module, ':delta' => $delta))->fetchObject(); + } // If the block does not exist in the database yet return a stub block // object. - if (!$block) { + if (empty($block)) { $block = new stdClass; $block->module = $module; $block->delta = $delta;