diff --git a/core/modules/field/field.views.inc b/core/modules/field/field.views.inc index 96154d5..1c01d66 100644 --- a/core/modules/field/field.views.inc +++ b/core/modules/field/field.views.inc @@ -20,14 +20,14 @@ function field_views_data() { $data = array(); $module_handler = Drupal::moduleHandler(); - foreach (field_info_fields() as $field) { - if ($sql_entity_types = _field_views_get_sql_entity_types($field)) { - $result = (array) $module_handler->invoke($field['module'], 'field_views_data', array($field, $sql_entity_types)); + foreach (field_info_fields() as $field) { + if (_field_views_is_sql_entity_type($field)) { + $result = (array) $module_handler->invoke($field['module'], 'field_views_data', array($field)); if (empty($result)) { - $result = field_views_field_default_views_data($field, $sql_entity_types); + $result = field_views_field_default_views_data($field); } - $module_handler->alter('field_views_data', $result, $field, $sql_entity_types); + $module_handler->alter('field_views_data', $result, $field); if (is_array($result)) { $data = NestedArray::mergeDeep($result, $data); @@ -48,39 +48,34 @@ function field_views_data() { */ function field_views_data_alter(&$data) { foreach (field_info_fields() as $field) { - if ($sql_entity_types = _field_views_get_sql_entity_types($field)) { + if (_field_views_is_sql_entity_type($field)) { $function = $field['module'] . '_field_views_data_views_data_alter'; if (function_exists($function)) { - $function($data, $field, $sql_entity_types); + $function($data, $field); } } } } /** - * Returns the SQL-based entity types where the field appears in. + * Determines whether the entity type the field appears in is SQL based. * * @param \Drupal\field\FieldInterface $field * The field definition. * - * @return array - * The array of entity types using DatabaseStorageController where the field - * appears in. + * @return bool + * True if the entity type uses DatabaseStorageController. */ -function _field_views_get_sql_entity_types(FieldInterface $field) { - $sql_entity_types = array(); +function _field_views_is_sql_entity_type(FieldInterface $field) { $entity_manager = Drupal::entityManager(); - foreach ($field['bundles'] as $entity_type => $bundles) { - try { - if ($entity_manager->getStorageController($entity_type) instanceof DatabaseStorageController) { - $sql_entity_types[] = $entity_type; - } - } - catch (\InvalidArgumentException $e) { - // Disabled entity type, nothing to do. + try { + if ($entity_manager->getStorageController($field->entity_type) instanceof DatabaseStorageController) { + return TRUE; } } - return $sql_entity_types; + catch (\InvalidArgumentException $e) { + // Disabled entity type, nothing to do. + } } /** @@ -88,17 +83,16 @@ function _field_views_get_sql_entity_types(FieldInterface $field) { * * Therefore it looks up in all bundles to find the most used instance. */ -function field_views_field_label($field_name) { +function field_views_field_label($entity_type, $field_name) { $label_counter = array(); $all_labels = array(); // Count the amount of instances per label per field. - $instances = field_info_instances(); - foreach ($instances as $entity_name => $entity_type) { - foreach ($entity_type as $bundle) { - if (isset($bundle[$field_name])) { - $label_counter[$bundle[$field_name]['label']] = isset($label_counter[$bundle[$field_name]['label']]) ? ++$label_counter[$bundle[$field_name]->label] : 1; - $all_labels[$entity_name][$bundle[$field_name]['label']] = TRUE; - } + $instances = field_info_instances($entity_type); + foreach ($instances as $bundle => $bundle_instances) { + if (isset($bundle_instances[$field_name])) { + $instance = $bundle_instances[$field_name]; + $label_counter[$instance->label] = isset($label_counter[$instance->label]) ? ++$label_counter[$instance->label] : 1; + $all_labels[$instance->label] = TRUE; } } if (empty($label_counter)) { @@ -115,18 +109,11 @@ function field_views_field_label($field_name) { * * @param \Drupal\field\FieldInterface $field * The field definition. - * @param array $sql_entity_types - * The array of SQL-based entity types where the field appears in. * * @return array * The default views data for the field. */ -function field_views_field_default_views_data(FieldInterface $field, $sql_entity_types) { - // If the field had no instances in the SQL storage then there is nothing to be done. - if (!$sql_entity_types) { - return array(); - } - +function field_views_field_default_views_data(FieldInterface $field) { $field_types = \Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions(); // Check the field module is available. @@ -147,59 +134,46 @@ function field_views_field_default_views_data(FieldInterface $field, $sql_entity $revision_tables = array(); $groups = array(); - $group_name = count($field['bundles']) > 1 ? t('Field') : NULL; - // Build the relationships between the field table and the entity tables. $entity_manager = Drupal::entityManager(); - foreach ($sql_entity_types as $entity_type) { - $entity_info = $entity_manager->getDefinition($entity_type); - $groups[$entity_type] = $entity_info['label']; - - // Override Node to Content. - if ($groups[$entity_type] == t('Node')) { - $groups[$entity_type] = t('Content'); - } - - // If only one bundle use this as the default name. - if (empty($group_name)) { - $group_name = $groups[$entity_type]; - } - - if (!isset($entity_info['base_table'])) { - continue; - } - $entity_tables[$entity_info['base_table']] = $entity_type; - $current_tables[$entity_type] = $entity_info['base_table']; - if (isset($entity_info['revision_table'])) { - $entity_tables[$entity_info['revision_table']] = $entity_type; - $revision_tables[$entity_type] = $entity_info['revision_table']; - } + $entity_type = $field->entity_type; + $entity_info = $entity_manager->getDefinition($entity_type); + + // Override Node to Content. + $groups[$entity_type] = ($entity_info['label'] == t('Node')) ? t('Content') : $entity_info['label']; + $group_name = $groups[$entity_type]; + + $entity_tables[$entity_info['base_table']] = $entity_type; + $current_tables[$entity_type] = $entity_info['base_table']; + if (isset($entity_info['revision_table'])) { + $entity_tables[$entity_info['revision_table']] = $entity_type; + $revision_tables[$entity_type] = $entity_info['revision_table']; + } - $data[$current_table]['table']['join'][$entity_info['base_table']] = array( - 'left_field' => $entity_info['entity_keys']['id'], - 'field' => 'entity_id', + $data[$current_table]['table']['join'][$entity_info['base_table']] = array( + 'left_field' => $entity_info['entity_keys']['id'], + 'field' => 'entity_id', + 'extra' => array( + array('field' => 'entity_type', 'value' => $entity_type), + array('field' => 'deleted', 'value' => 0, 'numeric' => TRUE), + ), + ); + + if (!empty($entity_info['entity_keys']['revision']) && !empty($entity_info['revision_table'])) { + $data[$revision_table]['table']['join'][$entity_info['revision_table']] = array( + 'left_field' => $entity_info['entity_keys']['revision'], + 'field' => 'revision_id', 'extra' => array( array('field' => 'entity_type', 'value' => $entity_type), array('field' => 'deleted', 'value' => 0, 'numeric' => TRUE), ), ); - if (!empty($entity_info['entity_keys']['revision']) && !empty($entity_info['revision_table'])) { - $data[$revision_table]['table']['join'][$entity_info['revision_table']] = array( - 'left_field' => $entity_info['entity_keys']['revision'], - 'field' => 'revision_id', - 'extra' => array( - array('field' => 'entity_type', 'value' => $entity_type), - array('field' => 'deleted', 'value' => 0, 'numeric' => TRUE), - ), - ); - - $supports_revisions = TRUE; - } + $supports_revisions = TRUE; + } - foreach ($field['bundles'][$entity_type] as $bundle) { - $bundles_names[] = t('@entity:@bundle', array('@entity' => $entity_type, '@bundle' => $bundle)); - } + foreach ($field['bundles'][$entity_type] as $bundle) { + $bundles_names[] = t('@entity:@bundle', array('@entity' => $entity_type, '@bundle' => $bundle)); } $tables = array(); @@ -217,7 +191,7 @@ function field_views_field_default_views_data(FieldInterface $field, $sql_entity // level, not at the instance level. So we just go through all instances // and take the one which is used the most frequently. $field_name = $field['field_name']; - list($label, $all_labels) = field_views_field_label($field_name); + list($label, $all_labels) = field_views_field_label($entity_type, $field_name); foreach ($tables as $type => $table) { if ($type == FIELD_LOAD_CURRENT) { $group = $group_name; @@ -241,33 +215,28 @@ function field_views_field_default_views_data(FieldInterface $field, $sql_entity // entity type + name. $aliases = array(); $also_known = array(); - foreach ($all_labels as $entity_name => $labels) { - if (!isset($current_tables[$entity_name])) { - continue; - } - foreach ($labels as $label_name => $true) { - if ($type == FIELD_LOAD_CURRENT) { - if ($group_name != $groups[$entity_name] || $label != $label_name) { - $aliases[] = array( - 'base' => $current_tables[$entity_name], - 'group' => $groups[$entity_name], - 'title' => $label_name, - 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)), - ); - } - $also_known[] = t('@group: @field', array('@group' => $groups[$entity_name], '@field' => $label_name)); + foreach ($all_labels as $label_name => $true) { + if ($type == FIELD_LOAD_CURRENT) { + if ($group_name != $groups[$entity_type] || $label != $label_name) { + $aliases[] = array( + 'base' => $current_tables[$entity_type], + 'group' => $groups[$entity_type], + 'title' => $label_name, + 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)), + ); } - else { - if ($group_name != $groups[$entity_name] && $label != $label_name && isset($revision_tables[$entity_name])) { - $aliases[] = array( - 'base' => $revision_tables[$entity_name], - 'group' => t('@group (historical data)', array('@group' => $groups[$entity_name])), - 'title' => $label_name, - 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)), - ); - } - $also_known[] = t('@group (historical data): @field', array('@group' => $groups[$entity_name], '@field' => $label_name)); + $also_known[] = t('@group: @field', array('@group' => $groups[$entity_type], '@field' => $label_name)); + } + else { + if ($group_name != $groups[$entity_type] && $label != $label_name && isset($revision_tables[$entity_type])) { + $aliases[] = array( + 'base' => $revision_tables[$entity_type], + 'group' => t('@group (historical data)', array('@group' => $groups[$entity_type])), + 'title' => $label_name, + 'help' => t('This is an alias of @group: @field.', array('@group' => $group_name, '@field' => $label)), + ); } + $also_known[] = t('@group (historical data): @field', array('@group' => $groups[$entity_type], '@field' => $label_name)); } } if ($aliases) { @@ -496,8 +465,8 @@ function field_views_field_default_views_data(FieldInterface $field, $sql_entity /** * Have a different filter handler for lists. This should allow to select values of the list. */ -function list_field_views_data($field, $sql_entity_types) { - $data = field_views_field_default_views_data($field, $sql_entity_types); +function list_field_views_data($field) { + $data = field_views_field_default_views_data($field); foreach ($data as $table_name => $table_data) { foreach ($table_data as $field_name => $field_data) { if (isset($field_data['filter']) && $field_name != 'delta') { diff --git a/core/modules/file/file.views.inc b/core/modules/file/file.views.inc index 7632e49..501ce7c 100644 --- a/core/modules/file/file.views.inc +++ b/core/modules/file/file.views.inc @@ -463,8 +463,8 @@ function file_views_data() { * * @see field_views_field_default_views_data() */ -function file_field_views_data(FieldInterface $field, array $sql_entity_types) { - $data = field_views_field_default_views_data($field, $sql_entity_types); +function file_field_views_data(FieldInterface $field) { + $data = field_views_field_default_views_data($field); foreach ($data as $table_name => $table_data) { // Add the relationship only on the fid field. $data[$table_name][$field['field_name'] . '_target_id']['relationship'] = array( @@ -484,35 +484,31 @@ function file_field_views_data(FieldInterface $field, array $sql_entity_types) { * * Views integration to provide reverse relationships on file fields. */ -function file_field_views_data_views_data_alter(array &$data, FieldInterface $field, array $sql_entity_types) { - foreach ($sql_entity_types as $entity_type) { - $entity_info = entity_get_info($entity_type); - $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; +function file_field_views_data_views_data_alter(array &$data, FieldInterface $field) { + $entity_type = $field['entity_type']; + $entity_info = entity_get_info($entity_type); + $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; - list($label, $all_labels) = field_views_field_label($field['field_name']); - $entity = $entity_info['label']; - if ($entity == t('Node')) { - $entity = t('Content'); - } + list($label,) = field_views_field_label($entity_type, $field['field_name']); + $entity_label = ($entity_info['label'] == t('Node')) ? t('Content') : $entity_info['label']; - $data['file_managed'][$pseudo_field_name]['relationship'] = array( - 'title' => t('@entity using @field', array('@entity' => $entity, '@field' => $label)), - 'help' => t('Relate each @entity with a @field set to the file.', array('@entity' => $entity, '@field' => $label)), - 'id' => 'entity_reverse', - 'field_name' => $field['field_name'], - 'entity_type' => $field['entity_type'], - 'field table' => DatabaseStorageController::_fieldTableName($field), - 'field field' => $field['field_name'] . '_target_id', - 'base' => $entity_info['base_table'], - 'base field' => $entity_info['entity_keys']['id'], - 'label' => t('!field_name', array('!field_name' => $field['field_name'])), - 'join_extra' => array( - 0 => array( - 'field' => 'deleted', - 'value' => 0, - 'numeric' => TRUE, - ), + $data['file_managed'][$pseudo_field_name]['relationship'] = array( + 'title' => t('@entity using @field', array('@entity' => $entity_label, '@field' => $label)), + 'help' => t('Relate each @entity with a @field set to the file.', array('@entity' => $entity_label, '@field' => $label)), + 'id' => 'entity_reverse', + 'field_name' => $field['field_name'], + 'entity_type' => $field['entity_type'], + 'field table' => DatabaseStorageController::_fieldTableName($field), + 'field field' => $field['field_name'] . '_target_id', + 'base' => $entity_info['base_table'], + 'base field' => $entity_info['entity_keys']['id'], + 'label' => t('!field_name', array('!field_name' => $field['field_name'])), + 'join_extra' => array( + 0 => array( + 'field' => 'deleted', + 'value' => 0, + 'numeric' => TRUE, ), - ); - } + ), + ); } diff --git a/core/modules/image/image.views.inc b/core/modules/image/image.views.inc index b97ca79..356f140 100644 --- a/core/modules/image/image.views.inc +++ b/core/modules/image/image.views.inc @@ -18,8 +18,8 @@ * * @see field_views_field_default_views_data() */ -function image_field_views_data(FieldInterface $field, array $sql_entity_types) { - $data = field_views_field_default_views_data($field, $sql_entity_types); +function image_field_views_data(FieldInterface $field) { + $data = field_views_field_default_views_data($field); foreach ($data as $table_name => $table_data) { // Add the relationship only on the target_id field. $data[$table_name][$field['field_name'] . '_target_id']['relationship'] = array( @@ -38,35 +38,31 @@ function image_field_views_data(FieldInterface $field, array $sql_entity_types) * * Views integration to provide reverse relationships on image fields. */ -function image_field_views_data_views_data_alter(array &$data, FieldInterface $field, array $sql_entity_types) { - foreach ($sql_entity_types as $entity_type) { - $entity_info = entity_get_info($entity_type); - $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; +function image_field_views_data_views_data_alter(array &$data, FieldInterface $field) { + $entity_type = $field['entity_type']; + $entity_info = entity_get_info($entity_type); + $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; - list($label, $all_labels) = field_views_field_label($field['field_name']); - $entity = $entity_info['label']; - if ($entity == t('Node')) { - $entity = t('Content'); - } + list($label,) = field_views_field_label($entity_type, $field['field_name']); + $entity_label = ($entity_info['label'] == t('Node')) ? t('Content') : $entity_info['label']; - $data['file_managed'][$pseudo_field_name]['relationship'] = array( - 'title' => t('@entity using @field', array('@entity' => $entity, '@field' => $label)), - 'help' => t('Relate each @entity with a @field set to the image.', array('@entity' => $entity, '@field' => $label)), - 'id' => 'entity_reverse', - 'field_name' => $field['field_name'], - 'entity_type' => $field['entity_type'], - 'field table' => DatabaseStorageController::_fieldTableName($field), - 'field field' => $field['field_name'] . '_target_id', - 'base' => $entity_info['base_table'], - 'base field' => $entity_info['entity_keys']['id'], - 'label' => t('!field_name', array('!field_name' => $field['field_name'])), - 'join_extra' => array( - 0 => array( - 'field' => 'deleted', - 'value' => 0, - 'numeric' => TRUE, - ), + $data['file_managed'][$pseudo_field_name]['relationship'] = array( + 'title' => t('@entity using @field', array('@entity' => $entity_label, '@field' => $label)), + 'help' => t('Relate each @entity with a @field set to the image.', array('@entity' => $entity_label, '@field' => $label)), + 'id' => 'entity_reverse', + 'field_name' => $field['field_name'], + 'entity_type' => $field['entity_type'], + 'field table' => DatabaseStorageController::_fieldTableName($field), + 'field field' => $field['field_name'] . '_target_id', + 'base' => $entity_info['base_table'], + 'base field' => $entity_info['entity_keys']['id'], + 'label' => t('!field_name', array('!field_name' => $field['field_name'])), + 'join_extra' => array( + 0 => array( + 'field' => 'deleted', + 'value' => 0, + 'numeric' => TRUE, ), - ); - } + ), + ); } diff --git a/core/modules/taxonomy/taxonomy.views.inc b/core/modules/taxonomy/taxonomy.views.inc index 25c0c40..9b37e9e 100644 --- a/core/modules/taxonomy/taxonomy.views.inc +++ b/core/modules/taxonomy/taxonomy.views.inc @@ -338,8 +338,8 @@ function taxonomy_views_data_alter(&$data) { * * @see field_views_field_default_views_data() */ -function taxonomy_field_views_data(FieldInterface $field, array $sql_entity_types) { - $data = field_views_field_default_views_data($field, $sql_entity_types); +function taxonomy_field_views_data(FieldInterface $field) { + $data = field_views_field_default_views_data($field); foreach ($data as $table_name => $table_data) { foreach ($table_data as $field_name => $field_data) { if (isset($field_data['filter']) && $field_name != 'delta') { @@ -366,37 +366,33 @@ function taxonomy_field_views_data(FieldInterface $field, array $sql_entity_type * * Views integration to provide reverse relationships on term references. */ -function taxonomy_field_views_data_views_data_alter(array &$data, FieldInterface $field, array $sql_entity_types) { - foreach ($sql_entity_types as $entity_type) { - $entity_info = entity_get_info($entity_type); - $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; - - list($label, $all_labels) = field_views_field_label($field['field_name']); - $entity = $entity_info['label']; - if ($entity == t('Node')) { - $entity = t('Content'); - } - - $data['taxonomy_term_data'][$pseudo_field_name]['relationship'] = array( - 'title' => t('@entity using @field', array('@entity' => $entity, '@field' => $label)), - 'help' => t('Relate each @entity with a @field set to the term.', array('@entity' => $entity, '@field' => $label)), - 'id' => 'entity_reverse', - 'field_name' => $field['field_name'], - 'entity_type' => $field['entity_type'], - 'field table' => DatabaseStorageController::_fieldTableName($field), - 'field field' => $field['field_name'] . '_target_id', - 'base' => $entity_info['base_table'], - 'base field' => $entity_info['entity_keys']['id'], - 'label' => t('!field_name', array('!field_name' => $field['field_name'])), - 'join_extra' => array( - 0 => array( - 'field' => 'deleted', - 'value' => 0, - 'numeric' => TRUE, - ), +function taxonomy_field_views_data_views_data_alter(array &$data, FieldInterface $field) { + $entity_type = $field['entity_type']; + $entity_info = entity_get_info($entity_type); + $pseudo_field_name = 'reverse_' . $field['field_name'] . '_' . $entity_type; + + list($label,) = field_views_field_label($entity_type, $field['field_name']); + $entity_label = ($entity_info['label'] == t('Node')) ? t('Content') : $entity_info['label']; + + $data['taxonomy_term_data'][$pseudo_field_name]['relationship'] = array( + 'title' => t('@entity using @field', array('@entity' => $entity_label, '@field' => $label)), + 'help' => t('Relate each @entity with a @field set to the term.', array('@entity' => $entity_label, '@field' => $label)), + 'id' => 'entity_reverse', + 'field_name' => $field['field_name'], + 'entity_type' => $field['entity_type'], + 'field table' => DatabaseStorageController::_fieldTableName($field), + 'field field' => $field['field_name'] . '_target_id', + 'base' => $entity_info['base_table'], + 'base field' => $entity_info['entity_keys']['id'], + 'label' => t('!field_name', array('!field_name' => $field['field_name'])), + 'join_extra' => array( + 0 => array( + 'field' => 'deleted', + 'value' => 0, + 'numeric' => TRUE, ), - ); - } + ), + ); } /**