diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php index 656f088..65725b6 100644 --- a/core/includes/entity.api.php +++ b/core/includes/entity.api.php @@ -31,46 +31,6 @@ function hook_entity_info(&$entity_info) { } /** - * Describe the view modes for entity types. - * - * View modes let entities be displayed differently depending on the context. - * For instance, a node can be displayed differently on its own page ('full' - * mode), on the home page or taxonomy listings ('teaser' mode), or in an RSS - * feed ('rss' mode). Modules taking part in the display of the entity (notably - * the Field API) can adjust their behavior depending on the requested view - * mode. An additional 'default' view mode is available for all entity types. - * This view mode is not intended for actual entity display, but holds default - * display settings. For each available view mode, administrators can configure - * whether it should use its own set of field display settings, or just - * replicate the settings of the 'default' view mode, thus reducing the amount - * of display configurations to keep track of. - * - * @return array - * An associative array of all entity view modes, keyed by the entity - * type name, and then the view mode name, with the following keys: - * - label: The human-readable name of the view mode. - * - custom_settings: A boolean specifying whether the view mode should by - * default use its own custom field display settings. If FALSE, entities - * displayed in this view mode will reuse the 'default' display settings - * by default (e.g. right after the module exposing the view mode is - * enabled), but administrators can later use the Field UI to apply custom - * display settings specific to the view mode. - * - * @see entity_get_view_modes() - * @see hook_entity_view_mode_info_alter() - */ -function hook_entity_view_mode_info() { - $view_modes['user']['full'] = array( - 'label' => t('User account'), - ); - $view_modes['user']['compact'] = array( - 'label' => t('Compact'), - 'custom_settings' => TRUE, - ); - return $view_modes; -} - -/** * Alter the view modes for entity types. * * @param array $view_modes @@ -80,7 +40,7 @@ function hook_entity_view_mode_info() { * @see hook_entity_view_mode_info() */ function hook_entity_view_mode_info_alter(&$view_modes) { - $view_modes['user']['full']['custom_settings'] = TRUE; + $view_modes['user']['full']['status'] = TRUE; } /** diff --git a/core/includes/entity.inc b/core/includes/entity.inc index 41e8add..b691db9 100644 --- a/core/includes/entity.inc +++ b/core/includes/entity.inc @@ -121,13 +121,10 @@ function entity_get_view_modes($entity_type = NULL) { $view_modes = $cache->data; } else { - $view_modes = module_invoke_all('entity_view_mode_info'); - foreach ($view_modes as $type => $entity_info) { - foreach ($entity_info as $view_mode => $view_mode_info) { - $view_modes[$type][$view_mode] += array( - 'custom_settings' => FALSE, - ); - } + $view_modes = array(); + foreach (entity_load_multiple('view_mode') as $view_mode) { + list($view_mode_entity_type, $view_mode_name) = explode('.', $view_mode->id()); + $view_modes[$view_mode_entity_type][$view_mode_name] = (array) $view_mode; } drupal_alter('entity_view_mode_info', $view_modes); cache()->set("entity_view_mode_info:$langcode", $view_modes, CacheBackendInterface::CACHE_PERMANENT, array('entity_info' => TRUE)); @@ -704,7 +701,7 @@ function entity_get_render_display(EntityInterface $entity, $view_mode) { // configuration of the view mode for this bundle, this will be either the // display associated to the view mode, or the 'default' display. $view_mode_settings = field_view_mode_settings($entity_type, $bundle); - $render_view_mode = !empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default'; + $render_view_mode = !empty($view_mode_settings[$view_mode]['status']) ? $view_mode : 'default'; $display = entity_get_display($entity_type, $bundle, $render_view_mode); $display->originalViewMode = $view_mode; diff --git a/core/modules/block/custom_block/config/entity.view_mode.custom_block.full.yml b/core/modules/block/custom_block/config/entity.view_mode.custom_block.full.yml new file mode 100644 index 0000000..8d346a2 --- /dev/null +++ b/core/modules/block/custom_block/config/entity.view_mode.custom_block.full.yml @@ -0,0 +1,5 @@ +id: custom_block.full +label: Full +status: '0' +targetEntityType: custom_block +locked: '1' diff --git a/core/modules/block/custom_block/custom_block.module b/core/modules/block/custom_block/custom_block.module index e8ffbf0..d831a29 100644 --- a/core/modules/block/custom_block/custom_block.module +++ b/core/modules/block/custom_block/custom_block.module @@ -189,16 +189,6 @@ function custom_block_entity_bundle_info() { } /** - * Implements hook_entity_view_mode_info(). - */ -function custom_block_entity_view_mode_info() { - $view_modes['custom_block']['full'] = array( - 'label' => t('Full'), - ); - return $view_modes; -} - -/** * Adds the default body field to a custom block type. * * @param string $block_type_id diff --git a/core/modules/book/book.module b/core/modules/book/book.module index a94b8f2..cb3dbaa 100644 --- a/core/modules/book/book.module +++ b/core/modules/book/book.module @@ -256,17 +256,6 @@ function book_admin_paths() { } /** - * Implements hook_entity_view_mode_info(). - */ -function book_entity_view_mode_info() { - // Add the 'Print' view mode for nodes. - $view_modes['node']['print'] = array( - 'label' => t('Print'), - ); - return $view_modes; -} - -/** * Returns an array of all books. * * @todo Remove in favor of BookManager Service. http://drupal.org/node/1963894 diff --git a/core/modules/book/config/entity.view_mode.node.print.yml b/core/modules/book/config/entity.view_mode.node.print.yml new file mode 100644 index 0000000..621896b --- /dev/null +++ b/core/modules/book/config/entity.view_mode.node.print.yml @@ -0,0 +1,5 @@ +id: node.print +label: Print +status: '0' +targetEntityType: node +locked: '1' diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 6d0d003..7cb532f 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -98,16 +98,6 @@ function comment_help($path, $arg) { } /** - * Implements hook_entity_view_mode_info(). - */ -function comment_entity_view_mode_info() { - $view_modes['comment']['full'] = array( - 'label' => t('Full comment'), - ); - return $view_modes; -} - -/** * Implements hook_entity_bundle_info(). */ function comment_entity_bundle_info() { diff --git a/core/modules/comment/config/entity.view_mode.comment.full.yml b/core/modules/comment/config/entity.view_mode.comment.full.yml new file mode 100644 index 0000000..1dd3383 --- /dev/null +++ b/core/modules/comment/config/entity.view_mode.comment.full.yml @@ -0,0 +1,5 @@ +id: comment.full +label: Full comment +status: '0' +targetEntityType: comment +locked: '1' diff --git a/core/modules/entity/lib/Drupal/entity/EntityViewModeInterface.php b/core/modules/entity/lib/Drupal/entity/EntityViewModeInterface.php new file mode 100644 index 0000000..718479f --- /dev/null +++ b/core/modules/entity/lib/Drupal/entity/EntityViewModeInterface.php @@ -0,0 +1,17 @@ + $view_mode_info) { - if (!isset($settings[$view_mode]['custom_settings']) && $view_mode_info['custom_settings']) { - $settings[$view_mode]['custom_settings'] = TRUE; + if (!isset($settings[$view_mode]['status']) && $view_mode_info['status']) { + $settings[$view_mode]['status'] = TRUE; } } $cache[$entity_type][$bundle] = $settings; diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc index d5b5e57..32f20b3 100644 --- a/core/modules/field/tests/modules/field_test/field_test.entity.inc +++ b/core/modules/field/tests/modules/field_test/field_test.entity.inc @@ -38,11 +38,11 @@ function field_test_entity_view_mode_info_alter(&$view_modes) { $view_modes[$entity_type] = array( 'full' => array( 'label' => t('Full object'), - 'custom_settings' => TRUE, + 'status' => TRUE, ), 'teaser' => array( 'label' => t('Teaser'), - 'custom_settings' => TRUE, + 'status' => TRUE, ), ); } diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module index 88d2ce7..cce8734 100644 --- a/core/modules/field_ui/field_ui.module +++ b/core/modules/field_ui/field_ui.module @@ -1,9 +1,12 @@ set('menu_rebuild_needed', TRUE); +} + +/** + * Implements hook_view_mode_delete(). + */ +function field_ui_view_mode_delete(EntityViewModeInterface $view_mode) { + state()->set('menu_rebuild_needed', TRUE); +} diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php b/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php index 640ae84..1ddb8b5 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php @@ -32,7 +32,7 @@ public function access(Route $route, Request $request) { $view_mode = $request->attributes->get('view_mode'); $view_mode_settings = field_view_mode_settings($entity_type, $bundle); - $visibility = ($view_mode == 'default') || !empty($view_mode_settings[$view_mode]['custom_settings']); + $visibility = ($view_mode == 'default') || !empty($view_mode_settings[$view_mode]['status']); if ($visibility) { $permission = $route->getRequirement('_field_ui_view_mode_access'); return user_access($permission); diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php index cf4f6de..f8c440b 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php @@ -361,7 +361,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle); foreach ($view_modes as $view_mode_name => $view_mode_info) { $options[$view_mode_name] = $view_mode_info['label']; - if (!empty($view_mode_settings[$view_mode_name]['custom_settings'])) { + if (!empty($view_mode_settings[$view_mode_name]['status'])) { $default[] = $view_mode_name; } } @@ -476,7 +476,7 @@ public function submitForm(array &$form, array &$form_state) { $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle); foreach ($form_values['view_modes_custom'] as $view_mode => $value) { - if (!empty($value) && empty($view_mode_settings[$view_mode]['custom_settings'])) { + if (!empty($value) && empty($view_mode_settings[$view_mode]['status'])) { // If no display exists for the newly enabled view mode, initialize // it with those from the 'default' view mode, which were used so // far. @@ -489,7 +489,7 @@ public function submitForm(array &$form, array &$form_state) { $path = $this->entityManager->getAdminPath($this->entity_type, $this->bundle) . "/display/$view_mode"; drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to configure them.', array('%view_mode' => $view_mode_label, '@url' => url($path)))); } - $bundle_settings['view_modes'][$view_mode]['custom_settings'] = !empty($value); + $bundle_settings['view_modes'][$view_mode]['status'] = !empty($value); } // Save updated bundle settings. diff --git a/core/modules/file/config/entity.view_mode.file.full.yml b/core/modules/file/config/entity.view_mode.file.full.yml new file mode 100644 index 0000000..4852de7 --- /dev/null +++ b/core/modules/file/config/entity.view_mode.file.full.yml @@ -0,0 +1,5 @@ +id: file.full +label: File default +status: '0' +targetEntityType: file +locked: '1' diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 79b63ef..18dae26 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -91,16 +91,6 @@ function file_element_info() { } /** - * Implements hook_entity_view_mode_info(). - */ -function file_entity_view_mode_info() { - $view_modes['file']['full'] = array( - 'label' => t('File default'), - ); - return $view_modes; -} - -/** * Loads file entities from the database. * * @param array $fids diff --git a/core/modules/node/config/entity.view_mode.node.full.yml b/core/modules/node/config/entity.view_mode.node.full.yml new file mode 100644 index 0000000..aabb62e --- /dev/null +++ b/core/modules/node/config/entity.view_mode.node.full.yml @@ -0,0 +1,5 @@ +id: node.full +label: Full content +status: '0' +targetEntityType: node +locked: '1' diff --git a/core/modules/node/config/entity.view_mode.node.rss.yml b/core/modules/node/config/entity.view_mode.node.rss.yml new file mode 100644 index 0000000..62bf8f7 --- /dev/null +++ b/core/modules/node/config/entity.view_mode.node.rss.yml @@ -0,0 +1,5 @@ +id: node.rss +label: RSS +status: '0' +targetEntityType: node +locked: '1' diff --git a/core/modules/node/config/entity.view_mode.node.teaser.yml b/core/modules/node/config/entity.view_mode.node.teaser.yml new file mode 100644 index 0000000..a604a3c --- /dev/null +++ b/core/modules/node/config/entity.view_mode.node.teaser.yml @@ -0,0 +1,5 @@ +id: node.teaser +label: Teaser +status: '1' +targetEntityType: node +locked: '1' diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 7ba5d23..051feb8 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -181,33 +181,6 @@ function node_theme() { } /** - * Implements hook_entity_view_mode_info(). - */ -function node_entity_view_mode_info() { - $view_modes['node']['full'] = array( - 'label' => t('Full content'), - ); - $view_modes['node']['teaser'] = array( - 'label' => t('Teaser'), - 'custom_settings' => TRUE, - ); - $view_modes['node']['rss'] = array( - 'label' => t('RSS'), - ); - // Search integration is provided by node.module, so search-related - // view modes for nodes are defined here and not in search.module. - if (module_exists('search')) { - $view_modes['node']['search_index'] = array( - 'label' => t('Search index'), - ); - $view_modes['node']['search_result'] = array( - 'label' => t('Search result'), - ); - } - return $view_modes; -} - -/** * Implements hook_entity_bundle_info(). */ function node_entity_bundle_info() { diff --git a/core/modules/search/config/entity.view_mode.node.search_index.yml b/core/modules/search/config/entity.view_mode.node.search_index.yml new file mode 100644 index 0000000..eed60ff --- /dev/null +++ b/core/modules/search/config/entity.view_mode.node.search_index.yml @@ -0,0 +1,5 @@ +id: node.search_index +label: Search index +status: '0' +targetEntityType: node +locked: '1' diff --git a/core/modules/search/config/entity.view_mode.node.search_result.yml b/core/modules/search/config/entity.view_mode.node.search_result.yml new file mode 100644 index 0000000..fe7f028 --- /dev/null +++ b/core/modules/search/config/entity.view_mode.node.search_result.yml @@ -0,0 +1,5 @@ +id: node.search_result +label: Search result +status: '0' +targetEntityType: node +locked: '1' diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php index 9fe3328..33f7903 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilledStandardUpgradePathTest.php @@ -99,6 +99,13 @@ public function testFilledStandardUpgrade() { $this->assertEqual($blog_type->module, 'node', "Content type 'blog' has been reassigned from the blog module to the node module."); $this->assertEqual($blog_type->base, 'node_content', "The base string used to construct callbacks corresponding to content type 'Blog' has been reassigned to 'node_content'."); + // Each entity type has a 'full' view mode, ensure it was migrated. + $all_view_modes = entity_get_view_modes(); + $this->assertTrue(!empty($all_view_modes), 'The view modes have been migrated.'); + foreach ($all_view_modes as $entity_view_modes) { + $this->assertTrue(isset($entity_view_modes['full'])); + } + // Check that user data has been migrated correctly. $query = db_query('SELECT * FROM {users_data}'); diff --git a/core/modules/system/system.install b/core/modules/system/system.install index 2a6f76c..35529f0 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -2142,6 +2142,58 @@ function system_update_8055() { } /** + * Moves entity view modes to config. + * + * @ingroup config_upgrade + */ +function system_update_8056() { + // We cannot call entity_get_info() in an update hook, so we hardcode the view + // modes. Only the node entity type's teaser view mode is set to custom by + // default, we check specifically for that below. The only way to add custom + // view modes in Drupal 7 was hook_entity_info_alter(), which still works in + // Drupal 8. + $entity_view_modes = array( + 'node' => array( + 'full' => 'Full content', + 'teaser' => 'Teaser', + 'rss' => 'RSS', + 'search_index' => 'Search index', + 'search_result' => 'Search result', + 'print' => 'Print', + ), + 'file' => array( + 'full' => 'File default', + ), + 'comment' => array( + 'full' => 'Full comment', + ), + 'user' => array( + 'full' => 'User account', + 'compact' => 'Compact', + ), + 'taxonomy_term' => array( + 'full' => 'Taxonomy term page', + ), + 'taxonomy_vocabulary' => array( + 'full' => 'Taxonomy vocabulary', + ), + ); + + foreach ($entity_view_modes as $entity_type => $view_modes) { + foreach ($view_modes as $key => $name) { + $status = in_array($key, array('teaser', 'compact')); + config("entity.view_mode.$entity_type.$key") + ->set('id', "$entity_type.$key") + ->set('label', $name) + ->set('targetEntityType', $entity_type) + ->set('locked', TRUE) + ->set('status', $status) + ->save(); + } + } +} + +/** * @} End of "defgroup updates-7.x-to-8.x". * The next series of updates should start at 9000. */ diff --git a/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.full.yml b/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.full.yml new file mode 100644 index 0000000..e599269 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.full.yml @@ -0,0 +1,5 @@ +id: entity_test_render.full +label: Full +status: '0' +targetEntityType: entity_test_render +locked: '1' diff --git a/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.test.yml b/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.test.yml new file mode 100644 index 0000000..05ec0bc --- /dev/null +++ b/core/modules/system/tests/modules/entity_test/config/entity.view_mode.entity_test_render.test.yml @@ -0,0 +1,5 @@ +id: entity_test_render.test +label: Test +status: '0' +targetEntityType: entity_test_render +locked: '1' diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module index 673ab67..0770738 100644 --- a/core/modules/system/tests/modules/entity_test/entity_test.module +++ b/core/modules/system/tests/modules/entity_test/entity_test.module @@ -339,20 +339,6 @@ function entity_test_label_callback($entity_type, $entity, $langcode = NULL) { } /** - * Implements hook_entity_view_mode_info(). - */ -function entity_test_entity_view_mode_info() { - $view_modes['entity_test_render']['full'] = array( - 'label' => t('Full'), - ); - $view_modes['entity_test_render']['test'] = array( - 'label' => t('Test'), - ); - - return $view_modes; -} - -/** * Implements hook_entity_field_access(). * * @see \Drupal\system\Tests\Entity\FieldAccessTest::testFieldAccess() diff --git a/core/modules/system/tests/upgrade/drupal-7.field.database.php b/core/modules/system/tests/upgrade/drupal-7.field.database.php index 9434c7c..48950aa 100644 --- a/core/modules/system/tests/upgrade/drupal-7.field.database.php +++ b/core/modules/system/tests/upgrade/drupal-7.field.database.php @@ -12,19 +12,19 @@ $value = array( 'view_modes' => array( 'teaser' => array( - 'custom_settings' => 1, + 'status' => 1, ), 'full' => array( - 'custom_settings' => 0, + 'status' => 0, ), 'rss' => array( - 'custom_settings' => 0, + 'status' => 0, ), 'search_index' => array( - 'custom_settings' => 0, + 'status' => 0, ), 'search_result' => array( - 'custom_settings' => 0, + 'status' => 0, ), ), 'extra_fields' => array( diff --git a/core/modules/taxonomy/config/entity.view_mode.taxonomy_term.full.yml b/core/modules/taxonomy/config/entity.view_mode.taxonomy_term.full.yml new file mode 100644 index 0000000..4dbd78b --- /dev/null +++ b/core/modules/taxonomy/config/entity.view_mode.taxonomy_term.full.yml @@ -0,0 +1,5 @@ +id: taxonomy_term.full +label: Taxonomy term page +status: '0' +targetEntityType: taxonomy_term +locked: '1' diff --git a/core/modules/taxonomy/config/entity.view_mode.taxonomy_vocabulary.full.yml b/core/modules/taxonomy/config/entity.view_mode.taxonomy_vocabulary.full.yml new file mode 100644 index 0000000..f84e9b3 --- /dev/null +++ b/core/modules/taxonomy/config/entity.view_mode.taxonomy_vocabulary.full.yml @@ -0,0 +1,5 @@ +id: vocabulary.full +label: Taxonomy vocabulary +status: '0' +targetEntityType: taxonomy_vocabulary +locked: '1' diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index d576b54..0a7da4d 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -106,19 +106,6 @@ function taxonomy_permission() { } /** - * Implements hook_entity_view_mode_info(). - */ -function taxonomy_entity_view_mode_info() { - $view_modes['taxonomy_term']['full'] = array( - 'label' => t('Taxonomy term page'), - ); - $view_modes['taxonomy_vocabulary']['full'] = array( - 'label' => t('Taxonomy vocabulary'), - ); - return $view_modes; -} - -/** * Implements hook_entity_bundle_info(). */ function taxonomy_entity_bundle_info() { diff --git a/core/modules/user/config/entity.view_mode.user.compact.yml b/core/modules/user/config/entity.view_mode.user.compact.yml new file mode 100644 index 0000000..58f0696 --- /dev/null +++ b/core/modules/user/config/entity.view_mode.user.compact.yml @@ -0,0 +1,5 @@ +id: user.compact +label: Compact +status: '1' +targetEntityType: user +locked: '1' diff --git a/core/modules/user/config/entity.view_mode.user.full.yml b/core/modules/user/config/entity.view_mode.user.full.yml new file mode 100644 index 0000000..486ebc7 --- /dev/null +++ b/core/modules/user/config/entity.view_mode.user.full.yml @@ -0,0 +1,5 @@ +id: user.full +label: User account +status: '0' +targetEntityType: user +locked: '1' diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 5afcfd9..8242904 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -126,20 +126,6 @@ function user_page_build(&$page) { } /** - * Implements hook_entity_view_mode_info(). - */ -function user_entity_view_mode_info() { - $view_modes['user']['full'] = array( - 'label' => t('User account'), - ); - $view_modes['user']['compact'] = array( - 'label' => t('Compact'), - 'custom_settings' => TRUE, - ); - return $view_modes; -} - -/** * Implements hook_entity_bundle_info(). */ function user_entity_bundle_info() {