hi,
I am writing a patch for the NAT (node auto term) module. (See http://drupal.org/node/1075432 for more information about what I'm trying to do.)
The thing I'm having a problem with is using token_replace() inside a hook_field_formatter_view() hook function to generate a link path from a formatter setting string. One of the tokens I've created works fine - it uses the $term object for a taxonomy term, which is returned as part of the existing module code. When I set the setting to 'nat-bad-link/[term:tid]', it is correctly transformed into e.g. 'nat-bad-link/65'.
However I can't get my code to work with the other 3 objects I want to expose, which are all passed as function parameters: $field, $entity, and $entity_type. E.g. if I use the token '[field:id]', the token isn't replaced in the final path. I am explicitly casting these to (object) because they are passed in as nested arrays.
I've tried printing out $term and (object) $field using dpr(), and the results look identical in structure, so I can't see why it isn't working.
The code I have written looks like this (partly from the original nat code, with some additions):
/** * Implements hook_field_formatter_view(). */ function nat_field_formatter_view($entity_type, $entity, $field, $instance, $lan gcode, $items, $display) { $element = array(); $settings = $display['settings']; foreach ($items as $delta => $item) { if ($item['tid'] == 'autocreate') { $element[$delta] = array('#markup' => check_plain($item['name'])); } else { $term = $item['taxonomy_term']; $nids = array_keys(nat_get_nids(array($term->tid), FALSE)); if ($nids && $nids[0]) { $element[$delta] = array( '#type' => 'link', '#title' => $term->name, '#href' => "node/" . $nids[0] ); } else { // it's a bad link, so mark it as such and redirect to a handling page. if ($settings['missing_link_handler_path'] != '') { // first substitute the arguments. //dpr($term); //dpr((object)$entity_type); // ******************************* This is the bit that won't work ************************
$href=token_replace($settings['missing_link_handler_path'],array( 'term' => $term, 'field' => (object) $field, 'entity_type' => (object) $entity_type, 'entity' => (object) $entity, ) ); $element[$delta] = array( '#type' => 'link', '#title' => $term->name, '#href' => check_plain($href), // TODO - check whether check_url is needed. '#prefix' => '<span class="nat-missing-link">', '#suffix' => '</span>' ); } else { $element[$delta] = array('#markup' => check_plain($term->name)); } } } }
return $element; }
Any help appreciated as I was stuck for hours on this last night! :-)
thanks,
andy baxter