cms/drupal/modules/contextual/contextual.module
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * @file
       
     5  * Adds contextual links to perform actions related to elements on a page.
       
     6  */
       
     7 
       
     8 /**
       
     9  * Implements hook_help().
       
    10  */
       
    11 function contextual_help($path, $arg) {
       
    12   switch ($path) {
       
    13     case 'admin/help#contextual':
       
    14       $output = '';
       
    15       $output .= '<h3>' . t('About') . '</h3>';
       
    16       $output .= '<p>' . t('The Contextual links module displays links related to regions of pages on your site to users with <em>access contextual links</em> permission. For more information, see the online handbook entry for <a href="@contextual">Contextual links module</a>.', array('@contextual' => 'http://drupal.org/documentation/modules/contextual')) . '</p>';
       
    17       $output .= '<h3>' . t('Uses') . '</h3>';
       
    18       $output .= '<dl>';
       
    19       $output .= '<dt>' . t('Displaying contextual links') . '</dt>';
       
    20       $output .= '<dd>' . t('Contextual links are supplied by modules, to give you quick access to tasks associated with regions of pages on your site. For instance, if you have a custom menu block displayed in a sidebar of your site, the Blocks and Menus modules will supply links to configure the block and edit the menu. The Contextual links module collects these links into a list for display by your theme, and also adds JavaScript code to the page to hide the links initially, and display them when your mouse hovers over the block.') . '</dd>';
       
    21       $output .= '</dl>';
       
    22       return $output;
       
    23   }
       
    24 }
       
    25 
       
    26 /**
       
    27  * Implements hook_permission().
       
    28  */
       
    29 function contextual_permission() {
       
    30   return array(
       
    31     'access contextual links' => array(
       
    32       'title' => t('Use contextual links'),
       
    33       'description' => t('Use contextual links to perform actions related to elements on a page.'),
       
    34     ),
       
    35   );
       
    36 }
       
    37 
       
    38 /**
       
    39  * Implements hook_library().
       
    40  */
       
    41 function contextual_library() {
       
    42   $path = drupal_get_path('module', 'contextual');
       
    43   $libraries['contextual-links'] = array(
       
    44     'title' => 'Contextual links',
       
    45     'website' => 'http://drupal.org/node/473268',
       
    46     'version' => '1.0',
       
    47     'js' => array(
       
    48       $path . '/contextual.js' => array(),
       
    49     ),
       
    50     'css' => array(
       
    51       $path . '/contextual.css' => array(),
       
    52     ),
       
    53   );
       
    54   return $libraries;
       
    55 }
       
    56 
       
    57 /**
       
    58  * Implements hook_element_info().
       
    59  */
       
    60 function contextual_element_info() {
       
    61   $types['contextual_links'] = array(
       
    62     '#pre_render' => array('contextual_pre_render_links'),
       
    63     '#theme' => 'links__contextual',
       
    64     '#links' => array(),
       
    65     '#prefix' => '<div class="contextual-links-wrapper">',
       
    66     '#suffix' => '</div>',
       
    67     '#attributes' => array(
       
    68       'class' => array('contextual-links'),
       
    69     ),
       
    70     '#attached' => array(
       
    71       'library' => array(
       
    72         array('contextual', 'contextual-links'),
       
    73       ),
       
    74     ),
       
    75   );
       
    76   return $types;
       
    77 }
       
    78 
       
    79 /**
       
    80  * Implements hook_preprocess().
       
    81  *
       
    82  * @see contextual_pre_render_links()
       
    83  */
       
    84 function contextual_preprocess(&$variables, $hook) {
       
    85   // Nothing to do here if the user is not permitted to access contextual links.
       
    86   if (!user_access('access contextual links')) {
       
    87     return;
       
    88   }
       
    89 
       
    90   $hooks = theme_get_registry(FALSE);
       
    91 
       
    92   // Determine the primary theme function argument.
       
    93   if (!empty($hooks[$hook]['variables'])) {
       
    94     $keys = array_keys($hooks[$hook]['variables']);
       
    95     $key = $keys[0];
       
    96   }
       
    97   elseif (!empty($hooks[$hook]['render element'])) {
       
    98     $key = $hooks[$hook]['render element'];
       
    99   }
       
   100   if (!empty($key) && isset($variables[$key])) {
       
   101     $element = $variables[$key];
       
   102   }
       
   103 
       
   104   if (isset($element) && is_array($element) && !empty($element['#contextual_links'])) {
       
   105     // Initialize the template variable as a renderable array.
       
   106     $variables['title_suffix']['contextual_links'] = array(
       
   107       '#type' => 'contextual_links',
       
   108       '#contextual_links' => $element['#contextual_links'],
       
   109       '#element' => $element,
       
   110     );
       
   111     // Mark this element as potentially having contextual links attached to it.
       
   112     $variables['classes_array'][] = 'contextual-links-region';
       
   113   }
       
   114 }
       
   115 
       
   116 /**
       
   117  * Build a renderable array for contextual links.
       
   118  *
       
   119  * @param $element
       
   120  *   A renderable array containing a #contextual_links property, which is a
       
   121  *   keyed array. Each key is the name of the implementing module, and each
       
   122  *   value is an array that forms the function arguments for
       
   123  *   menu_contextual_links(). For example:
       
   124  *   @code
       
   125  *     array('#contextual_links' => array(
       
   126  *       'block' => array('admin/structure/block/manage', array('system', 'navigation')),
       
   127  *       'menu' => array('admin/structure/menu/manage', array('navigation')),
       
   128  *     ))
       
   129  *   @endcode
       
   130  *
       
   131  * @return
       
   132  *   A renderable array representing contextual links.
       
   133  *
       
   134  * @see menu_contextual_links()
       
   135  * @see contextual_element_info()
       
   136  */
       
   137 function contextual_pre_render_links($element) {
       
   138   // Retrieve contextual menu links.
       
   139   $items = array();
       
   140   foreach ($element['#contextual_links'] as $module => $args) {
       
   141     $items += menu_contextual_links($module, $args[0], $args[1]);
       
   142   }
       
   143 
       
   144   // Transform contextual links into parameters suitable for theme_link().
       
   145   $links = array();
       
   146   foreach ($items as $class => $item) {
       
   147     $class = drupal_html_class($class);
       
   148     $links[$class] = array(
       
   149       'title' => $item['title'],
       
   150       'href' => $item['href'],
       
   151     );
       
   152     // @todo theme_links() should *really* use the same parameters as l().
       
   153     $item['localized_options'] += array('query' => array());
       
   154     $item['localized_options']['query'] += drupal_get_destination();
       
   155     $links[$class] += $item['localized_options'];
       
   156   }
       
   157   $element['#links'] = $links;
       
   158 
       
   159   // Allow modules to alter the renderable contextual links element.
       
   160   drupal_alter('contextual_links_view', $element, $items);
       
   161 
       
   162   // If there are no links, tell drupal_render() to abort rendering.
       
   163   if (empty($element['#links'])) {
       
   164     $element['#printed'] = TRUE;
       
   165   }
       
   166 
       
   167   return $element;
       
   168 }
       
   169