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 .= '
'. $item .'
'; + } + 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'; }