Однажды я столкнулся с необходимостью вытащить все action ссылки и табы из нод и сделать из них контекстные ссылки, примерно так, как это делает модуль Contextual links. Этот модуль мне не нравится потому, что он не позволяет настроить отображение контекстных ссылок только в нодах.
Итак, у нас есть какая-то своя тема или модуль и этого достаточно, чтобы вывести красивое контекстное меню для нод.

contextual-links-collapsed contextual-links-expanded

Для тизеров

<?php
/**
 * Implements hook_process_node().
 */
function mytheme_process_node(&$vars) {
  // If display is page then menu will create in hook_process_page.
  if ($vars['view_mode'] != 'full') {
    $node = isset($vars['node']) ? $vars['node'] : NULL;
    if (!empty($node->nid)) {
      $links = menu_contextual_links('node', 'node', array($node->nid));
      $menu = array();
      if (!empty($links) && is_array($links)) {
        foreach ($links as $key => &$link) {
          if (isset($link['#link'])) {
            $link = $link['#link'];
          }
          $class        = drupal_html_class($link['path']);
          $menu[$class] = $link;
          $menu[$class] += $link['localized_options'];
          unset($links[$key]);
        }
      }
      if ($menu) {
        $vars['title_prefix'][] = array(
          '#theme'      => module_exists('ctools') ? 'ctools_dropdown' : 'links',
          '#links'      => $menu,
          '#title'      => 'Menu',
          '#heading'    => array(
            'text'  => t('Menu'),
            'level' => 'div',
            'class' => 'menu-icon',
          ),
        );
      }
    }
  }
}

Для страницы

<?php
/**
 * Implements hook_preprocess_page().
 */
function mytheme_preprocess_page(&$variables) {
  $links   = array();
  $menu    = array();
  $links[] = &$variables['tabs']['#primary'];
  $links[] = &$variables['tabs']['#secondary'];
  $links[] = &$variables['action_links'];

  foreach ($links as &$group) {
    if (!empty($group) && is_array($group)) {
      foreach ($group as $key => &$link) {
        if (isset($link['#link'])) {
          $link = $link['#link'];
        }
        $class = drupal_html_class($link['path']);
        $menu[$class] = $link;
        $menu[$class] += $link['localized_options'];
        unset($group[$key]);
      }
    }
  }

  if (!isset($variables['page_dropdown_menu'])) {
    $variables['page_dropdown_menu'] = array();
  }
  $variables['page_dropdown_menu'] += $menu;
}
<?php
/**
 * Implements hook_process_page().
 */
function mytheme_process_page(&$variables) {
  if (!empty($variables['page_dropdown_menu'])) {
    $variables['title_prefix'] = array(
      '#theme'      => module_exists('ctools') ? 'ctools_dropdown' : 'links',
      '#links'      => $variables['page_dropdown_menu'],
      '#title'      => 'Menu',
      '#heading'    => array(
        'text'  => t('Menu'),
        'level' => 'div',
        'class' => 'menu-icon',
      ),
    );
  }
}

Другие посты