You are here

function noderelationships_customize_backref_view in Node Relationships 6

Apply custom configuration to the given back reference view.

1 call to noderelationships_customize_backref_view()
noderelationships_views_pre_view in ./noderelationships.module
Implementation of hook_views_pre_view().

File

./noderelationships.inc, line 898
Common functions for the noderelationships module.

Code

function noderelationships_customize_backref_view(&$view, $display_id, &$view_args, $reset_current_display = TRUE) {

  // Nothing to do if the view has already been processed.
  if (!empty($view->noderelationships_processed)) {
    return;
  }

  // Mark the view as being already processed.
  $view->noderelationships_processed = TRUE;

  // If the view is not executed with the expected number of arguments, then
  // we should abort this view.
  if (count($view_args) < 3 || !is_numeric($view_args[0])) {
    noderelationships_abort_view($view, $view_args);
    return FALSE;
  }

  // We expect to see the following arguments:
  // 0 - nid of the referred node.
  // 1 - type of the referring node.
  // 2 - name of the nodereference field in the referring type.
  list($referred_nid, $type_name, $field_name) = $view_args;

  // Load the referred node.
  if (!($referred_node = node_load($referred_nid))) {
    noderelationships_abort_view($view, $view_args);
    return FALSE;
  }

  // Load settings of the referring field.
  $referrer_field = content_fields($field_name, $type_name);
  if (empty($referrer_field)) {
    drupal_set_message(t('Could not load field information to properly customize the view %view-name.', array(
      '%view-name' => $view->name,
    )), 'error');
    watchdog('noderelationships', 'Could not load field information to properly customize the view %view-name (field: @field-name, type: @type-name).', array(
      '%view-name' => $view->name,
      '@field-name' => $field_name,
      '@type-name' => $type_name,
    ), WATCHDOG_ERROR);
    noderelationships_abort_view($view, $view_args);
    return FALSE;
  }
  drupal_add_css(drupal_get_path('module', 'noderelationships') . '/css/noderelationships.backref_views.css');

  // Load the related node types.
  $referrer_type = noderelationships_get_localized_content_type($type_name);
  $referred_type = noderelationships_get_localized_content_type($referred_node->type);

  // Get view overrides for the given nodereference field.
  $view_overrides = noderelationships_get_backref_view_overrides($view, $referrer_field);

  // Customization related to the page display.
  if ($view->display_handler->display->display_plugin == 'page') {
    $view_title = $view
      ->get_title();
    $context = array(
      'referred_node' => $referred_node,
      'referred_type' => $referred_type,
      'referrer_type' => $referrer_type,
      'referrer_field' => $referrer_field,
      'field_name' => $field_name,
    );

    // Build custom title, if nothing exists.
    if (empty($view_title)) {

      // Prepare default view title.
      $arguments = array(
        '%node-title' => $referred_node->title,
        '%referrer-type-name' => $referrer_type->name,
        '%referred-type-name' => $referred_type->name,
        '%referrer-label' => $referrer_field['widget']['label'],
      );
      $view_title = t('Back references from %referrer-label in %referrer-type-name for %referred-type-name: %node-title', $arguments);

      // Allow external modules alter the view title.
      noderelationships_alter_label($view_title, 'backref_referred_page_title', $context, $arguments);
      $view_overrides['title'] = $view_title;
    }

    // Build custom breadcrumb.
    $view->noderelationships_breadcrumb = array(
      l(t('Home'), NULL),
      l($referred_node->title, 'node/' . $referred_node->nid),
    );

    // Allow external modules alter the breadcrumb.
    drupal_alter('noderelationships_breadcrumb', $view->noderelationships_breadcrumb, $view, $view_args, $context);
  }

  // Reset the current page display so that the changes take effect.
  // This is necessary for AJAX requests and page displays managed by
  // the views menu callback.
  if ($reset_current_display && isset($view->current_display)) {
    unset($view->current_display);
  }

  // Activate the specified display.
  $view
    ->set_display($display_id);

  // Allow external modules alter the view.
  drupal_alter('noderelationships_view', $view_overrides, $view, $display_id, $view_args);

  // Apply dynamic customization to the view display.
  foreach ($view_overrides as $option => $definition) {
    $view->display_handler
      ->override_option($option, $definition);
  }

  // If this is the default backref view AND it has not been overridden, then
  // we want to customize the node title and body labels for fields in the main
  // table to match those defined in the content type settings page.
  if ($view->name == NODERELATIONSHIPS_BACKREF_VIEW_NAME && $view->type == t('Default')) {
    noderelationships_customize_views_node_fields($view, $display_id, $referrer_type);
  }
  return TRUE;
}