Projet

Général

Profil

Paste
Télécharger (5,51 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / feeds / mappers / date.inc @ b5aa1857

1 85ad3d82 Assos Assos
<?php
2
3
/**
4
 * @file
5 7295e063 Assos Assos
 * On behalf implementation of Feeds mapping API for date.module.
6 85ad3d82 Assos Assos
 */
7
8
/**
9 41cc1b08 Assos Assos
 * Implements hook_feeds_processor_targets().
10 85ad3d82 Assos Assos
 */
11 41cc1b08 Assos Assos
function date_feeds_processor_targets($entity_type, $bundle_name) {
12
  $targets = array();
13
14 7295e063 Assos Assos
  $field_types = array(
15
    'date' => TRUE,
16
    'datestamp' => TRUE,
17
    'datetime' => TRUE,
18
  );
19
20 85ad3d82 Assos Assos
  foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
21
    $info = field_info_field($name);
22 7295e063 Assos Assos
23
    if (!isset($field_types[$info['type']])) {
24
      continue;
25
    }
26
27
    $targets[$name . ':start'] = array(
28
      'name' => check_plain($instance['label']),
29
      'callback' => 'date_feeds_set_target',
30
      'description' => t('The start date for the @name field. Also use if mapping both start and end.', array('@name' => $instance['label'])),
31
      'real_target' => $name,
32
      'summary_callbacks' => array('date_feeds_summary_callback'),
33
      'form_callbacks' => array('date_feeds_form_callback'),
34
    );
35
36
    if (!empty($info['settings']['todate'])) {
37
      // Change the label for the start date.
38
      $targets[$name . ':start']['name'] = t('@name: Start', array('@name' => $instance['label']));
39
40 85ad3d82 Assos Assos
      $targets[$name . ':end'] = array(
41
        'name' => t('@name: End', array('@name' => $instance['label'])),
42
        'callback' => 'date_feeds_set_target',
43
        'description' => t('The end date for the @name field.', array('@name' => $instance['label'])),
44
        'real_target' => $name,
45 7295e063 Assos Assos
        'summary_callbacks' => array('date_feeds_summary_callback'),
46
        'form_callbacks' => array('date_feeds_form_callback'),
47 85ad3d82 Assos Assos
      );
48
    }
49
  }
50 41cc1b08 Assos Assos
51
  return $targets;
52 85ad3d82 Assos Assos
}
53
54
/**
55 41cc1b08 Assos Assos
 * Callback for setting date values.
56 85ad3d82 Assos Assos
 */
57 a192dc0b Assos Assos
function date_feeds_set_target(FeedsSource $source, $entity, $target, array $values, array $mapping) {
58 7295e063 Assos Assos
  $language = $mapping['language'];
59
  list($target, $sub_field) = explode(':', $target, 2);
60
61
  $value_key = $sub_field === 'start' ? 'value' : 'value2';
62
  $offset_key = $sub_field === 'start' ? 'offset' : 'offset2';
63
64
  $field = isset($entity->$target) ? $entity->$target : array($language => array());
65
66
  $info = field_info_field($target);
67
  $format = date_type_format($info['type']);
68
69
  $db_tz = new DateTimeZone(date_get_timezone_db($info['settings']['tz_handling']));
70
  $default_tz = new DateTimeZone(_date_feeds_get_default_timezone($mapping));
71 41cc1b08 Assos Assos
72
  $delta = 0;
73
  foreach ($values as $value) {
74 7295e063 Assos Assos
    $value = _date_feeds_get_date_object($value, $default_tz);
75 41cc1b08 Assos Assos
76 7295e063 Assos Assos
    if (!$value || !empty($value->errors)) {
77
      $field[$language][$delta][$value_key] = '';
78
    }
79
    else {
80
      if (!isset($field[$language][$delta]['timezone'])) {
81
        $field[$language][$delta]['timezone'] = $value->getTimezone()->getName();
82 85ad3d82 Assos Assos
      }
83 7295e063 Assos Assos
84
      $value->setTimezone($db_tz);
85
86
      $field[$language][$delta][$value_key] = $value->format($format, TRUE);
87
      $field[$language][$delta][$offset_key] = $value->getOffset();
88 85ad3d82 Assos Assos
    }
89 41cc1b08 Assos Assos
90
    $delta++;
91 85ad3d82 Assos Assos
  }
92 7295e063 Assos Assos
93
  $entity->$target = $field;
94
}
95
96
/**
97
 * Summary callback for date field targets.
98
 */
