Index: content_views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/content_views.inc,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 content_views.inc
--- content_views.inc	16 Oct 2006 11:33:41 -0000	1.1.2.5
+++ content_views.inc	8 Dec 2006 23:05:22 -0000
@@ -53,12 +53,15 @@
         'name' => $field_types[$field['type']]['label'] .': '. $field['widget']['label'] .' ('. $field['field_name'] .')',
         'addlfields' => $addlfields,
         'sortable' => isset($main_column['sortable']) ? $main_column['sortable'] : FALSE,
-        'handler' => 'content_views_field_handler',
+        'query_handler' => 'content_views_field_query_handler',
+        'handler' => array('content_views_field_handler_group' => t('Group multiple values'),
+                           'content_views_field_handler_ungroup' => t('Do not group multiple values')),
         'option' => array('#type' => 'select', '#options' => $formatters),
         'content_db_info' => $db_info,
         'content_field' => $field,
         'content_field_module' => $module,
       );
+
       if (isset($main_column['sortable']) && $main_column['sortable']) {
         $table['sorts'] = array();
         $table['sorts'][$main_column['column']] = array(
@@ -94,7 +97,54 @@
   return $tables;
 }
 
-function content_views_field_handler($field_info, $field_data, $value, $data) {
+function content_views_field_query_handler($field, &$fieldinfo, &$query) {
+  if ($field['handler'] == 'content_views_field_handler_group') {
+    // we manage the addition of fields ourselves
+    // if not multiple field, add the columns to the query
+    if (!$fieldinfo['content_field']['multiple']) {
+      $query->add_field($field['field'], $field['tablename'], $field['queryname']);
+      foreach ($fieldinfo['addlfields'] as $name)
+        $query->add_field($name, $field['tablename'], "$field[tablename]_$name");
+    }
+    // if multiple field, no field gets added (they are retrieved later
+    // in content_views_field_handler in order to avoid duplicate results)
+    else {
+      // if the field is sortable (table sort), then we have to join the table
+      // ("Node: Distinct" will be required to avoid duplicates...)
+      if ($field['sortable']) {
+        $query->ensure_table($field['tablename']);
+      }
+    }
+    // make sure views default query builder does not add anything
+    $fieldinfo['notafield'] = true;
+    unset($fieldinfo['addlfields']);
+  }
+}
+
+function content_views_field_handler_group($field_info, $field_data, $value, $data) {
+  $field = $field_info['content_field'];
+  $items = array();
+  if ($field['multiple']) {
+    foreach ($field_info['content_db_info']['columns'] as $column => $attributes) {
+      $query_columns[] = "node_data_$field[field_name].$attributes[column] AS $column";
+    }
+    $query = "SELECT ".implode(', ', $query_columns).
+             " FROM {node} node".
+             " LEFT JOIN {node_data_$field[field_name]} node_data_$field[field_name] ON node.vid = node_data_$field[field_name].vid".
+             " WHERE node.nid = ".$data->nid.
+             " ORDER BY node_data_$field[field_name].delta";
+    $result = db_query(db_rewrite_sql($query, 'node'));
+    while ($item = db_fetch_array($result)) {
+      $items[] = content_format($field, $item, $field_data['options']);
+    }
+    return theme('content_view_multiple_field', $items, $field, $data);
+  }
+  else {
+    return content_views_field_handler_ungroup($field_info, $field_data, $value, $data);
+  }
+}
+
+function content_views_field_handler_ungroup($field_info, $field_data, $value, $data) {
   $field = $field_info['content_field'];
   $item = array();
   foreach ($field_info['content_db_info']['columns'] as $column => $attributes) {
@@ -104,6 +154,15 @@
   return content_format($field, $item, $field_data['options']);
 }
 
+function theme_content_view_multiple_field($items, $field, $data) {
+  foreach ($items as $item) {
+    $output .= '<div class="field-item">'. $item .'</div>';
+  }
+  return $output;
+}
+
+}
+
 /**
  * Implementation of hook_views_arguments().
  *
@@ -192,3 +251,32 @@
       return content_format($field, $item);
   }
 }
+
+/**
+ * Rebuild the cached queries for the views using a given field
+ * used when a field changes its 'multiple' status
+ * plus helper function for updates
+ *
+ * @param unknown_type $update_fields
+ */
+function _content_views_rebuild_views($update_fields) {
+  views_load_cache();
+  $tables = _views_get_tables();
+  $result = db_query("SELECT name, query FROM {view_view} ORDER BY name");
+  while ($row = db_fetch_array($result)) {
+    // if a query has been stored for the view
+    if (!empty($row['query'])) {
+      $view = views_get_view($row['name']);
+      // TODO : check for arguments / sorts / filters as well ?
+      foreach ($view->field as $field) {
+        // if the view contains one of the fields that require updating
+        $field_info = $tables[$field['tablename']]['fields'][$field['field']];
+        if (isset($field_info['content_field']) && in_array($field_info['content_field']['field_name'], $update_fields)) {
+          // re-save the view (forces the query to be updated)
+          _views_save_view($view);
+          break;
+        }
+      }
+    }
+  }
+}
Index: content_admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/content_admin.inc,v
retrieving revision 1.12.2.15
diff -u -r1.12.2.15 content_admin.inc
--- content_admin.inc	21 Nov 2006 21:51:15 -0000	1.12.2.15
+++ content_admin.inc	7 Dec 2006 22:36:10 -0000
@@ -644,6 +644,13 @@
   }
   content_alter_db_field($prev_field, $prev_columns, $new_field, $new_columns);
 
+  // regenerate views queries if 'multiple' status was changed
+  if (module_exists('views')) {
+    if ($new_field['multiple'] != $prev_field['multiple']) {
+      _content_views_rebuild_views(array($new_field['field_name']));
+    }
+  }
+
   return 'admin/node/types/'. $form_values['type_name'] .'/fields';
 }
 
