diff --git a/node_reference/node_reference.module b/node_reference/node_reference.module index 6480f6cf52e3231fc46ff51e9fcbe43ed55f5c95..b4f52acdec6d3391e7bb59f589d038cfc6dbec06 100644 --- a/node_reference/node_reference.module +++ b/node_reference/node_reference.module @@ -1297,3 +1297,39 @@ function node_reference_views_filter_options($field_name) { return $options; } + +/** + * Returns nodes of the given type(s) that are referred to in a given node. + * + * @param object $node + * The node object from which the references should be retrieved. + * @param array $types + * An array listing the desired content types. If omitted all referenced nodes + * are returned, regardless of type. + * + * @return array + * An associative array of nodes of the given types that are referred to in + * the given node, keyed by nid. + */ +function node_reference_get_referred_nodes($node, array $types = array()) { + + $nodes = array(); + + if (!isset($node->type)) { + return $nodes; + } + + foreach (field_info_fields() as $field_name => $field_info) { + if ($field_info['type'] == 'node_reference' && (empty($types) || array_intersect($types, $field_info['settings']['referenceable_types'])) && array_intersect(array($node->type), $field_info['bundles']['node'])) { + $field_items = field_get_items('node', $node, $field_name); + if (is_array($field_items) && !empty($field_items)) { + foreach ($field_items as $field_item) { + if (($referred_node = node_load($field_item['nid'])) && (empty($types) || in_array($referred_node->type, $types))) { + $nodes[$field_item['nid']] = $referred_node; + } + } + } + } + } + return $nodes; +}