Index: fivestar_field.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fivestar/fivestar_field.inc,v retrieving revision 1.3.2.12 diff -u -r1.3.2.12 fivestar_field.inc --- fivestar_field.inc 5 Oct 2008 23:52:10 -0000 1.3.2.12 +++ fivestar_field.inc 10 Apr 2009 17:12:57 -0000 @@ -112,37 +112,22 @@ case 'insert': case 'update': foreach ($items as $delta => $item) { - if (!empty($field['php_target'])) { - // Use eval rather than drupal_eval to allow access to local variables. - $items[$delta]['target'] = eval($field['php_target']); - } - elseif ($field['dynamic_target'] && !empty($node->$field['dynamic_target'])) { - if (is_array($node->$field['dynamic_target']) && is_numeric($node->{$field['dynamic_target']}[0]['nid'])) { - $items[$delta]['target'] = $node->{$field['dynamic_target']}[0]['nid']; - } - elseif (is_numeric($node->$field['dynamic_target'])) { - $items[$delta]['target'] = $node->$field['dynamic_target']; - } - } + $target = fivestar_field_target($node, $field, $item); - if (is_numeric($items[$delta]['target'])) { - _fivestar_cast_vote('node', $items[$delta]['target'], $items[$delta]['rating'], $items[$delta]['axis'], $node->uid); - votingapi_recalculate_results('node', $items[$delta]['target']); + if (is_numeric($target)) { + $rating = $node->status ? $items[$delta]['rating'] : 0; + _fivestar_cast_vote('node', $target, $rating, $items[$delta]['axis'], $node->uid); + votingapi_recalculate_results('node', $target); } } break; case 'delete': foreach ($items as $delta => $item) { - if ($field['dynamic_target'] && !empty($node->$field['dynamic_target'])) { - $items[$delta]['target'] = $node->$field['dynamic_target']; - } - elseif (!empty($item['php_target'])) { - // Use eval rather than drupal_eval to allow access to local variables. - $items[$delta]['target'] = eval($item['target']); - } - if (is_numeric($items[$delta]['target'])) { - _fivestar_cast_vote('node', $items[$delta]['target'], 0, $items[$delta]['axis'], $node->uid); - votingapi_recalculate_results('node', $items[$delta]['target']); + $target = fivestar_field_target($node, $field, $item); + + if (is_numeric($target)) { + _fivestar_cast_vote('node', $target, 0, $items[$delta]['axis'], $node->uid); + votingapi_recalculate_results('node', $target); } } break; @@ -153,6 +138,31 @@ } /** + * Helper function to find the nid that should be rated when a field is changed. + */ +function fivestar_field_target($node, $field, $item) { + $target = FALSE; + + if (!empty($field['php_target'])) { + // Use eval rather than drupal_eval to allow access to local variables. + $target = eval($field['php_target']); + } + elseif ($field['dynamic_target'] && !empty($node->$field['dynamic_target'])) { + if (is_array($node->$field['dynamic_target']) && is_numeric($node->{$field['dynamic_target']}[0]['nid'])) { + $target = $node->{$field['dynamic_target']}[0]['nid']; + } + elseif (is_numeric($node->$field['dynamic_target'])) { + $target = $node->$field['dynamic_target']; + } + } + elseif (isset($item['target'][0]['nid'])) { + $target = $item['target'][0]['nid']; + } + + return $target; +} + +/** * Implementation of hook_content_is_empty(). */ function fivestar_content_is_empty($item, $field) {