Index: content.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/cck/content.module,v retrieving revision 1.48 diff -u -r1.48 content.module --- content.module 16 Apr 2006 13:38:00 -0000 1.48 +++ content.module 2 May 2006 06:17:42 -0000 @@ -749,3 +747,69 @@ return $result; } +/** + * Implementation hook_views_arguments. + */ +function content_views_arguments() { + $field_types = _content_field_types(); + $arguments = array(); + foreach (_content_fields() as $field) { + $module = $field_types[$field['type']]['module']; + $argument = array(); + $argument['name'] = $field_types[$field['type']]['label'] .': '. $field['widget']['label'] .' ('. $field['field_name'] .')'; + + // If a field module implements its own handler use it, + // instead of the default content.module handler. + if (function_exists($module.'_views_argument_handler')) { + $argument['handler'] = $module.'_views_argument_handler'; + } + else { + $argument['handler'] = 'content_views_argument_handler'; + } + + $argument['help'] = t('This argument allows users to filter nodes according to field %name.', theme('placeholder',array('name' => $argument['name']))); + $argument['table'] = 'node_data_'. $field['field_name']; + $argument['field'] = $field; + $arguments['field_'.$field['field_name'].'_'.$field['widget']['label']] = $argument; + } + return $arguments; +} + +/** + * Shared views_arguments handler for CCK. + * @todo support multi value fields, + * @todo support multiple arguments for a single view. + */ + + +function content_views_argument_handler($op, &$query, $argtype, $arg = '') { + $argdata = _views_get_arguments(); + $field = $argdata[$argtype['type']]['field']; + $field_types = _content_field_types(); + $module = $field_types[$field['type']]['module']; + $columns = module_invoke($module, 'field_settings', 'database columns', $field); + + // Only return data if fieldtype implements storage through content.module. + if (is_array($columns) && count($columns)) { + switch($op) { + case 'summary': + drupal_set_message('
'.print_r($columns, true).''); + foreach($columns as $columnname => $columndata) { + $query->addfield($columnname); + } + $query->addtable('node_data_'. $field['field_name']); + break; + case 'filter': + $query->ensure_table('node_data_'. $field['field_name']); + foreach($columns as $columnname => $columndata) { + $query->add_where('node_data_'. $field['field_name'] .'.'. $field['field_name'] .'_'. $columnname .' = '. $arg); + } + break; + case 'link': + break; + case 'title': + break; + } + } +} +