annotate core/modules/datetime_range/datetime_range.module @ 4:a9cd425dd02b

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:11:55 +0000
parents c75dbcec494b
children 12f9dff5fda9
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Field hooks to implement a datetime field that stores a start and end date.
Chris@0 6 */
Chris@0 7
Chris@0 8 use Drupal\Core\Routing\RouteMatchInterface;
Chris@4 9 use Drupal\views\Views;
Chris@4 10 use Drupal\views\ViewEntityInterface;
Chris@0 11
Chris@0 12 /**
Chris@0 13 * Implements hook_help().
Chris@0 14 */
Chris@0 15 function datetime_range_help($route_name, RouteMatchInterface $route_match) {
Chris@0 16 switch ($route_name) {
Chris@0 17 case 'help.page.datetime_range':
Chris@0 18 $output = '';
Chris@0 19 $output .= '<h3>' . t('About') . '</h3>';
Chris@0 20 $output .= '<p>' . t('The Datetime Range module provides a Date field that stores start dates and times, as well as end dates and times. See the <a href=":field">Field module help</a> and the <a href=":field_ui">Field UI module help</a> pages for general information on fields and how to create and manage them. For more information, see the <a href=":datetime_do">online documentation for the Datetime Range module</a>.', [':field' => \Drupal::url('help.page', ['name' => 'field']), ':field_ui' => (\Drupal::moduleHandler()->moduleExists('field_ui')) ? \Drupal::url('help.page', ['name' => 'field_ui']) : '#', ':datetime_do' => 'https://www.drupal.org/documentation/modules/datetime_range']) . '</p>';
Chris@0 21 $output .= '<h3>' . t('Uses') . '</h3>';
Chris@0 22 $output .= '<dl>';
Chris@0 23 $output .= '<dt>' . t('Managing and displaying date fields') . '</dt>';
Chris@0 24 $output .= '<dd>' . t('The <em>settings</em> and the <em>display</em> of the Date field can be configured separately. See the <a href=":field_ui">Field UI help</a> for more information on how to manage fields and their display.', [':field_ui' => (\Drupal::moduleHandler()->moduleExists('field_ui')) ? \Drupal::url('help.page', ['name' => 'field_ui']) : '#']) . '</dd>';
Chris@0 25 $output .= '<dt>' . t('Displaying dates') . '</dt>';
Chris@0 26 $output .= '<dd>' . t('Dates can be displayed using the <em>Plain</em> or the <em>Default</em> formatter. The <em>Plain</em> formatter displays the date in the <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> format. If you choose the <em>Default</em> formatter, you can choose a format from a predefined list that can be managed on the <a href=":date_format_list">Date and time formats</a> page.', [':date_format_list' => \Drupal::url('entity.date_format.collection')]) . '</dd>';
Chris@0 27 $output .= '</dl>';
Chris@0 28 return $output;
Chris@0 29 }
Chris@0 30 }
Chris@4 31
Chris@4 32 /**
Chris@4 33 * Implements hook_view_presave().
Chris@4 34 *
Chris@4 35 * When a view is saved using the old string or standard plugin format for
Chris@4 36 * Datetime Range filters or sorts, they will automatically be updated to
Chris@4 37 * Datetime filters or sorts. Old plugins usage must to be considered
Chris@4 38 * deprecated and must be converted before 9.0.0, when this updating layer will
Chris@4 39 * be removed.
Chris@4 40 *
Chris@4 41 * @deprecated in Drupal 8.5.x and will be removed before 9.0.0.
Chris@4 42 *
Chris@4 43 * @see https://www.drupal.org/node/2857691
Chris@4 44 */
Chris@4 45 function datetime_range_view_presave(ViewEntityInterface $view) {
Chris@4 46 $config_factory = \Drupal::configFactory();
Chris@4 47 $displays = $view->get('display');
Chris@4 48 $changed = FALSE;
Chris@4 49
Chris@4 50 foreach ($displays as $display_name => &$display) {
Chris@4 51
Chris@4 52 // Update datetime_range filters.
Chris@4 53 if (isset($display['display_options']['filters'])) {
Chris@4 54 foreach ($display['display_options']['filters'] as $field_name => &$filter) {
Chris@4 55 if ($filter['plugin_id'] === 'string') {
Chris@4 56 $table_data = Views::viewsData()->get($filter['table']);
Chris@4 57 if (!$table_data) {
Chris@4 58 continue;
Chris@4 59 }
Chris@4 60
Chris@4 61 // Get field config.
Chris@4 62 $filter_views_data = $table_data[$filter['field']]['filter'];
Chris@4 63 if (!isset($filter_views_data['entity_type']) || !isset($filter_views_data['field_name'])) {
Chris@4 64 continue;
Chris@4 65 }
Chris@4 66 $field_storage_name = 'field.storage.' . $filter_views_data['entity_type'] . '.' . $filter_views_data['field_name'];
Chris@4 67 $field_configuration = $config_factory->get($field_storage_name);
Chris@4 68
Chris@4 69 if ($field_configuration->get('type') === 'daterange') {
Chris@4 70
Chris@4 71 // Set entity_type if missing.
Chris@4 72 if (!isset($filter['entity_type'])) {
Chris@4 73 $filter['entity_type'] = $filter_views_data['entity_type'];
Chris@4 74 }
Chris@4 75
Chris@4 76 // Set datetime plugin_id.
Chris@4 77 $filter['plugin_id'] = 'datetime';
Chris@4 78
Chris@4 79 // Create datetime value array.
Chris@4 80 $datetime_value = [
Chris@4 81 'min' => '',
Chris@4 82 'max' => '',
Chris@4 83 'value' => $filter['value'],
Chris@4 84 'type' => 'date',
Chris@4 85 ];
Chris@4 86
Chris@4 87 // Map string operator/value to numeric equivalent.
Chris@4 88 switch ($filter['operator']) {
Chris@4 89 case '=':
Chris@4 90 case 'empty':
Chris@4 91 case 'not empty':
Chris@4 92 $operator = $filter['operator'];
Chris@4 93 break;
Chris@4 94
Chris@4 95 case '!=':
Chris@4 96 case 'not':
Chris@4 97 $operator = '!=';
Chris@4 98 break;
Chris@4 99
Chris@4 100 case 'starts':
Chris@4 101 $operator = 'regular_expression';
Chris@4 102 $datetime_value['value'] = '^' . preg_quote($datetime_value['value']);
Chris@4 103 break;
Chris@4 104
Chris@4 105 case 'ends':
Chris@4 106 $operator = 'regular_expression';
Chris@4 107 $datetime_value['value'] = preg_quote($datetime_value['value']) . '$';
Chris@4 108 break;
Chris@4 109
Chris@4 110 default:
Chris@4 111 $operator = 'regular_expression';
Chris@4 112 // Add .* to prevent blank regexes.
Chris@4 113 if (empty($datetime_value['value'])) {
Chris@4 114 $datetime_value['value'] = '.*';
Chris@4 115 }
Chris@4 116 else {
Chris@4 117 $datetime_value['value'] = preg_quote($datetime_value['value']);
Chris@4 118 }
Chris@4 119 }
Chris@4 120
Chris@4 121 // Set value and operator.
Chris@4 122 $filter['value'] = $datetime_value;
Chris@4 123 $filter['operator'] = $operator;
Chris@4 124 $changed = TRUE;
Chris@4 125 @trigger_error('Use of string filters for datetime_range fields is deprecated. Use the datetime filters instead. See https://www.drupal.org/node/2857691', E_USER_DEPRECATED);
Chris@4 126 }
Chris@4 127 }
Chris@4 128 }
Chris@4 129 }
Chris@4 130
Chris@4 131 // Update datetime_range sort handlers.
Chris@4 132 if (isset($display['display_options']['sorts'])) {
Chris@4 133 foreach ($display['display_options']['sorts'] as $field_name => &$sort) {
Chris@4 134 if ($sort['plugin_id'] === 'standard') {
Chris@4 135 $table_data = Views::viewsData()->get($sort['table']);
Chris@4 136 if (!$table_data) {
Chris@4 137 continue;
Chris@4 138 }
Chris@4 139
Chris@4 140 // Get field config.
Chris@4 141 $sort_views_data = $table_data[$sort['field']]['sort'];
Chris@4 142 if (!isset($sort_views_data['entity_type']) || !isset($sort_views_data['field_name'])) {
Chris@4 143 continue;
Chris@4 144 }
Chris@4 145 $field_storage_name = 'field.storage.' . $sort_views_data['entity_type'] . '.' . $sort_views_data['field_name'];
Chris@4 146 $field_configuration = $config_factory->get($field_storage_name);
Chris@4 147
Chris@4 148 if ($field_configuration->get('type') === 'daterange') {
Chris@4 149
Chris@4 150 // Set entity_type if missing.
Chris@4 151 if (!isset($sort['entity_type'])) {
Chris@4 152 $sort['entity_type'] = $sort_views_data['entity_type'];
Chris@4 153 }
Chris@4 154
Chris@4 155 // Set datetime plugin_id.
Chris@4 156 $sort['plugin_id'] = 'datetime';
Chris@4 157 $changed = TRUE;
Chris@4 158 @trigger_error('Use of standard sort handlers for datetime_range fields is deprecated. Use the datetime sort handlers instead. See https://www.drupal.org/node/2857691', E_USER_DEPRECATED);
Chris@4 159 }
Chris@4 160 }
Chris@4 161 }
Chris@4 162 }
Chris@4 163 }
Chris@4 164
Chris@4 165 if ($changed) {
Chris@4 166 $view->set('display', $displays);
Chris@4 167 }
Chris@4 168 }