Как вытащить контекстные ссылки

mbaev 28.04.2016, 10:26

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

contextual-links-collapsed contextual-links-expanded

Для тизеров

  1. /**
  2.  * Implements hook_process_node().
  3.  */
  4. function mytheme_process_node(&$vars) {
  5.   // If display is page then menu will create in hook_process_page.
  6.   if ($vars['view_mode'] != 'full') {
  7.     $node = isset($vars['node']) ? $vars['node'] : NULL;
  8.     if (!empty($node->nid)) {
  9.       $links = menu_contextual_links('node', 'node', array($node->nid));
  10.       $menu = array();
  11.       if (!empty($links) && is_array($links)) {
  12.         foreach ($links as $key => &$link) {
  13.           if (isset($link['#link'])) {
  14.             $link = $link['#link'];
  15.           }
  16.           $class        = drupal_html_class($link['path']);
  17.           $menu[$class] = $link;
  18.           $menu[$class] += $link['localized_options'];
  19.           unset($links[$key]);
  20.         }
  21.       }
  22.       if ($menu) {
  23.         $vars['title_prefix'][] = array(
  24.           '#theme'      => module_exists('ctools') ? 'ctools_dropdown' : 'links',
  25.           '#links'      => $menu,
  26.           '#title'      => 'Menu',
  27.           '#heading'    => array(
  28.             'text'  => t('Menu'),
  29.             'level' => 'div',
  30.             'class' => 'menu-icon',
  31.           ),
  32.         );
  33.       }
  34.     }
  35.   }
  36. }

Для страницы

  1. /**
  2.  * Implements hook_preprocess_page().
  3.  */
  4. function mytheme_preprocess_page(&$variables) {
  5.   $links   = array();
  6.   $menu    = array();
  7.   $links[] = &$variables['tabs']['#primary'];
  8.   $links[] = &$variables['tabs']['#secondary'];
  9.   $links[] = &$variables['action_links'];
  10.  
  11.   foreach ($links as &$group) {
  12.     if (!empty($group) && is_array($group)) {
  13.       foreach ($group as $key => &$link) {
  14.         if (isset($link['#link'])) {
  15.           $link = $link['#link'];
  16.         }
  17.         $class = drupal_html_class($link['path']);
  18.         $menu[$class] = $link;
  19.         $menu[$class] += $link['localized_options'];
  20.         unset($group[$key]);
  21.       }
  22.     }
  23.   }
  24.  
  25.   if (!isset($variables['page_dropdown_menu'])) {
  26.     $variables['page_dropdown_menu'] = array();
  27.   }
  28.   $variables['page_dropdown_menu'] += $menu;
  29. }

 

  1. /**
  2.  * Implements hook_process_page().
  3.  */
  4. function mytheme_process_page(&$variables) {
  5.   if (!empty($variables['page_dropdown_menu'])) {
  6.     $variables['title_prefix'] = array(
  7.       '#theme'      => module_exists('ctools') ? 'ctools_dropdown' : 'links',
  8.       '#links'      => $variables['page_dropdown_menu'],
  9.       '#title'      => 'Menu',
  10.       '#heading'    => array(
  11.         'text'  => t('Menu'),
  12.         'level' => 'div',
  13.         'class' => 'menu-icon',
  14.       ),
  15.     );
  16.   }
  17. }