annotate core/modules/update/update.report.inc @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Code required only when rendering the available updates report.
Chris@0 6 */
Chris@0 7
Chris@0 8 use Drupal\Core\Template\Attribute;
Chris@0 9 use Drupal\Core\Url;
Chris@0 10
Chris@0 11 /**
Chris@0 12 * Prepares variables for project status report templates.
Chris@0 13 *
Chris@0 14 * Default template: update-report.html.twig.
Chris@0 15 *
Chris@0 16 * @param array $variables
Chris@0 17 * An associative array containing:
Chris@0 18 * - data: An array of data about each project's status.
Chris@0 19 */
Chris@0 20 function template_preprocess_update_report(&$variables) {
Chris@0 21 $data = $variables['data'];
Chris@0 22
Chris@0 23 $last = \Drupal::state()->get('update.last_check') ?: 0;
Chris@0 24
Chris@0 25 $variables['last_checked'] = [
Chris@0 26 '#theme' => 'update_last_check',
Chris@0 27 '#last' => $last,
Chris@0 28 // Attach the library to a variable that gets printed always.
Chris@0 29 '#attached' => [
Chris@0 30 'library' => [
Chris@0 31 'update/drupal.update.admin',
Chris@0 32 ],
Chris@17 33 ],
Chris@0 34 ];
Chris@0 35
Chris@0 36 // For no project update data, populate no data message.
Chris@0 37 if (empty($data)) {
Chris@0 38 $variables['no_updates_message'] = _update_no_data();
Chris@0 39 }
Chris@0 40
Chris@0 41 $rows = [];
Chris@0 42
Chris@0 43 foreach ($data as $project) {
Chris@0 44 $project_status = [
Chris@0 45 '#theme' => 'update_project_status',
Chris@0 46 '#project' => $project,
Chris@0 47 ];
Chris@0 48
Chris@0 49 // Build project rows.
Chris@0 50 if (!isset($rows[$project['project_type']])) {
Chris@0 51 $rows[$project['project_type']] = [
Chris@0 52 '#type' => 'table',
Chris@0 53 '#attributes' => ['class' => ['update']],
Chris@0 54 ];
Chris@0 55 }
Chris@17 56 $row_key = !empty($project['title']) ? mb_strtolower($project['title']) : mb_strtolower($project['name']);
Chris@0 57
Chris@0 58 // Add the project status row and details.
Chris@0 59 $rows[$project['project_type']][$row_key]['status'] = $project_status;
Chris@0 60
Chris@0 61 // Add project status class attribute to the table row.
Chris@0 62 switch ($project['status']) {
Chris@0 63 case UPDATE_CURRENT:
Chris@0 64 $rows[$project['project_type']][$row_key]['#attributes'] = ['class' => ['color-success']];
Chris@0 65 break;
Chris@0 66 case UPDATE_UNKNOWN:
Chris@0 67 case UPDATE_FETCH_PENDING:
Chris@0 68 case UPDATE_NOT_FETCHED:
Chris@0 69 case UPDATE_NOT_SECURE:
Chris@0 70 case UPDATE_REVOKED:
Chris@0 71 case UPDATE_NOT_SUPPORTED:
Chris@0 72 $rows[$project['project_type']][$row_key]['#attributes'] = ['class' => ['color-error']];
Chris@0 73 break;
Chris@0 74 case UPDATE_NOT_CHECKED:
Chris@0 75 case UPDATE_NOT_CURRENT:
Chris@0 76 default:
Chris@0 77 $rows[$project['project_type']][$row_key]['#attributes'] = ['class' => ['color-warning']];
Chris@0 78 break;
Chris@0 79 }
Chris@0 80 }
Chris@0 81
Chris@0 82 $project_types = [
Chris@0 83 'core' => t('Drupal core'),
Chris@0 84 'module' => t('Modules'),
Chris@0 85 'theme' => t('Themes'),
Chris@0 86 'module-disabled' => t('Uninstalled modules'),
Chris@0 87 'theme-disabled' => t('Uninstalled themes'),
Chris@0 88 ];
Chris@0 89
Chris@0 90 $variables['project_types'] = [];
Chris@0 91 foreach ($project_types as $type_name => $type_label) {
Chris@0 92 if (!empty($rows[$type_name])) {
Chris@0 93 ksort($rows[$type_name]);
Chris@0 94 $variables['project_types'][] = [
Chris@0 95 'label' => $type_label,
Chris@0 96 'table' => $rows[$type_name],
Chris@0 97 ];
Chris@0 98 }
Chris@0 99 }
Chris@0 100 }
Chris@0 101
Chris@0 102 /**
Chris@0 103 * Prepares variables for update project status templates.
Chris@0 104 *
Chris@0 105 * Default template: update-project-status.html.twig.
Chris@0 106 *
Chris@0 107 * @param array $variables
Chris@0 108 * An associative array containing:
Chris@0 109 * - project: An array of information about the project.
Chris@0 110 */
Chris@0 111 function template_preprocess_update_project_status(&$variables) {
Chris@0 112 // Storing by reference because we are sorting the project values.
Chris@0 113 $project = &$variables['project'];
Chris@0 114
Chris@0 115 // Set the project title and URL.
Chris@0 116 $variables['title'] = (isset($project['title'])) ? $project['title'] : $project['name'];
Chris@0 117 $variables['url'] = (isset($project['link'])) ? Url::fromUri($project['link'])->toString() : NULL;
Chris@0 118
Chris@0 119 $variables['install_type'] = $project['install_type'];
Chris@0 120 if ($project['install_type'] == 'dev' && !empty($project['datestamp'])) {
Chris@18 121 $variables['datestamp'] = \Drupal::service('date.formatter')->format($project['datestamp'], 'custom', 'Y-M-d');
Chris@0 122 }
Chris@0 123
Chris@0 124 $variables['existing_version'] = $project['existing_version'];
Chris@0 125
Chris@0 126 $versions_inner = [];
Chris@0 127 $security_class = [];
Chris@0 128 $version_class = [];
Chris@0 129 if (isset($project['recommended'])) {
Chris@0 130 if ($project['status'] != UPDATE_CURRENT || $project['existing_version'] !== $project['recommended']) {
Chris@0 131
Chris@0 132 // First, figure out what to recommend.
Chris@0 133 // If there's only 1 security update and it has the same version we're
Chris@0 134 // recommending, give it the same CSS class as if it was recommended,
Chris@0 135 // but don't print out a separate "Recommended" line for this project.
Chris@0 136 if (!empty($project['security updates'])
Chris@0 137 && count($project['security updates']) == 1
Chris@0 138 && $project['security updates'][0]['version'] === $project['recommended']
Chris@0 139 ) {
Chris@0 140 $security_class[] = 'project-update__version--recommended';
Chris@0 141 $security_class[] = 'project-update__version---strong';
Chris@0 142 }
Chris@0 143 else {
Chris@0 144 $version_class[] = 'project-update__version--recommended';
Chris@0 145 // Apply an extra class if we're displaying both a recommended
Chris@0 146 // version and anything else for an extra visual hint.
Chris@0 147 if ($project['recommended'] !== $project['latest_version']
Chris@0 148 || !empty($project['also'])
Chris@0 149 || ($project['install_type'] == 'dev'
Chris@0 150 && isset($project['dev_version'])
Chris@0 151 && $project['latest_version'] !== $project['dev_version']
Chris@0 152 && $project['recommended'] !== $project['dev_version'])
Chris@0 153 || (isset($project['security updates'][0])
Chris@0 154 && $project['recommended'] !== $project['security updates'][0])
Chris@0 155 ) {
Chris@0 156 $version_class[] = 'project-update__version--recommended-strong';
Chris@0 157 }
Chris@0 158 $versions_inner[] = [
Chris@0 159 '#theme' => 'update_version',
Chris@0 160 '#version' => $project['releases'][$project['recommended']],
Chris@0 161 '#title' => t('Recommended version:'),
Chris@0 162 '#attributes' => ['class' => $version_class],
Chris@0 163 ];
Chris@0 164 }
Chris@0 165
Chris@0 166 // Now, print any security updates.
Chris@0 167 if (!empty($project['security updates'])) {
Chris@0 168 $security_class[] = 'version-security';
Chris@0 169 foreach ($project['security updates'] as $security_update) {
Chris@0 170 $versions_inner[] = [
Chris@0 171 '#theme' => 'update_version',
Chris@0 172 '#version' => $security_update,
Chris@0 173 '#title' => t('Security update:'),
Chris@0 174 '#attributes' => ['class' => $security_class],
Chris@0 175 ];
Chris@0 176 }
Chris@0 177 }
Chris@0 178 }
Chris@0 179
Chris@0 180 if ($project['recommended'] !== $project['latest_version']) {
Chris@0 181 $versions_inner[] = [
Chris@0 182 '#theme' => 'update_version',
Chris@0 183 '#version' => $project['releases'][$project['latest_version']],
Chris@0 184 '#title' => t('Latest version:'),
Chris@0 185 '#attributes' => ['class' => ['version-latest']],
Chris@0 186 ];
Chris@0 187 }
Chris@0 188 if ($project['install_type'] == 'dev'
Chris@0 189 && $project['status'] != UPDATE_CURRENT
Chris@0 190 && isset($project['dev_version'])
Chris@0 191 && $project['recommended'] !== $project['dev_version']) {
Chris@0 192 $versions_inner[] = [
Chris@0 193 '#theme' => 'update_version',
Chris@0 194 '#version' => $project['releases'][$project['dev_version']],
Chris@0 195 '#title' => t('Development version:'),
Chris@0 196 '#attributes' => ['class' => ['version-latest']],
Chris@0 197 ];
Chris@0 198 }
Chris@0 199 }
Chris@0 200
Chris@0 201 if (isset($project['also'])) {
Chris@0 202 foreach ($project['also'] as $also) {
Chris@0 203 $versions_inner[] = [
Chris@0 204 '#theme' => 'update_version',
Chris@0 205 '#version' => $project['releases'][$also],
Chris@0 206 '#title' => t('Also available:'),
Chris@0 207 '#attributes' => ['class' => ['version-also-available']],
Chris@0 208 ];
Chris@0 209 }
Chris@0 210 }
Chris@0 211
Chris@0 212 if (!empty($versions_inner)) {
Chris@0 213 $variables['versions'] = $versions_inner;
Chris@0 214 }
Chris@0 215
Chris@0 216 if (!empty($project['disabled'])) {
Chris@0 217 sort($project['disabled']);
Chris@0 218 $variables['disabled'] = $project['disabled'];
Chris@0 219 }
Chris@0 220
Chris@0 221 sort($project['includes']);
Chris@0 222 $variables['includes'] = $project['includes'];
Chris@0 223
Chris@0 224 $variables['extras'] = [];
Chris@0 225 if (!empty($project['extra'])) {
Chris@0 226 foreach ($project['extra'] as $value) {
Chris@0 227 $extra_item = [];
Chris@0 228 $extra_item['attributes'] = new Attribute();
Chris@0 229 $extra_item['label'] = $value['label'];
Chris@0 230 $extra_item['data'] = [
Chris@0 231 '#prefix' => '<em>',
Chris@0 232 '#markup' => $value['data'],
Chris@17 233 '#suffix' => '</em>',
Chris@0 234 ];
Chris@0 235 $variables['extras'][] = $extra_item;
Chris@0 236 }
Chris@0 237 }
Chris@0 238
Chris@0 239 // Set the project status details.
Chris@0 240 $status_label = NULL;
Chris@0 241 switch ($project['status']) {
Chris@0 242 case UPDATE_NOT_SECURE:
Chris@0 243 $status_label = t('Security update required!');
Chris@0 244 break;
Chris@0 245 case UPDATE_REVOKED:
Chris@0 246 $status_label = t('Revoked!');
Chris@0 247 break;
Chris@0 248 case UPDATE_NOT_SUPPORTED:
Chris@0 249 $status_label = t('Not supported!');
Chris@0 250 break;
Chris@0 251 case UPDATE_NOT_CURRENT:
Chris@0 252 $status_label = t('Update available');
Chris@0 253 break;
Chris@0 254 case UPDATE_CURRENT:
Chris@0 255 $status_label = t('Up to date');
Chris@0 256 break;
Chris@0 257 }
Chris@0 258 $variables['status']['label'] = $status_label;
Chris@0 259 $variables['status']['attributes'] = new Attribute();
Chris@0 260 $variables['status']['reason'] = (isset($project['reason'])) ? $project['reason'] : NULL;
Chris@0 261
Chris@0 262 switch ($project['status']) {
Chris@0 263 case UPDATE_CURRENT:
Chris@0 264 $uri = 'core/misc/icons/73b355/check.svg';
Chris@0 265 $text = t('Ok');
Chris@0 266 break;
Chris@0 267 case UPDATE_UNKNOWN:
Chris@0 268 case UPDATE_FETCH_PENDING:
Chris@0 269 case UPDATE_NOT_FETCHED:
Chris@0 270 $uri = 'core/misc/icons/e29700/warning.svg';
Chris@0 271 $text = t('Warning');
Chris@0 272 break;
Chris@0 273 case UPDATE_NOT_SECURE:
Chris@0 274 case UPDATE_REVOKED:
Chris@0 275 case UPDATE_NOT_SUPPORTED:
Chris@0 276 $uri = 'core/misc/icons/e32700/error.svg';
Chris@0 277 $text = t('Error');
Chris@0 278 break;
Chris@0 279 case UPDATE_NOT_CHECKED:
Chris@0 280 case UPDATE_NOT_CURRENT:
Chris@0 281 default:
Chris@0 282 $uri = 'core/misc/icons/e29700/warning.svg';
Chris@0 283 $text = t('Warning');
Chris@0 284 break;
Chris@0 285 }
Chris@0 286
Chris@0 287 $variables['status']['icon'] = [
Chris@0 288 '#theme' => 'image',
Chris@0 289 '#width' => 18,
Chris@0 290 '#height' => 18,
Chris@0 291 '#uri' => $uri,
Chris@0 292 '#alt' => $text,
Chris@0 293 '#title' => $text,
Chris@0 294 ];
Chris@0 295 }