? patch Index: includes/views/content.views.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/cck/includes/views/Attic/content.views.inc,v retrieving revision 1.1.2.25 diff -u -p -r1.1.2.25 content.views.inc --- includes/views/content.views.inc 11 Apr 2009 14:50:53 -0000 1.1.2.25 +++ includes/views/content.views.inc 30 Jun 2009 15:00:15 -0000 @@ -60,6 +60,9 @@ function content_views_handlers() { 'content_handler_filter_many_to_one' => array( 'parent' => 'views_handler_filter_many_to_one', ), + 'content_handler_filter_associate_delta' => array( + 'parent' => 'views_handler_filter', + ), // relationship handlers 'content_handler_relationship' => array( @@ -308,6 +311,68 @@ function content_views_field_views_data( } /** + * Implementation of hook_views_data_alter(). + */ +function content_views_data_alter(&$data) { + $field_types = _content_field_types(); + $fields = content_fields(); + foreach ($fields as $field) { + $table_alias = content_views_tablename($field); + // Check that this field's table has data in the $data object. + if (isset($data[$table_alias])) { + $db_info = content_database_info($field); + + // Fill $types with the content type names which contain this field. + $types = array(); + foreach (content_types() as $type) { + if (isset($type['fields'][$field['field_name']])) { + $types[] = $type['name']; + } + } + + $db_columns = array(); + $additional_fields = array(); + foreach ($db_info['columns'] as $column => $attributes) { + // Select explicitly enabled field columns. + if (!empty($attributes['views'])) { + $db_columns[$column] = $attributes; + } + // Ensure all columns are retrieved. + $additional_fields[$attributes['column']] = $attributes['column']; + } + + $multigroups = array(); + $multigroup_results = db_query("SELECT cgf.group_name FROM {". fieldgroup_fields_tablename() ."} cgf + INNER JOIN {". fieldgroup_tablename() ."} cg on (cgf.group_name = cg.group_name AND cg.group_type = 'multigroup') + WHERE cgf.field_name = '%s'", $field['field_name']); + while ($group = db_fetch_array($multigroup_results)) { + $multigroups[] = $group['group_name']; + } + foreach ($multigroups as $group_name) { + $db_field = $group_name; + $label_truncated = truncate_utf8(t($field['widget']['label']), 10, TRUE); + $title = t('@label (!name) - !column', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'], '!column' => $db_field)); + $title_short = t('@label-truncated - !column', array('@label-truncated' => $label_truncated, '!column' => $db_field)); + $data[$table_alias][$db_field] = array( + 'group' => t('Content'), + 'title' => $title, + 'title short' => $title_short, + 'help' => t($field_types[$field['type']]['label']) .' - '. t('Appears in: @types', array('@types' => implode(', ', $types))), + ); + $data[$table_alias][$db_field]['filter'] = array( + 'field' => $db_field, + 'table' => $db_info['table'], + 'handler' => 'content_multi_delta_handler_filter', + 'additional fields' => array($field['field_name'] .'_value' => $field['field_name'] .'_value'), + 'content_field_name' => $field['field_name'], + 'allow empty' => TRUE, + ); + } + } + } +} + +/** * Helper function so it is possible to change the Views tablename * in the future without re-writing code. */ Index: includes/views/handlers/content_handler_filter_associate_delta.inc =================================================================== RCS file: includes/views/handlers/content_handler_filter_associate_delta.inc diff -N includes/views/handlers/content_handler_filter_associate_delta.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ includes/views/handlers/content_handler_filter_associate_delta.inc 30 Jun 2009 15:00:15 -0000 @@ -0,0 +1,94 @@ + $field) { + // Only need to filter $options to those that are multivalue and on the same node type + $type_name = $field['type_name']; + if (($name != $this->definition['content_field_name']) && $this->_is_field_multivalue($name) && $this->_is_field_multigroup($type_name, $name, $this->field)) { + $table_alias = content_views_tablename($field); + $options[$table_alias] = $field['widget']['label']; + } + } + + $form['content_multi_delta_fields'] = array( + '#title' => t('Content field(s)'), + '#type' => 'checkboxes', + '#options' => $options, + '#default_value' => $this->options['content_multi_delta_fields'], + '#multiple' => TRUE, + '#description' => t('Select fields to filter deltas against.'), + ); + } + + /** + * Checks to see if a field is listed as multivalue - if the result is '1' then it is. + */ + function _is_field_multivalue($name) { + $multivalue = db_result(db_query( + "SELECT multiple FROM {". content_field_tablename() ."} WHERE field_name = '%s'", $name + )); + return ($multivalue == 1); + } + + /** + * Checks to see if the field_name is part of a multigroup with the $group_name name. + */ + function _is_field_multigroup($type_name, $field_name, $group_name) { + $multigroup = db_result(db_query( + "SELECT group_type FROM {". + fieldgroup_fields_tablename() + ."} cgf INNER JOIN {". + fieldgroup_tablename() + ."} cg ON (cgf.group_name = cg.group_name) WHERE cgf.type_name = '%s' AND cgf.field_name = '%s' AND cgf.group_name = '%s'", + $type_name, $field_name, $group_name + )); + return ($multigroup == 'multigroup'); + } + + function options_submit(&$form, &$form_state) { + $option_tables = array(); + foreach ($form_state['values']['options']['content_multi_delta_fields'] as $table => $value) { + if (!empty($value)) { + $option_tables[] = $table; + } + } + $form_state['values']['options']['content_multi_delta_fields'] = $option_tables; + } + + function query() { + $this->ensure_my_table(); + foreach ($this->options['content_multi_delta_fields'] as $option_table) { + $this->query->add_where($this->options['group'], "$this->table_alias.delta = %s.delta", $option_table); + } + } +} \ No newline at end of file