function EntityViewDisplayOverviewController::overview
Shows the 'Manage display' overview page.
Parameters
string $entity_type_id: The entity type.
string|null $bundle: The entity bundle.
\Drupal\Core\Routing\RouteMatchInterface|null $route_match: The current route match.
Return value
array A render array as expected by \Drupal\Core\Render\RendererInterface::render().
File
-
core/
modules/ field_ui/ src/ Controller/ EntityViewDisplayOverviewController.php, line 40
Class
- EntityViewDisplayOverviewController
- Defines a controller to list entity view displays.
Namespace
Drupal\field_ui\ControllerCode
public function overview(string $entity_type_id, ?string $bundle = NULL, ?RouteMatchInterface $route_match = NULL) : array {
// Get bundle from route match if not provided.
if (empty($bundle) && $route_match) {
$entity_type = $this->entityTypeManager
->getDefinition($entity_type_id);
$bundle_entity_type = $entity_type->getBundleEntityType();
if ($bundle_entity_type) {
$bundle_entity = $route_match->getParameter($bundle_entity_type);
$bundle = $bundle_entity ? $bundle_entity->id() : $route_match->getRawParameter($bundle_entity_type);
}
else {
$bundle = $route_match->getRawParameter('bundle') ?: $entity_type_id;
}
}
$build['#attached']['library'][] = 'field_ui/drupal.field_ui_display_overview';
$manage_view_modes_link = [
'#type' => 'link',
'#title' => $this->t('Manage view modes'),
'#url' => Url::fromRoute('entity.entity_view_mode.collection'),
'#attributes' => [
'class' => [
'action-link',
'action-link--small',
'action-link--icon-cog',
],
],
];
// Get all view modes for this entity type.
$view_modes = $this->entityDisplayRepository
->getViewModes($entity_type_id);
// Sort view modes by label for consistent ordering.
uasort($view_modes, function ($a, $b) {
return strnatcasecmp((string) $a['label'], (string) $b['label']);
});
// Get all entity view displays for this bundle.
$storage = $this->entityTypeManager
->getStorage('entity_view_display');
$displays = $storage->loadByProperties([
'targetEntityType' => $entity_type_id,
'bundle' => $bundle,
]);
// Build table header.
$header = [
'label' => $this->t('View mode'),
'description' => $this->t('Description'),
'operations' => $this->t('Operations'),
];
// Index displays by ID for easier lookup.
$displays_by_id = [];
foreach ($displays as $display) {
$displays_by_id[$display->id()] = $display;
}
// Get the entity type definition to determine the correct bundle parameter.
$entity_type = $this->entityTypeManager
->getDefinition($entity_type_id);
$route_parameters = FieldUI::getRouteBundleParameter($entity_type, $bundle);
// Separate enabled and disabled display modes.
$enabled_rows = [];
$disabled_rows = [];
// Helper function to build a row.
$buildRow = function ($display_id, $label, $view_mode_name = NULL) use ($entity_type_id, $route_parameters, $displays_by_id, $view_modes) {
$display = $displays_by_id[$display_id] ?? NULL;
// Default view mode is always enabled.
$is_enabled = $view_mode_name === 'default' ? TRUE : $display && $display->status();
$edit_url = $view_mode_name === 'default' ? Url::fromRoute("entity.entity_view_display.{$entity_type_id}.default", $route_parameters) : Url::fromRoute("entity.entity_view_display.{$entity_type_id}.view_mode", $route_parameters + [
'view_mode_name' => $view_mode_name,
]);
$toggle_operation = $is_enabled ? 'disable' : 'enable';
$toggle_url = Url::fromRoute("entity.entity_view_display.{$entity_type_id}.toggle_status", $route_parameters + [
'view_mode_name' => $view_mode_name ?: 'default',
'operation' => $toggle_operation,
]);
// Build operations links.
$operations_links = [];
if ($is_enabled) {
$operations_links['manage'] = [
'title' => [
'#markup' => $this->t('Manage <span class="visually-hidden">(@view_mode)</span>', [
'@view_mode' => $label,
]),
],
'url' => $edit_url,
];
// Default view mode cannot be disabled.
if ($view_mode_name !== 'default') {
$operations_links['disable'] = [
'title' => [
'#markup' => $this->t('Disable <span class="visually-hidden">(@view_mode)</span>', [
'@view_mode' => $label,
]),
],
'url' => $toggle_url,
];
}
}
else {
$operations_links['enable'] = [
'title' => [
'#markup' => $this->t('Enable <span class="visually-hidden">(@view_mode)</span>', [
'@view_mode' => $label,
]),
],
'url' => $toggle_url,
];
}
$description = '';
if ($view_mode_name !== NULL && $view_mode_name !== '') {
$description = (string) ($view_modes[$view_mode_name]['description'] ?? '');
}
$row = [
'#attributes' => [
'id' => 'display-mode-' . str_replace([
'.',
'_',
], '-', $display_id),
],
'label' => [
'data' => [
'#markup' => $label,
],
],
'description' => [
'data' => [
'#markup' => $description ?: '',
],
],
'operations' => [
'data' => [
'#type' => 'operations',
'#links' => $operations_links,
],
],
];
return [
'row' => $row,
'enabled' => $is_enabled,
];
};
// Add default display mode. Default is always enabled and cannot be
// disabled.
$default_display_id = $entity_type_id . '.' . $bundle . '.default';
$default_row_data = $buildRow($default_display_id, $this->t('Default'), 'default');
// Always add default to enabled rows, even if status is false.
$enabled_rows['default'] = $default_row_data['row'];
// Add all other view modes (excluding 'default' which we already added).
foreach ($view_modes as $view_mode => $view_mode_info) {
// Skip 'default' as it's already added above.
if ($view_mode === 'default') {
continue;
}
$display_id = $entity_type_id . '.' . $bundle . '.' . $view_mode;
$row_data = $buildRow($display_id, $view_mode_info['label'], $view_mode);
if ($row_data['enabled']) {
$enabled_rows[$view_mode] = $row_data['row'];
}
else {
$disabled_rows[$view_mode] = $row_data['row'];
}
}
// Build enabled table.
if (count($enabled_rows) > 0) {
$build['enabled_wrapper'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'enabled-display-modes-wrapper',
],
];
$build['enabled_wrapper']['heading_wrapper'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'field-ui-display-overview-heading',
],
],
];
$build['enabled_wrapper']['heading_wrapper']['heading'] = [
'#type' => 'html_tag',
'#tag' => 'h2',
'#value' => $this->t('Enabled view modes'),
];
$build['enabled_wrapper']['heading_wrapper']['manage_view_modes'] = $manage_view_modes_link;
$build['enabled_wrapper']['table'] = [
'#type' => 'table',
'#header' => $header,
'#attributes' => [
'class' => [
'display-mode-overview-table',
],
],
];
foreach ($enabled_rows as $key => $row) {
$build['enabled_wrapper']['table'][$key] = $row;
}
}
// Build disabled table.
if (count($disabled_rows) > 0) {
$build['disabled_wrapper'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'disabled-display-modes-wrapper',
],
];
$build['disabled_wrapper']['heading'] = [
'#type' => 'html_tag',
'#tag' => 'h2',
'#value' => $this->t('Disabled view modes'),
];
$build['disabled_wrapper']['table'] = [
'#type' => 'table',
'#header' => $header,
'#attributes' => [
'class' => [
'display-mode-overview-table',
],
],
];
foreach ($disabled_rows as $key => $row) {
$build['disabled_wrapper']['table'][$key] = $row;
}
}
if (count($enabled_rows) === 0 && count($disabled_rows) === 0) {
$build['empty'] = [
'#markup' => '<p>' . $this->t('No display modes available.') . '</p>',
];
}
return $build;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.