SystemController::themesPage

public SystemController::themesPage()

Returns a theme listing.

@todo Move into ThemeController.

Return value

string An HTML string of the theme listing page.

File

core/modules/system/src/Controller/SystemController.php, line 195

Class

SystemController
Returns responses for System routes.

Namespace

Drupal\system\Controller

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
public function themesPage() {
  $config = $this->config('system.theme');
  // Get all available themes.
  $themes = $this->themeHandler->rebuildThemeData();
  uasort($themes, 'system_sort_modules_by_info_name');
 
  $theme_default = $config->get('default');
  $theme_groups = array('installed' => array(), 'uninstalled' => array());
  $admin_theme = $config->get('admin');
  $admin_theme_options = array();
 
  foreach ($themes as &$theme) {
    if (!empty($theme->info['hidden'])) {
      continue;
    }
    $theme->is_default = ($theme->getName() == $theme_default);
    $theme->is_admin = ($theme->getName() == $admin_theme || ($theme->is_default && $admin_theme == '0'));
 
    // Identify theme screenshot.
    $theme->screenshot = NULL;
    // Create a list which includes the current theme and all its base themes.
    if (isset($themes[$theme->getName()]->base_themes)) {
      $theme_keys = array_keys($themes[$theme->getName()]->base_themes);
      $theme_keys[] = $theme->getName();
    }
    else {
      $theme_keys = array($theme->getName());
    }
    // Look for a screenshot in the current theme or in its closest ancestor.
    foreach (array_reverse($theme_keys) as $theme_key) {
      if (isset($themes[$theme_key]) && file_exists($themes[$theme_key]->info['screenshot'])) {
        $theme->screenshot = array(
          'uri' => $themes[$theme_key]->info['screenshot'],
          'alt' => $this->t('Screenshot for @theme theme', array('@theme' => $theme->info['name'])),
          'title' => $this->t('Screenshot for @theme theme', array('@theme' => $theme->info['name'])),
          'attributes' => array('class' => array('screenshot')),
        );
        break;
      }
    }
 
    if (empty($theme->status)) {
      // Ensure this theme is compatible with this version of core.
      $theme->incompatible_core = !isset($theme->info['core']) || ($theme->info['core'] != \DRUPAL::CORE_COMPATIBILITY);
      // Require the 'content' region to make sure the main page
      // content has a common place in all themes.
      $theme->incompatible_region = !isset($theme->info['regions']['content']);
      $theme->incompatible_php = version_compare(phpversion(), $theme->info['php']) < 0;
      // Confirm that all base themes are available.
      $theme->incompatible_base = (isset($theme->info['base theme']) && !($theme->base_themes === array_filter($theme->base_themes)));
      // Confirm that the theme engine is available.
      $theme->incompatible_engine = isset($theme->info['engine']) && !isset($theme->owner);
    }
    $theme->operations = array();
    if (!empty($theme->status) || !$theme->incompatible_core && !$theme->incompatible_php && !$theme->incompatible_base && !$theme->incompatible_engine) {
      // Create the operations links.
      $query['theme'] = $theme->getName();
      if ($this->themeAccess->checkAccess($theme->getName())) {
        $theme->operations[] = array(
          'title' => $this->t('Settings'),
          'url' => Url::fromRoute('system.theme_settings_theme', ['theme' => $theme->getName()]),
          'attributes' => array('title' => $this->t('Settings for @theme theme', array('@theme' => $theme->info['name']))),
        );
      }
      if (!empty($theme->status)) {
        if (!$theme->is_default) {
          $theme_uninstallable = TRUE;
          if ($theme->getName() == $admin_theme) {
            $theme_uninstallable = FALSE;
          }
          // Check it isn't the base of theme of an installed theme.
          foreach ($theme->required_by as $themename => $dependency) {
            if (!empty($themes[$themename]->status)) {
              $theme_uninstallable = FALSE;
            }
          }
          if ($theme_uninstallable) {
            $theme->operations[] = array(
              'title' => $this->t('Uninstall'),
              'url' => Url::fromRoute('system.theme_uninstall'),
              'query' => $query,
              'attributes' => array('title' => $this->t('Uninstall @theme theme', array('@theme' => $theme->info['name']))),
            );
          }
          $theme->operations[] = array(
            'title' => $this->t('Set as default'),
            'url' => Url::fromRoute('system.theme_set_default'),
            'query' => $query,
            'attributes' => array('title' => $this->t('Set @theme as default theme', array('@theme' => $theme->info['name']))),
          );
        }
        $admin_theme_options[$theme->getName()] = $theme->info['name'];
      }
      else {
        $theme->operations[] = array(
          'title' => $this->t('Install'),
          'url' => Url::fromRoute('system.theme_install'),
          'query' => $query,
          'attributes' => array('title' => $this->t('Install @theme theme', array('@theme' => $theme->info['name']))),
        );
        $theme->operations[] = array(
          'title' => $this->t('Install and set as default'),
          'url' => Url::fromRoute('system.theme_set_default'),
          'query' => $query,
          'attributes' => array('title' => $this->t('Install @theme as default theme', array('@theme' => $theme->info['name']))),
        );
      }
    }
 
    // Add notes to default and administration theme.
    $theme->notes = array();
    if ($theme->is_default) {
      $theme->notes[] = $this->t('default theme');
    }
    if ($theme->is_admin) {
      $theme->notes[] = $this->t('administration theme');
    }
 
    // Sort installed and uninstalled themes into their own groups.
    $theme_groups[$theme->status ? 'installed' : 'uninstalled'][] = $theme;
  }
 
  // There are two possible theme groups.
  $theme_group_titles = array(
    'installed' => $this->formatPlural(count($theme_groups['installed']), 'Installed theme', 'Installed themes'),
  );
  if (!empty($theme_groups['uninstalled'])) {
    $theme_group_titles['uninstalled'] = $this->formatPlural(count($theme_groups['uninstalled']), 'Uninstalled theme', 'Uninstalled themes');
  }
 
  uasort($theme_groups['installed'], 'system_sort_themes');
  $this->moduleHandler()->alter('system_themes_page', $theme_groups);
 
  $build = array();
  $build[] = array(
    '#theme' => 'system_themes_page',
    '#theme_groups' => $theme_groups,
    '#theme_group_titles' => $theme_group_titles,
  );
  $build[] = $this->formBuilder->getForm('Drupal\system\Form\ThemeAdminForm', $admin_theme_options);
 
  return $build;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.