• Main Page
  • Related Pages
  • Modules
  • Classes
  • Files
  • File List
  • File Members

modules/field.views.inc

Go to the documentation of this file.
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   // Count the amount of instances per label per field.
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   // Sort the field lables by it most used label and return the most used one.
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   // Check the field module is available.
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   // The list of entity:bundle that this field is used in.
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   // Build the relationships between the field table and the entity tables.
00118   foreach ($field['bundles'] as $entity => $bundles) {
00119     $entity_info = entity_get_info($entity);
00120     $groups[$entity] = $entity_info['label'];
00121 
00122     // Override Node to Content.
00123     if ($groups[$entity] == t('Node')) {
00124       $groups[$entity] = t('Content');
00125     }
00126 
00127     // If only one bundle use this as the default name.
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   // Note: we don't have a label available here, because we are at the field
00178   // level, not at the instance level. So we just go through all instances
00179   // and take the one which is used the most frequently.
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     // Go through and create a list of aliases for all possible combinations of
00203     // entity type + name.
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       // Provide a real field for group by.
00245       'real field' => $column . '_' . $real_field,
00246       'additional fields' => $add_fields,
00247       'entity_tables' => $entity_tables,
00248       // Default the element type to div, let the UI change it if necessary.
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     // Identify likely filters and arguments for each column based on field type.
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         // It does not make sense to sort by blob or text.
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       // CCK used the first 10 characters of $label. Probably doesn't matter.
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       // Load all the fields from the table by default.
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       // Go through and create a list of aliases for all possible combinations of
00312       // entity type + name.
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               // CCK used the first 10 characters of $label. Probably doesn't matter.
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       // Expose additional delta column for multiple value fields.
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 

Generated on Sun Feb 26 2012 12:52:51 for Views by  doxygen 1.7.1