99
function date_feeds_summary_callback(array $mapping, $target, array $form, array $form_state) {
100
  $mapping += array('timezone' => 'UTC');
101
102
  $options = _date_feeds_timezone_options();
103
104
  return t('Default timezone: %zone', array('%zone' => $options[$mapping['timezone']]));
105
}
106
107
/**
108
 * Form callback for date field targets.
109
 */
110
function date_feeds_form_callback(array $mapping, $target, array $form, array $form_state) {
111
  $mapping += array('timezone' => 'UTC');
112
113
  return array(
114
    'timezone' => array(
115
      '#type' => 'select',
116
      '#title' => t('Timezone handling'),
117
      '#options' => _date_feeds_timezone_options(),
118
      '#default_value' => $mapping['timezone'],
119
      '#description' => t('This value will only be used if the timezone is mising.'),
120
    ),
121
  );
122
}
123
124
/**
125
 * Returns the timezone options.
126
 *
127
 * @return array
128
 *   A map of timezone options.
129
 */
130
function _date_feeds_timezone_options() {
131
  return array(
132
    '__SITE__' => t('Site default'),
133
  ) + system_time_zones();
134
}
135
136
/**
137
 * Returns the timezone to be used as the default.
138
 *
139
 * @param array $mapping
140
 *   The mapping array.
141
 *
142
 * @return string
143
 *   The timezone to use as the default.
144
 */
145
function _date_feeds_get_default_timezone(array $mapping) {
146
  $mapping += array('timezone' => 'UTC');
147
148
  if ($mapping['timezone'] === '__SITE__') {
149
    return variable_get('date_default_timezone', 'UTC');
150
  }
151
152
  return $mapping['timezone'];
153
}
154
155
/**
156
 * Converts a date string or object into a DateObject.
157
 *
158
 * @param DateTime|string|int $value
159
 *   The date value or object.
160
 * @param DateTimeZone $default_tz
161
 *   The default timezone.
162
 *
163
 * @return DateObject
164
 *   The converted DateObject.
165
 */
166
function _date_feeds_get_date_object($value, DateTimeZone $default_tz) {
167
  if ($value instanceof DateObject) {
168
    return $value;
169
  }
170
171
  // Convert DateTime and FeedsDateTime.
172
  if ($value instanceof DateTime) {
173
    if (!$value->getTimezone() || !preg_match('/[a-zA-Z]/', $value->getTimezone()->getName())) {
174
      $value->setTimezone($default_tz);
175
    }
176
    return new DateObject($value->format(DATE_FORMAT_ISO), $value->getTimezone());
177
  }
178
179
  if (is_string($value) || is_object($value) && method_exists($value, '__toString')) {
180
    $value = trim($value);
181
  }
182
183
  // Filter out meaningless values.
184
  if (empty($value) || !is_string($value) && !is_int($value)) {
185
    return FALSE;
186
  }
187
188
  // Support year values.
189
  if ((string) $value === (string) (int) $value) {
190
    if ($value >= variable_get('date_min_year', 100) && $value <= variable_get('date_max_year', 4000)) {
191
      return new DateObject('January ' . $value, $default_tz);
192
    }
193
  }
194
195
  return new DateObject($value, $default_tz);
196 85ad3d82 Assos Assos
}