Non-Views Answer
I finally figured out how this can be done without incurring the overhead of views. I'll leave the views answer below in case it is useful for someone, but this version seems snappier to me. As always, critique very welcome!
/**
* Implements hook_menu().
*/
function MYMODULE_menu()
{
$items = array();
$items['pub'] = array(
'title' => 'publications by Docid',
'access callback' => TRUE,
'page callback' => '_MYMODULE_pub_to_docid',
);
return $items;
}
/**
* Redirect to a publication page based on its legacy_docid
*/
function _MYMODULE_pub_to_docid() {
$path = current_path();
$path = str_ireplace('pub/', '', $path);
$args = explode('/', $path);
$query = new EntityFieldQuery();
if (_MYMODULE_isInteger($args[0])) { // Sanity check, local helper function just to check that the value is an integer.
$query->entityCondition('entity_type', 'node')
->fieldCondition('field_doc_legacy_docid', 'value', $args[0]);
$result = $query->execute();
if (isset($result['node']) && count($result['node'] == 1)) {
$node_holder = array_slice($result['node'],0,1)[0];
$node = node_load($node_holder->nid);
$language = language_list()[$node->language];
drupal_goto(drupal_get_path_alias('node/'.$node_holder->nid, $node->language), array('language' => $language), 301);
} else {
return MENU_NOT_FOUND;
}
}
return MENU_NOT_FOUND;
}
Views Answer