diff --git a/core/includes/entity.inc b/core/includes/entity.inc index 3f8aa98..aebf687 100644 --- a/core/includes/entity.inc +++ b/core/includes/entity.inc @@ -90,10 +90,12 @@ function entity_get_info($entity_type = NULL) { $view_mode = config($config_name)->get(); $definition = array( 'label' => check_plain($view_mode['label']), - 'custom settings' => FALSE, + 'custom settings' => $view_mode['custom'], ); - foreach (array_filter($view_mode['entityTypes']) as $key => $value) { - $entity_info[$key]['view modes'][$view_mode['name']] = $definition; + $name = strtok($view_mode['name'], '.'); + $name = strtok('.'); + if (isset($view_mode['type']) && !empty($name)) { + $entity_info[$view_mode['type']]['view modes'][$name] = $definition; } } diff --git a/core/lib/Drupal/Core/Entity/EntityViewMode.php b/core/lib/Drupal/Core/Entity/ViewMode/EntityViewMode.php similarity index 83% rename from core/lib/Drupal/Core/Entity/EntityViewMode.php rename to core/lib/Drupal/Core/Entity/ViewMode/EntityViewMode.php index 564c1ea..47f2078 100644 --- a/core/lib/Drupal/Core/Entity/EntityViewMode.php +++ b/core/lib/Drupal/Core/Entity/ViewMode/EntityViewMode.php @@ -2,10 +2,10 @@ /** * @file - * Definition of Drupal\Core\Entity\EntityViewMode. + * Definition of Drupal\Core\Entity\ViewMode\EntityViewMode. */ -namespace Drupal\Core\Entity; +namespace Drupal\Core\Entity\ViewMode; use Drupal\Core\Config\Entity\ConfigEntityBase; @@ -43,7 +43,11 @@ class EntityViewMode extends ConfigEntityBase { * * @var array */ - public $entityTypes = array(); + public $bundles = array(); + + public $type; + + public $custom = FALSE; /** * Overrides Drupal\Core\Core\Entity\Entity::id(). @@ -52,6 +56,11 @@ public function id() { return $this->name; } + public function name() { + $name = strtok($this->name, '.'); + return strtok('.'); + } + /** * Overrides Drupal\Core\Core\Entity\Entity::uri(). */ diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index df0a33a..f628422 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -120,12 +120,6 @@ function comment_entity_info() { ), 'bundles' => array(), 'render controller class' => 'Drupal\comment\CommentRenderController', - 'view modes' => array( - 'full' => array( - 'label' => t('Full comment'), - 'custom settings' => FALSE, - ), - ), 'static cache' => FALSE, ), ); diff --git a/core/modules/comment/config/view_mode.comment.full.yml b/core/modules/comment/config/view_mode.comment.full.yml new file mode 100644 index 0000000..23a7a33 --- /dev/null +++ b/core/modules/comment/config/view_mode.comment.full.yml @@ -0,0 +1,4 @@ +name: comment.full +label: Full comment +custom: '0' +type: comment diff --git a/core/modules/entity_ui/entity_ui.admin.inc b/core/modules/entity_ui/entity_ui.admin.inc index 8b55c90..69e505a 100644 --- a/core/modules/entity_ui/entity_ui.admin.inc +++ b/core/modules/entity_ui/entity_ui.admin.inc @@ -8,22 +8,35 @@ /** * Menu callback: list all view modes. */ -function view_mode_list() { - return entity_list_controller('view_mode')->render(); +function entity_ui_view_mode_list() { + $build = array(); + $controller = entity_list_controller('view_mode'); + foreach (entity_get_info() as $type => $info) { + if ($type == 'view_mode') { + continue; + } + + $build[$type] = array( + '#type' => 'fieldset', + '#title' => $info['label'], + ); + $build[$type]['view_modes'] = $controller->set($type)->render(); + } + return $build; } /** * Menu callback: view mode edit form. */ -function view_mode_add() { - $view_mode = entity_create('view_mode', array()); +function entity_ui_view_mode_add($type) { + $view_mode = entity_create('view_mode', array('type' => $type)); return entity_get_form($view_mode); } /** * Menu callback: view mode delete confirm form. */ -function view_mode_delete_form($form, $form_state, $view_mode) { +function entity_ui_view_mode_delete_form($form, $form_state, $view_mode) { $form['#view_mode'] = $view_mode; $form['name'] = array( @@ -46,7 +59,7 @@ function view_mode_delete_form($form, $form_state, $view_mode) { /** * Submit handler: delete a view mode. */ -function view_mode_delete_form_submit($form, &$form_state) { +function entity_ui_view_mode_delete_form_submit($form, &$form_state) { drupal_set_message(t('Deleted the %view-mode view mode.', array( '%view-mode' => $form['#view_mode']->label(), ))); diff --git a/core/modules/entity_ui/entity_ui.module b/core/modules/entity_ui/entity_ui.module index 5c14354..38df289 100644 --- a/core/modules/entity_ui/entity_ui.module +++ b/core/modules/entity_ui/entity_ui.module @@ -36,16 +36,16 @@ function entity_ui_menu() { $items['admin/config/system/view-modes'] = array( 'title' => 'View modes', 'description' => 'Manage custom view modes.', - 'page callback' => 'view_mode_list', + 'page callback' => 'entity_ui_view_mode_list', 'access arguments' => array('administer view modes'), 'file' => 'entity_ui.admin.inc', ); - $items['admin/config/system/view-modes/add'] = array( + $items['admin/config/system/view-modes/add/%'] = array( 'title' => 'Add view mode', - 'page callback' => 'view_mode_add', + 'page callback' => 'entity_ui_view_mode_add', + 'page arguments' => array(5), 'access arguments' => array('administer view modes'), 'file' => 'entity_ui.admin.inc', - 'type' => MENU_LOCAL_ACTION, ); $items['admin/config/system/view-modes/%view_mode/edit'] = array( 'title' => 'Edit view mode', @@ -56,7 +56,7 @@ function entity_ui_menu() { $items['admin/config/system/view-modes/%view_mode/delete'] = array( 'title' => 'Delete view mode', 'page callback' => 'drupal_get_form', - 'page arguments' => array('view_mode_delete_form', 4), + 'page arguments' => array('entity_ui_view_mode_delete_form', 4), 'access arguments' => array('administer view modes'), 'file' => 'entity_ui.admin.inc', ); @@ -72,6 +72,13 @@ function view_mode_load($machine_name) { } /** + * Checks for an existing view mode. + */ +function view_mode_exists($machine_name, $element) { + return view_mode_load($element['#entity_type'] . ".$machine_name"); +} + +/** * Implements hook_view_mode_presave(). */ function entity_ui_view_mode_presave(EntityInterface $entity) { diff --git a/core/modules/entity_ui/lib/Drupal/entity_ui/Tests/ViewModeTest.php b/core/modules/entity_ui/lib/Drupal/entity_ui/Tests/ViewModeTest.php index e369da4..f70f4b8 100644 --- a/core/modules/entity_ui/lib/Drupal/entity_ui/Tests/ViewModeTest.php +++ b/core/modules/entity_ui/lib/Drupal/entity_ui/Tests/ViewModeTest.php @@ -46,10 +46,11 @@ function createViewMode(&$edit = array()) { $edit += array( 'label' => 'Testing', 'name' => 'testing', - 'entityTypes[node]' => '1' + 'custom' => TRUE, + 'bundles[article]' => TRUE, ); - $this->drupalPost('admin/config/system/view-modes/add', $edit, t('Save')); + $this->drupalPost('admin/config/system/view-modes/add/node', $edit, t('Save')); $this->assertText(format_string('Saved the !name view mode.', array('!name' => $edit['label']))); } @@ -61,7 +62,7 @@ function testManageViewModes() { $this->createViewMode($edit); // Create the same and assert it already exists. - $this->drupalPost('admin/config/system/view-modes/add', $edit, t('Save')); + $this->drupalPost('admin/config/system/view-modes/add/node', $edit, t('Save')); $this->assertText('The machine-readable name is already in use. It must be unique.', 'View mode testing already exists.'); // Assert it's found on the Field UI for article. @@ -76,11 +77,11 @@ function testManageViewModes() { $edit = array( 'label' => 'Testing 2', ); - $this->drupalPost('admin/config/system/view-modes/testing/edit', $edit, t('Save')); + $this->drupalPost('admin/config/system/view-modes/node.testing/edit', $edit, t('Save')); $this->assertText('Saved the Testing 2 view mode.', 'Testing label updated.'); // Remove a view mode. - $this->drupalPost('admin/config/system/view-modes/testing/delete', array(), t('Delete')); + $this->drupalPost('admin/config/system/view-modes/node.testing/delete', array(), t('Delete')); $this->assertText('Deleted the Testing 2 view mode', 'Deleted the Testing view mode.'); // Assert the view mode is gone at the manage display screen. diff --git a/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeFormController.php b/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeFormController.php index a2e97e2..646057c 100644 --- a/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeFormController.php +++ b/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeFormController.php @@ -19,6 +19,12 @@ class ViewModeFormController extends EntityFormController { * Overrides Drupal\Core\Entity\EntityFormController::form(). */ public function form(array $form, array &$form_state, EntityInterface $view_mode) { + $entity_info = entity_get_info($view_mode->type); + $form['type'] = array( + '#type' => 'item', + '#title' => t('Entity type'), + '#markup' => $entity_info['label'], + ); $form['label'] = array( '#type' => 'textfield', '#title' => t('Label'), @@ -30,32 +36,56 @@ public function form(array $form, array &$form_state, EntityInterface $view_mode '#type' => 'machine_name', '#machine_name' => array( 'source' => array('label'), - 'exists' => 'view_mode_load', + 'exists' => 'view_mode_exists', ), - '#default_value' => $view_mode->name, + '#entity_type' => $view_mode->type, + '#default_value' => $view_mode->name(), '#disabled' => !empty($view_mode->label), + '#field_prefix' => "$view_mode->type.", ); - $options = array(); - $entity_info = entity_get_info(); - foreach ($entity_info as $entity_type => $info) { - if (!empty($info['fieldable'])) { - $options[$entity_type] = $info['label']; - } - } + $form['custom'] = array( + '#type' => 'checkbox', + '#title' => t('Use custom display settings'), + '#description' => t('Unchecking this will delete all the display settings for this view mode.'), + '#default_value' => $view_mode->custom, + ); - $form['entityTypes'] = array( - '#required' => TRUE, + $form['bundles'] = array( '#type' => 'checkboxes', '#title' => t('Enable this view mode for the following types'), - '#options' => $options, - '#default_value' => $view_mode->getUsedEntityTypes(), + '#description' => t('Unchecking a type that has already been configured will delete the display settings for this view mode.'), + '#options' => array_map(function ($bundle) { + return $bundle['label']; + }, $entity_info['bundles'] + ), + '#default_value' => array_filter( + array_keys($entity_info['bundles']), + function ($option) use ($view_mode) { + $settings = field_view_mode_settings($view_mode->type, $option); + return !empty($settings[$view_mode->name()]['custom_settings']); + } + ), + '#states' => array( + 'visible' => array( + ':input[name="custom"]' => array('checked' => TRUE), + ), + ), ); return $form; } /** + * Overrides Drupal\Core\Entity\EntityFormController::validate(). + */ + public function validate(array $form, array &$form_state) { + $entity = clone $this->getEntity($form_state); + form_set_value($form['name'], $entity->type . '.' . $form_state['values']['name'], $form_state); + parent::validate($form, $form_state); + } + + /** * Overrides Drupal\Core\Entity\EntityFormController::save(). * * @todo Move this code to the base controller: http://drupal.org/node/1728786 diff --git a/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeListController.php b/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeListController.php index f55f701..d4cfab7 100644 --- a/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeListController.php +++ b/core/modules/entity_ui/lib/Drupal/entity_ui/ViewModeListController.php @@ -15,13 +15,31 @@ */ class ViewModeListController extends ConfigEntityListController { + protected $type; + + public function set($type) { + $this->type = entity_get_info($type); + $this->type['type'] = $type; + return $this; + } + + /** + * Overrides Drupal\Core\Entity\EntityListController::load(). + */ + public function load() { + $type = $this->type['type']; + return array_filter(parent::load(), function ($entity) use ($type) { + return $entity->type == $type; + }); + } + /** * Overrides Drupal\Core\Entity\EntityListController::buildHeader(); */ public function buildHeader() { $header = parent::buildHeader(); $operations = array_pop($header); - $header['entities'] = t('Entities'); + $header['custom'] = t('Custom settings'); $header['operations'] = $operations; return $header; } @@ -30,16 +48,30 @@ public function buildHeader() { * Overrides Drupal\Core\Entity\EntityListController::buildRow(); */ public function buildRow(EntityInterface $view_mode) { - $row = parent::buildRow($view_mode); - $operations = array_pop($row); - $entity_types = array(); - $entity_info = entity_get_info(); - foreach ($view_mode->getUsedEntityTypes() as $entity_type) { - $entity_types[] = $entity_info[$entity_type]['label']; - } - $row['entities'] = implode(', ', $entity_types); - $row['operations'] = $operations; + $row['label'] = $view_mode->label(); + $row['id'] = $view_mode->name(); + $row['custom'] = $view_mode->custom ? t('Yes') : t('No'); + $row['operations']['data'] = $this->buildOperations($view_mode); return $row; } + /** + * Overrides Drupal\Core\Entity\EntityListController::buildRow(); + */ + public function render() { + $build = parent::render(); + $build['#rows']['_add_new'][] = array( + 'data' => array( + '#type' => 'link', + '#href' => 'admin/config/system/view-modes/add/' . $this->type['type'], + '#title' => t('Add new %type view mode', array('%type' => $this->type['label'])), + '#options' => array( + 'html' => TRUE, + ), + ), + 'colspan' => count($build['#header']), + ); + return $build; + } + } diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module index b3dc6f0..497ef49 100644 --- a/core/modules/field_ui/field_ui.module +++ b/core/modules/field_ui/field_ui.module @@ -1,9 +1,12 @@ bundles as $bundle => $custom) { + $bundle_settings = field_bundle_settings($view_mode->type, $bundle); + $bundle_settings['view_modes'][$view_mode->name()]['custom_settings'] = (bool) $custom; + field_bundle_settings($view_mode->type, $bundle, $bundle_settings); + } +} diff --git a/core/modules/file/config/view_mode.file.full.yml b/core/modules/file/config/view_mode.file.full.yml new file mode 100644 index 0000000..c8065a1 --- /dev/null +++ b/core/modules/file/config/view_mode.file.full.yml @@ -0,0 +1,4 @@ +name: file.full +label: File default +custom: '0' +type: file diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 4e6c8eb..c008cb3 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -102,12 +102,6 @@ function file_entity_info() { 'label' => 'filename', 'uuid' => 'uuid', ), - 'view modes' => array( - 'full' => array( - 'label' => t('File default'), - 'custom settings' => FALSE, - ), - ), 'static cache' => FALSE, ), ); diff --git a/core/modules/node/config/view_mode.node.full.yml b/core/modules/node/config/view_mode.node.full.yml new file mode 100644 index 0000000..1614340 --- /dev/null +++ b/core/modules/node/config/view_mode.node.full.yml @@ -0,0 +1,4 @@ +name: node.full +label: Full content +custom: '0' +type: node diff --git a/core/modules/node/config/view_mode.node.rss.yml b/core/modules/node/config/view_mode.node.rss.yml new file mode 100644 index 0000000..96213fe --- /dev/null +++ b/core/modules/node/config/view_mode.node.rss.yml @@ -0,0 +1,4 @@ +name: node.rss +label: RSS +custom: '0' +type: node diff --git a/core/modules/node/config/view_mode.node.teaser.yml b/core/modules/node/config/view_mode.node.teaser.yml new file mode 100644 index 0000000..d5dd1f4 --- /dev/null +++ b/core/modules/node/config/view_mode.node.teaser.yml @@ -0,0 +1,4 @@ +name: node.teaser +label: Teaser +custom: '1' +type: node diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 30a6dd5..b947e5a 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -218,20 +218,6 @@ function node_entity_info() { ), 'bundles' => array(), 'render controller class' => 'Drupal\node\NodeRenderController', - 'view modes' => array( - 'full' => array( - 'label' => t('Full content'), - 'custom settings' => FALSE, - ), - 'teaser' => array( - 'label' => t('Teaser'), - 'custom settings' => TRUE, - ), - 'rss' => array( - 'label' => t('RSS'), - 'custom settings' => FALSE, - ), - ), ), ); @@ -240,21 +226,6 @@ function node_entity_info() { $return['node']['translation']['node'] = TRUE; } - // 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')) { - $return['node']['view modes'] += array( - 'search_index' => array( - 'label' => t('Search index'), - 'custom settings' => FALSE, - ), - 'search_result' => array( - 'label' => t('Search result'), - 'custom settings' => FALSE, - ), - ); - } - // Bundles must provide a human readable name so we can create help and error // messages, and the path to attach Field admin pages to. node_type_cache_reset(); diff --git a/core/modules/search/config/view_mode.node.search_index.yml b/core/modules/search/config/view_mode.node.search_index.yml new file mode 100644 index 0000000..a8155bc --- /dev/null +++ b/core/modules/search/config/view_mode.node.search_index.yml @@ -0,0 +1,4 @@ +name: node.search_index +label: Search index +custom: '0' +type: node diff --git a/core/modules/search/config/view_mode.node.search_result.yml b/core/modules/search/config/view_mode.node.search_result.yml new file mode 100644 index 0000000..9e8b02f --- /dev/null +++ b/core/modules/search/config/view_mode.node.search_result.yml @@ -0,0 +1,4 @@ +name: node.search_result +label: Search result +custom: '0' +type: node diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 7c6266d..83c767a 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -1087,7 +1087,7 @@ function system_entity_info() { $return = array( 'view_mode' => array( 'label' => t('View mode'), - 'entity class' => 'Drupal\Core\Entity\EntityViewMode', + 'entity class' => 'Drupal\Core\Entity\ViewMode\EntityViewMode', 'controller class' => 'Drupal\Core\Config\Entity\ConfigStorageController', 'config prefix' => 'view_mode', 'fieldable' => FALSE, diff --git a/core/modules/taxonomy/config/view_mode.taxonomy_term.full.yml b/core/modules/taxonomy/config/view_mode.taxonomy_term.full.yml new file mode 100644 index 0000000..03ccf14 --- /dev/null +++ b/core/modules/taxonomy/config/view_mode.taxonomy_term.full.yml @@ -0,0 +1,4 @@ +name: taxonomy_term.full +label: Taxonomy term page +custom: '0' +type: taxonomy_term diff --git a/core/modules/taxonomy/config/view_mode.taxonomy_vocabulary.full.yml b/core/modules/taxonomy/config/view_mode.taxonomy_vocabulary.full.yml new file mode 100644 index 0000000..0b32697 --- /dev/null +++ b/core/modules/taxonomy/config/view_mode.taxonomy_vocabulary.full.yml @@ -0,0 +1,4 @@ +name: taxonomy_vocabulary.full +label: Taxonomy vocabulary default +custom: '0' +type: taxonomy_vocabulary diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index 874c78a..3d142b5 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -131,13 +131,6 @@ function taxonomy_entity_info() { ), 'bundles' => array(), 'render controller class' => 'Drupal\taxonomy\TermRenderController', - 'view modes' => array( - // @todo View mode for display as a field (when attached to nodes etc). - 'full' => array( - 'label' => t('Taxonomy term page'), - 'custom settings' => FALSE, - ), - ), ), ); foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) { @@ -164,12 +157,6 @@ function taxonomy_entity_info() { 'label' => 'name', ), 'fieldable' => FALSE, - 'view modes' => array( - 'full' => array( - 'label' => t('Taxonomy vocabulary default'), - 'custom settings' => FALSE, - ), - ), ); return $return; diff --git a/core/modules/user/config/view_mode.user.full.yml b/core/modules/user/config/view_mode.user.full.yml new file mode 100644 index 0000000..a1fd93f --- /dev/null +++ b/core/modules/user/config/view_mode.user.full.yml @@ -0,0 +1,4 @@ +name: user.full +label: User account +custom: '0' +type: user diff --git a/core/modules/user/user.module b/core/modules/user/user.module index fae45ad..ad13b3d 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -169,12 +169,6 @@ function user_entity_info() { ), ), 'render controller class' => 'Drupal\user\UserRenderController', - 'view modes' => array( - 'full' => array( - 'label' => t('User account'), - 'custom settings' => FALSE, - ), - ), ), ); } diff --git a/core/profiles/standard/standard.info b/core/profiles/standard/standard.info index 8b8a33b..28db9c6 100644 --- a/core/profiles/standard/standard.info +++ b/core/profiles/standard/standard.info @@ -22,3 +22,4 @@ dependencies[] = overlay dependencies[] = field_ui dependencies[] = file dependencies[] = rdf +dependencies[] = entity_ui