diff --git node_reference/node_reference.info node_reference/node_reference.info index e4a2d73..b718d9d 100644 --- node_reference/node_reference.info +++ node_reference/node_reference.info @@ -4,5 +4,6 @@ description = Defines a field type for referencing one node from another. package = Fields core = 7.x dependencies[] = field +dependencies[] = references dependencies[] = options -files[] = node_reference.test + diff --git node_reference/node_reference.module node_reference/node_reference.module index 8a26048..3b56464 100644 --- node_reference/node_reference.module +++ node_reference/node_reference.module @@ -843,15 +843,6 @@ function node_reference_content_migrate_instance_alter(&$instance_value, $field_ } /** - * Implements hook_views_api(). - */ -function node_reference_views_api() { - return array( - 'api' => '3.0', - ); -} - -/** * Implements hook_field_views_data(). * * In addition to the default field information we add the relationship for @@ -870,10 +861,12 @@ function node_reference_field_views_data($field) { $id_column = $columns['nid']; if (isset($data[$table])) { $data[$table][$id_column]['relationship'] = array( + 'handler' => 'references_handler_relationship', 'base' => 'node', 'field' => 'nid', 'base field' => 'nid', 'label' => $field['field_name'], + 'field_name' => $field['field_name'], ); } } diff --git references.info references.info new file mode 100644 index 0000000..b97e4c7 --- /dev/null +++ references.info @@ -0,0 +1,8 @@ +; $Id$ +name = References +description = Defines common base features for the various reference field types. +package = Fields +core = 7.x +dependencies[] = field +dependencies[] = options +files[] = views/references_handler_relationship.inc diff --git references.module references.module new file mode 100644 index 0000000..a3542b4 --- /dev/null +++ references.module @@ -0,0 +1,16 @@ + '3.0', + ); +} diff --git user_reference/user_reference.info user_reference/user_reference.info index b9d7d0b..247c650 100644 --- user_reference/user_reference.info +++ user_reference/user_reference.info @@ -4,4 +4,5 @@ description = Defines a field type for referencing a user from a node. package = Fields core = 7.x dependencies[] = field +dependencies[] = references dependencies[] = options diff --git user_reference/user_reference.module user_reference/user_reference.module index b8f59a7..2672c67 100644 --- user_reference/user_reference.module +++ user_reference/user_reference.module @@ -668,15 +668,6 @@ function user_reference_content_migrate_instance_alter(&$instance_value, $field_ } /** - * Implements hook_views_api(). - */ -function user_reference_views_api() { - return array( - 'api' => '3.0', - ); -} - -/** * Implements hook_field_views_data(). * * In addition to the default field information we add the relationship for @@ -695,10 +686,12 @@ function user_reference_field_views_data($field) { $id_column = $columns['uid']; if (isset($data[$table])) { $data[$table][$id_column]['relationship'] = array( + 'handler' => 'references_handler_relationship', 'base' => 'users', 'field' => 'uid', 'base field' => 'uid', 'label' => $field['field_name'], + 'field_name' => $field['field_name'], ); } } diff --git views/references_handler_relationship.inc views/references_handler_relationship.inc new file mode 100644 index 0000000..81cb224 --- /dev/null +++ views/references_handler_relationship.inc @@ -0,0 +1,59 @@ + -1); + + return $options; + } + + /** + * Add a delta selector for multiple fields. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $field = field_info_field($this->definition['field_name']); + + // Only add the delta selector if the field is multiple. + if ($field['cardinality']) { + $max_delta = ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) ? 10 : $field['cardinality']; + + $options = array('-1' => t('All')); + for ($i = 0; $i < $max_delta; $i++) { + $options[$i] = $i + 1; + } + $form['delta'] = array( + '#type' => 'select', + '#options' => $options, + '#default_value' => $this->options['delta'], + '#title' => t('Delta'), + '#description' => t('The delta allows you to select which item in a multiple value field to key the relationship off of. Select "1" to use the first item, "2" for the second item, and so on. If you select "All", each item in the field will create a new row, which may appear to cause duplicates.'), + ); + } + } + + function ensure_my_table() { + $field = field_info_field($this->definition['field_name']); + + if (!isset($this->table_alias)) { + $join = $this->get_join(); + if ($this->options['delta'] != -1 && $field['cardinality']) { + $join->extra[] = array( + 'field' => 'delta', + 'value' => $this->options['delta'], + 'numeric' => TRUE, + ); + } + $this->table_alias = $this->query->add_table($this->table, $this->relationship, $join); + } + return $this->table_alias; + } +}