You are here

function nodequeue_contextual_links_view_alter in Nodequeue 7.2

Implements hook_contextual_links_view_alter().

File

./nodequeue.module, line 445
Maintains queues of nodes in arbitrary order.

Code

function nodequeue_contextual_links_view_alter(&$element, $items) {

  // Bail if the user doesn't have access to edit nodequeues.
  if (!user_access('manipulate queues')) {
    return;
  }
  if (!variable_get('nodequeue_show_contextual_links', TRUE)) {
    return;
  }

  // Contextual links for Blocks.
  $has_context = isset($element['#element']['#contextual_links']);
  if ($has_context) {
    $empty_context = empty($element['#element']['#contextual_links']['views_ui']);
    if ($empty_context) {
      return;
    }
    $views_info = $element['#element']['#contextual_links'];
  }

  // Contextual links for Views.
  $has_views_context = isset($element['#element']['#views_contextual_links_info']);
  if ($has_views_context) {
    $empty_views_context = empty($element['#element']['#views_contextual_links_info']['views_ui']);
    if ($empty_views_context) {
      return;
    }
    $views_info = $element['#element']['#views_contextual_links_info'];
  }

  // Contextual links for Context blocks, or DS blocks.
  $has_views_content_context = isset($element['#element']['content']['#views_contextual_links_info']);
  if ($has_views_content_context) {
    $empty_views_content_context = empty($element['#element']['content']['#views_contextual_links_info']['views_ui']);
    if ($empty_views_context) {
      return;
    }
    $views_info = $element['#element']['content']['#views_contextual_links_info'];
  }

  // Return if there is no view info.
  if (!isset($views_info)) {
    return;
  }
  $display_id = $views_info['views_ui']['view_display_id'];
  $view_name = $views_info['views_ui']['view_name'];
  $view = views_get_view($view_name, TRUE);

  // Return if the view wasn't saved yet or has no display objects.
  if (empty($view)) {
    return;
  }
  $view
    ->build($display_id);
  $nodequeue_rels = array(
    'nodequeue_handler_relationship_nodequeue',
  );
  $subqueue_arg_titles = array(
    'Subqueue reference',
    'Subqueue reference (optional)',
  );
  $elview = $element['#element']['#views_contextual_links_info']['views_ui']['view'];
  $relationship = '';
  if (!empty($elview->display_handler->handlers['argument']['name']->relationship)) {
    $relationship = $elview->display_handler->handlers['argument']['name']->relationship;
  }
  if (!empty($relationship) && $relationship == 'nodequeue_nodes_node') {
    $argument = $elview->display_handler->handlers['argument']['name']->argument;
  }

  // Cycle through all the relationships to find ones provided by nodequeue.
  // We'll use this as a trigger to attach the links.
  foreach ($view->relationship as $rel) {
    if (!in_array(get_class($rel), $nodequeue_rels, TRUE)) {
      continue;
    }
    foreach ($rel->options['names'] as $queue_name) {
      if (gettype($queue_name) != 'string') {
        if (empty($argument)) {
          continue;
        }
        else {
          $queue_name = $argument;
        }
      }
      $qid_map = nodequeue_get_qid_map();
      $qid = $qid_map[$queue_name];
      $queue = nodequeue_load($qid);
      $element['#links'][$queue_name] = array(
        'title' => t('Edit queue'),
        'href' => 'admin/structure/nodequeue/' . $qid . '/view',
        'query' => array(
          'destination' => current_path(),
        ),
      );

      // Cycle through all arguments to find ones that limit us by subqueue.
      // If we find some, add further links to subqueues.
      foreach ($view->argument as $arg) {
        $is_subqueue_arg = $arg->options['relationship'] == $rel->options['id'] && in_array($arg->definition['title'], $subqueue_arg_titles, TRUE);
        if (!$is_subqueue_arg) {
          continue;
        }

        // Provide contextual links for each of the subqueues.
        $subqueues = nodequeue_load_subqueues_by_reference(array(
          $qid => $arg->value,
        ));
        foreach ($subqueues as $sqid => $subqueue) {
          $element['#links'][$queue_name . '_' . $sqid] = array(
            'title' => t('Edit Subqueue'),
            'href' => 'admin/structure/nodequeue/' . $qid . '/view/' . $sqid,
            'query' => array(
              'destination' => current_path(),
            ),
          );
        }
      }
    }
  }
}