You are here

function noderelationships_backref_render_view in Node Relationships 6

Display a back reference view.

Parameters

$back_reference_view:

$context:

$render_view_title:

See also

noderelationships_views_pre_view()

noderelationships_customize_backref_view()

2 calls to noderelationships_backref_render_view()
noderelationships_backref_build_content in ./noderelationships.pages.inc
Build back reference content for the given node and region settings.
theme_noderelationships_formatter_default in ./noderelationships.pages.inc
Field formatter for back references view.

File

./noderelationships.pages.inc, line 107
Implementation of user land pages.

Code

function noderelationships_backref_render_view($back_reference_view, $context, $render_view_title = TRUE) {
  static $pager_element = 0;
  $referred_node =& $context['referred_node'];
  $referred_type =& $context['referred_type'];
  $referrer_type =& $context['referrer_type'];
  $field_name = $context['field_name'];

  // Load settings of the referring field.
  $referrer_field = content_fields($field_name, $referrer_type->type);
  if (empty($referrer_field)) {
    drupal_set_message(t('Could not locate %field in content type %type.', array(
      '%field' => $field_name,
      '%type' => $referrer_type->type,
    )), 'error');
    watchdog('noderelationships', 'Could not locate %field in content type %type.', array(
      '%field' => $field_name,
      '%type' => $referrer_type->type,
    ), WATCHDOG_ERROR);
    return '';
  }

  // Prepare the name of the view and display.
  if (empty($back_reference_view)) {
    $view_name = NODERELATIONSHIPS_BACKREF_VIEW_NAME;
    $display_id = 'default';
  }
  else {
    list($view_name, $display_id) = explode(':', $back_reference_view);
  }

  // Load the view and check access to the given display.
  if (!($view = views_get_view($view_name)) || !$view
    ->access($display_id)) {
    drupal_set_message(t('Could not load the view %view:%display.', array(
      '%view' => $view_name,
      '%display' => $display_id,
    )), 'error');
    watchdog('noderelationships', 'Could not load the view %view:%display.', array(
      '%view' => $view_name,
      '%display' => $display_id,
    ), WATCHDOG_ERROR);
    return '';
  }

  // Prepare values for the view arguments as follows:
  // 0 - nid of the referred node.
  // 1 - type of the referring node.
  // 2 - name of the nodereference field in the referring type.
  $view_args = array(
    $referred_node->nid,
    $referrer_type->type,
    $field_name,
  );

  // Assign a different pager element for each view in the same page request.
  $view->display_handler
    ->override_option('pager_element', $pager_element);

  // Make sure the view is completely valid.
  $errors = $view
    ->validate();
  if (is_array($errors)) {
    foreach ($errors as $error) {
      drupal_set_message($error, 'error');
    }
    return '';
  }

  // Execute and render the view in preview mode. Note that we only generate
  // output if the executed view query returns any result.
  $view->preview = TRUE;
  $view
    ->pre_execute($view_args);
  $view
    ->execute($display_id);
  if (!empty($view->result)) {
    $content = $view->display_handler
      ->preview();
  }
  $view
    ->post_execute();
  if (empty($view->result)) {
    return '';
  }

  // Now that we have output for this view, we need to increase the pager
  // element counter.
  $pager_element++;

  // Find out a title for this view.
  if ($render_view_title) {

    // If the view title is empty (default), then we'll generate one.
    $view_title = $view
      ->get_title();
    if (empty($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_view_title', $context, $arguments);
    }
  }
  else {
    $view_title = '';
  }
  return theme('noderelationships_backref_view', $view_title, $content);
}