The NAT: nid argument does not specify a revision ID when associating the term_node table. Because of this, the argument will generate a duplicate entry for every revision of a node that included the term.

While I can see that this might be useful under certain cases, I cannot figure out how to configure the view to only list current node revisions. Has anyone else worked around this case before?

Using view:

<?php

$view = new view;
$view->name = 'pavilion_articles';
$view->description = 'List of articles from a pavilion node';
$view->tag = 'Pavilions';
$view->view_php = '';
$view->base_table = 'node';
$view->is_cacheable = FALSE;
$view->api_version = '3.0-alpha1';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Defaults */
$handler = $view->new_display('default', 'Defaults', 'default');
$handler->display->display_options['access']['type'] = 'none';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'node';
$handler->display->display_options['row_options']['links'] = 1;
$handler->display->display_options['row_options']['comments'] = 0;
/* Sort criterion: Node: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Argument: NAT: Nid */
$handler->display->display_options['arguments']['nid_1']['id'] = 'nid_1';
$handler->display->display_options['arguments']['nid_1']['table'] = 'nat';
$handler->display->display_options['arguments']['nid_1']['field'] = 'nid';
$handler->display->display_options['arguments']['nid_1']['default_action'] = 'default';
$handler->display->display_options['arguments']['nid_1']['style_plugin'] = 'default_summary';
$handler->display->display_options['arguments']['nid_1']['default_argument_type'] = 'node';
$handler->display->display_options['arguments']['nid_1']['validate_type'] = 'node';
$handler->display->display_options['arguments']['nid_1']['validate_options']['types'] = array(
  'pavilion' => 'pavilion',
);
$handler->display->display_options['arguments']['nid_1']['validate_options']['access'] = 1;
$handler->display->display_options['arguments']['nid_1']['break_phrase'] = 0;
$handler->display->display_options['arguments']['nid_1']['not'] = 0;
/* Filter: Node: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = '1';
/* Filter: Node: Type */
$handler->display->display_options['filters']['type']['id'] = 'type';
$handler->display->display_options['filters']['type']['table'] = 'node';
$handler->display->display_options['filters']['type']['field'] = 'type';
$handler->display->display_options['filters']['type']['value'] = array(
  'article' => 'article',
);

/* Display: Content pane */
$handler = $view->new_display('panel_pane', 'Content pane', 'panel_pane_1');
$handler->display->display_options['defaults']['arguments'] = FALSE;
/* Argument: NAT: Nid */
$handler->display->display_options['arguments']['nid_1']['id'] = 'nid_1';
$handler->display->display_options['arguments']['nid_1']['table'] = 'nat';
$handler->display->display_options['arguments']['nid_1']['field'] = 'nid';
$handler->display->display_options['arguments']['nid_1']['default_action'] = 'default';
$handler->display->display_options['arguments']['nid_1']['style_plugin'] = 'default_summary';
$handler->display->display_options['arguments']['nid_1']['default_argument_type'] = 'node';
$handler->display->display_options['arguments']['nid_1']['validate_type'] = 'node';
$handler->display->display_options['arguments']['nid_1']['validate_options']['types'] = array(
  'pavilion' => 'pavilion',
);
$handler->display->display_options['arguments']['nid_1']['validate_options']['access'] = 1;
$handler->display->display_options['arguments']['nid_1']['break_phrase'] = 0;
$handler->display->display_options['arguments']['nid_1']['not'] = 0;
$handler->display->display_options['pane_category']['name'] = 'Pavilions';
$handler->display->display_options['pane_category']['weight'] = '0';
$handler->display->display_options['argument_input'] = array(
  'nid_1' => array(
    'type' => 'context',
    'context' => 'node.nid',
    'context_optional' => 0,
    'panel' => '0',
    'fixed' => '',
    'label' => 'NAT: Nid',
  ),
);
$translatables['pavilion_articles'] = array(
  t('Defaults'),
  t('more'),
  t('Apply'),
  t('Reset'),
  t('Sort By'),
  t('Asc'),
  t('Desc'),
  t('Items per page'),
  t('- All -'),
  t('Offset'),
  t('All'),
  t('Content pane'),
  t('Pavilions'),
);
?>
CommentFileSizeAuthor
#1 1048222-1.patch443 bytesBrockBoland

Comments

BrockBoland’s picture

Category: support » bug
StatusFileSize
new443 bytes

This is definitely a bug. Using NAT:Nid as an argument for a view, and this is the generated SQL:

SELECT node.nid AS nid, node.title AS node_title 
FROM node node  
LEFT JOIN term_node nat_term_node ON node.nid = nat_term_node.nid 
LEFT JOIN nat nat ON nat_term_node.tid = nat.tid 
WHERE (node.status <> 0) AND (node.type in ('activist_toolkit')) AND (nat.nid = 15) 
ORDER BY node_title ASC

This should be:

SELECT node.nid AS nid, node.title AS node_title 
FROM node node  
LEFT JOIN term_node nat_term_node ON node.nid = nat_term_node.nid AND nat_term_node.vid = node.vid
LEFT JOIN nat nat ON nat_term_node.tid = nat.tid 
WHERE (node.status <> 0) AND (node.type in ('activist_toolkit')) AND (nat.nid = 15) 
ORDER BY node_title ASC

The offending code is in includes/nat.views.inc in nat_views_data().

$data['nat_term_node']['table']['join']['node'] = array(
  'table' => 'term_node',
  'left_field' => 'nid',
  'field' => 'nid'
);

I'm not sure how to define two fields for each table to match on, but the attached patch changes nid to vid so it matches on the node version. Now, this probably isn't the right way to do it, but it's one way.

$data['nat_term_node']['table']['join']['node'] = array(
  'table' => 'term_node',
  'left_field' => 'vid',
  'field' => 'vid'
);
Melissamcewen’s picture

subscribe

BrockBoland’s picture

Status: Active » Needs review

I just ran into this problem again today. Can anyone review the patch in #1 and see if it's an acceptable solution?

5kot’s picture

I had this exact issue. I've applied that patch and it works fine.

S