00001 <?php
00002
00020 function field_views_data() {
00021 $data = array();
00022 foreach (field_info_fields() as $field) {
00023 if ($field['storage']['type'] != 'field_sql_storage') {
00024 continue;
00025 }
00026
00027 $module = $field['module'];
00028 $result = (array) module_invoke($module, 'field_views_data', $field);
00029
00030 if (empty($result)) {
00031 $result = field_views_field_default_views_data($field);
00032 }
00033 drupal_alter('field_views_data', $result, $field, $module);
00034
00035 if (is_array($result)) {
00036 $data = drupal_array_merge_deep($result, $data);
00037 }
00038 }
00039
00040 return $data;
00041 }
00042
00051 function field_views_data_alter(&$data) {
00052 foreach (field_info_fields() as $field) {
00053 if ($field['storage']['type'] != 'field_sql_storage') {
00054 continue;
00055 }
00056
00057 $function = $field['module'] . '_field_views_data_views_data_alter';
00058 if (function_exists($function)) {
00059 $function($data, $field);
00060 }
00061 }
00062 }
00063
00069 function field_views_field_label($field_name) {
00070 $label_counter = array();
00071 $all_labels = array();
00072
00073 $instances = field_info_instances();
00074 foreach ($instances as $entity_name => $entity_type) {
00075 foreach ($entity_type as $bundle) {
00076 if (isset($bundle[$field_name])) {
00077 $label_counter[$bundle[$field_name]['label']] = isset($label_counter[$bundle[$field_name]['label']]) ? ++$label_counter[$bundle[$field_name]['label']] : 1;
00078 $all_labels[$entity_name][$bundle[$field_name]['label']] = TRUE;
00079 }
00080 }
00081 }
00082 if (empty($label_counter)) {
00083 return array($field_name, $all_labels);
00084 }
00085
00086 arsort($label_counter);
00087 $label_counter = array_keys($label_counter);
00088 return array($label_counter[0], $all_labels);
00089 }
00090
00094 function field_views_field_default_views_data($field) {
00095 $field_types = field_info_field_types();
00096
00097
00098 if (!isset($field_types[$field['type']])) {
00099 return;
00100 }
00101
00102 $data = array();
00103
00104 $current_table = _field_sql_storage_tablename($field);
00105 $revision_table = _field_sql_storage_revision_tablename($field);
00106
00107
00108 $bundles_names = array();
00109 $supports_revisions = FALSE;
00110 $entity_tables = array();
00111 $current_tables = array();
00112 $revision_tables = array();
00113 $groups = array();
00114
00115 $group_name = count($field['bundles']) > 1 ? t('Field') : NULL;
00116
00117
00118 foreach ($field['bundles'] as $entity => $bundles) {
00119 $entity_info = entity_get_info($entity);
00120 $groups[$entity] = $entity_info['label'];
00121
00122
00123 if ($groups[$entity] == t('Node')) {
00124 $groups[$entity] = t('Content');
00125 }
00126
00127
00128 if (empty($group_name)) {
00129 $group_name = $groups[$entity];
00130 }
00131
00132 $entity_tables[$entity_info['base table']] = $entity;
00133 $current_tables[$entity] = $entity_info['base table'];
00134 if (isset($entity_info['revision table'])) {
00135 $entity_tables[$entity_info['revision table']] = $entity;
00136 $revision_tables[$entity] = $entity_info['revision table'];
00137 }
00138
00139 $data[$current_table]['table']['join'][$entity_info['base table']] = array(
00140 'left_field' => $entity_info['entity keys']['id'],
00141 'field' => 'entity_id',
00142 'extra' => array(
00143 array('field' => 'entity_type', 'value' => $entity),
00144 array('field' => 'deleted', 'value' => 0, 'numeric' => TRUE),
00145 ),
00146 );
00147
00148 if (!empty($entity_info['entity keys']['revision']) && !empty($entity_info['revision table'])) {
00149 $data[$revision_table]['table']['join'][$entity_info['revision table']] = array(
00150 'left_field' => $entity_info['entity keys']['revision'],
00151 'field' => 'revision_id',
00152 'extra' => array(
00153 array('field' => 'entity_type', 'value' => $entity),
00154 array('field' => 'deleted', 'value' => 0, 'numeric' => TRUE),
00155 ),
00156 );
00157
00158 $supports_revisions = TRUE;
00159 }
00160
00161 foreach ($bundles as $bundle) {
00162 $bundles_names[] = t('@entity:@bundle', array('@entity' => $entity, '@bundle' => $bundle));
00163 }
00164 }
00165
00166 $tables = array();
00167 $tables[FIELD_LOAD_CURRENT] = $current_table;
00168 if ($supports_revisions) {
00169 $tables[FIELD_LOAD_REVISION] = $revision_table;
00170 }
00171
00172 $add_fields = array('delta', 'language', 'bundle');
00173 foreach ($field['columns'] as $column_name => $attributes) {
00174 $add_fields[] = _field_sql_storage_columnname($field['field_name'], $column_name);
00175 }
00176
00177
00178
00179
00180 $field_name = $field['field_name'];
00181 list($label, $all_labels) = field_views_field_label($field_name);
00182 foreach ($tables as $type => $table) {
00183 if ($type == FIELD_LOAD_CURRENT) {
00184 $group = $group_name;
00185 $old_column = 'entity_id';
00186 $column = $field['field_name'];
00187 }
00188 else {
00189 $group = t('@group (historical data)', array('@group' => $group_name));
00190 $old_column = 'revision_id';
00191 $column = $field['field_name'] . '-' . $old_column;
00192 }
00193
00194 $data[$table][$old_column]['field']['moved to'] = array($table, $column);
00195 $data[$table][$column] = array(
00196 'group' => $group,
00197 'title' => $label,
00198 'title short' => $label,
00199 'help' => t('Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
00200 );
00201
00202
00203
00204 $aliases = array();
00205 $also_known = array();
00206 foreach ($all_labels as $entity_name => $labels) {
00207 foreach ($labels as $label_name => $true) {
00208 if ($type == FIELD_LOAD_CURRENT) {
00209 if ($group_name != $groups[$entity_name] || $label != $label_name) {
00210 $aliases[] = array(
00211 'base' => $current_tables[$entity_name],
00212 'group' => $groups[$entity_name],
00213 'title' => $label_name,
00214 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)),
00215 );
00216 }
00217 $also_known[] = t('@group: @field', array('@group' => $groups[$entity_name], '@field' => $label_name));
00218 }
00219 else {
00220 if ($group_name != $groups[$entity_name] && $label != $label_name && isset($revision_tables[$entity_name])) {
00221 $aliases[] = array(
00222 'base' => $revision_tables[$entity_name],
00223 'group' => t('@group (historical data)', array('@group' => $groups[$entity_name])),
00224 'title' => $label_name,
00225 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)),
00226 );
00227 }
00228 $also_known[] = t('@group (historical data): @field', array('@group' => $groups[$entity_name], '@field' => $label_name));
00229 }
00230 }
00231 }
00232 if ($aliases) {
00233 $data[$table][$column]['aliases'] = $aliases;
00234 $data[$table][$column]['help'] .= ' ' . t('Also known as: !also.', array('!also' => implode(', ', $also_known)));
00235 }
00236
00237 $keys = array_keys($field['columns']);
00238 $real_field = reset($keys);
00239 $data[$table][$column]['field'] = array(
00240 'table' => $table,
00241 'handler' => 'views_handler_field_field',
00242 'click sortable' => TRUE,
00243 'field_name' => $field['field_name'],
00244
00245 'real field' => $column . '_' . $real_field,
00246 'additional fields' => $add_fields,
00247 'entity_tables' => $entity_tables,
00248
00249 'element type' => 'div',
00250 'is revision' => $type == FIELD_LOAD_REVISION,
00251 );
00252 }
00253
00254 foreach ($field['columns'] as $column => $attributes) {
00255 $allow_sort = TRUE;
00256
00257
00258 switch ($attributes['type']) {
00259 case 'int':
00260 case 'mediumint':
00261 case 'tinyint':
00262 case 'bigint':
00263 case 'serial':
00264 case 'numeric':
00265 case 'float':
00266 $filter = 'views_handler_filter_numeric';
00267 $argument = 'views_handler_argument_numeric';
00268 $sort = 'views_handler_sort';
00269 break;
00270 case 'text':
00271 case 'blob':
00272
00273 $allow_sort = FALSE;
00274 default:
00275 $filter = 'views_handler_filter_string';
00276 $argument = 'views_handler_argument_string';
00277 $sort = 'views_handler_sort';
00278 break;
00279 }
00280
00281
00282 if (count($field['columns']) == 1 || $column == 'value') {
00283 $title = t('@label (!name)', array('@label' => $label, '!name' => $field['field_name']));
00284
00285 $title_short = $label;
00286 }
00287 else {
00288 $title = t('@label (!name:!column)', array('@label' => $label, '!name' => $field['field_name'], '!column' => $column));
00289 $title_short = t('@label:!column', array('@label' => $label, '!column' => $column));
00290 }
00291
00292 foreach ($tables as $type => $table) {
00293 if ($type == FIELD_LOAD_CURRENT) {
00294 $group = $group_name;
00295 }
00296 else {
00297 $group = t('@group (historical data)', array('@group' => $group_name));
00298 }
00299 $column_real_name = $field['storage']['details']['sql'][$type][$table][$column];
00300
00301
00302 $additional_fields = array_values($field['storage']['details']['sql'][$type][$table]);
00303
00304 $data[$table][$column_real_name] = array(
00305 'group' => $group,
00306 'title' => $title,
00307 'title short' => $title_short,
00308 'help' => t('Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
00309 );
00310
00311
00312
00313 $aliases = array();
00314 $also_known = array();
00315 foreach ($all_labels as $entity_name => $labels) {
00316 foreach ($labels as $label_name => $true) {
00317 if ($group_name != $groups[$entity_name] || $label != $label_name) {
00318 if (count($field['columns']) == 1 || $column == 'value') {
00319 $alias_title = t('@label (!name)', array('@label' => $label_name, '!name' => $field['field_name']));
00320
00321 }
00322 else {
00323 $alias_title = t('@label (!name:!column)', array('@label' => $label_name, '!name' => $field['field_name'], '!column' => $column));
00324 }
00325 $aliases[] = array(
00326 'group' => $groups[$entity_name],
00327 'title' => $alias_title,
00328 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $title)),
00329 );
00330 }
00331 $also_known[] = t('@group: @field', array('@group' => $groups[$entity_name], '@field' => $title));
00332 }
00333 }
00334 if ($aliases) {
00335 $data[$table][$column_real_name]['aliases'] = $aliases;
00336 $data[$table][$column_real_name]['help'] .= ' ' . t('Also known as: !also.', array('!also' => implode(', ', $also_known)));
00337 }
00338
00339 $data[$table][$column_real_name]['argument'] = array(
00340 'field' => $column_real_name,
00341 'table' => $table,
00342 'handler' => $argument,
00343 'additional fields' => $additional_fields,
00344 'field_name' => $field['field_name'],
00345 'empty field name' => t('<No value>'),
00346 );
00347 $data[$table][$column_real_name]['filter'] = array(
00348 'field' => $column_real_name,
00349 'table' => $table,
00350 'handler' => $filter,
00351 'additional fields' => $additional_fields,
00352 'field_name' => $field['field_name'],
00353 'allow empty' => TRUE,
00354 );
00355 if (!empty($allow_sort)) {
00356 $data[$table][$column_real_name]['sort'] = array(
00357 'field' => $column_real_name,
00358 'table' => $table,
00359 'handler' => $sort,
00360 'additional fields' => $additional_fields,
00361 'field_name' => $field['field_name'],
00362 );
00363 }
00364
00365
00366 if ($field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
00367 $title_delta = t('@label (!name:delta)', array('@label' => $label, '!name' => $field['field_name']));
00368 $title_short_delta = t('@label:delta', array('@label' => $label));
00369
00370 $data[$table]['delta'] = array(
00371 'group' => $group,
00372 'title' => $title_delta,
00373 'title short' => $title_short_delta,
00374 'help' => t('Delta - Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
00375 );
00376 $data[$table]['delta']['field'] = array(
00377 'handler' => 'views_handler_field_numeric',
00378 );
00379 $data[$table]['delta']['argument'] = array(
00380 'field' => 'delta',
00381 'table' => $table,
00382 'handler' => 'views_handler_argument_numeric',
00383 'additional fields' => $additional_fields,
00384 'empty field name' => t('<No value>'),
00385 'field_name' => $field['field_name'],
00386 );
00387 $data[$table]['delta']['filter'] = array(
00388 'field' => 'delta',
00389 'table' => $table,
00390 'handler' => 'views_handler_filter_numeric',
00391 'additional fields' => $additional_fields,
00392 'field_name' => $field['field_name'],
00393 'allow empty' => TRUE,
00394 );
00395 $data[$table]['delta']['sort'] = array(
00396 'field' => 'delta',
00397 'table' => $table,
00398 'handler' => 'views_handler_sort',
00399 'additional fields' => $additional_fields,
00400 'field_name' => $field['field_name'],
00401 );
00402 }
00403 }
00404 }
00405
00406 return $data;
00407 }
00408
00412 function list_field_views_data($field) {
00413 $data = field_views_field_default_views_data($field);
00414 foreach ($data as $table_name => $table_data) {
00415 foreach ($table_data as $field => $field_data) {
00416 if (isset($field_data['filter']) && $field != 'delta') {
00417 $data[$table_name][$field]['filter']['handler'] = 'views_handler_filter_field_list';
00418 }
00419 if (isset($field_data['argument']) && $field != 'delta') {
00420 $data[$table_name][$field]['argument']['handler'] = 'views_handler_argument_field_list';
00421 }
00422 }
00423 }
00424 return $data;
00425 }
00426