annotate core/modules/update/update.report.inc @ 0:c75dbcec494b

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