Projet

Général

Profil

Paste
Télécharger (24,6 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / media / includes / media.fields.inc @ 18596a08

1
<?php
2

    
3
/**
4
 * @file
5
 * Provide the media selector widget and media field formatters to the Fields
6
 * API.
7
 */
8

    
9
/**
10
 * Implements hook_field_widget_info().
11
 */
12
function media_field_widget_info() {
13
  return array(
14
    'media_generic' => array(
15
      'label' => t('Media browser'),
16
      'field types' => array('file', 'image'),
17
      'settings' => array(
18
        'allowed_types' => array(
19
          'image' => 'image',
20
        ),
21
        'browser_plugins' => array(),
22
        'allowed_schemes' => array(
23
          'public' => 'public',
24
        ),
25
      ),
26
      'behaviors' => array(
27
        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
28
        'default value' => FIELD_BEHAVIOR_NONE,
29
      ),
30
    ),
31
  );
32
}
33

    
34
/**
35
 * Implements hook_field_widget_settings_form().
36
 */
37
function media_field_widget_settings_form($field, $instance) {
38
  $widget = $instance['widget'];
39
  $settings = $widget['settings'];
40

    
41
  $plugins = media_get_browser_plugin_info();
42
  $options = array();
43
  foreach ($plugins as $key => $plugin) {
44
    $options[$key] = check_plain($plugin['title']);
45
  }
46

    
47
  $form['browser_plugins'] = array(
48
    '#type' => 'checkboxes',
49
    '#title' => t('Enabled browser plugins'),
50
    '#options' => $options,
51
    '#default_value' => $settings['browser_plugins'],
52
    '#description' => t('Media browser plugins which are allowed for this field. If no plugins are selected, they will all be available.'),
53
  );
54

    
55
  $form['allowed_types'] = array(
56
    '#type' => 'checkboxes',
57
    '#title' => t('Allowed file types'),
58
    '#options' => file_entity_type_get_names(),
59
    '#default_value' => $settings['allowed_types'],
60
    '#description' => t('File types which are allowed for this field. If no file types are selected, they will all be available.'),
61
  );
62

    
63
  $visible_steam_wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE);
64
  $options = array();
65
  foreach ($visible_steam_wrappers as $scheme => $information) {
66
    $options[$scheme] = check_plain($information['name']);
67
  }
68

    
69
  $form['allowed_schemes'] = array(
70
    '#type' => 'checkboxes',
71
    '#title' => t('Allowed URI schemes'),
72
    '#options' => $options,
73
    '#default_value' => $settings['allowed_schemes'],
74
    '#description' => t('URI schemes which are allowed for this field. If no schemes are selected, they will all be available.'),
75
  );
76

    
77
  return $form;
78
}
79

    
80
/**
81
 * Implements hook_field_widget_form().
82
 */
83
function media_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
84
  $defaults = array(
85
    'fid' => 0,
86
    'display' => !empty($field['settings']['display_default']),
87
    'description' => '',
88
  );
89

    
90
  // Load the items for form rebuilds from the field state as they might not be
91
  // in $form_state['values'] because of validation limitations. Also, they are
92
  // only passed in as $items when editing existing entities.
93
  $field_state = field_form_get_state($element['#field_parents'], $field['field_name'], $langcode, $form_state);
94
  if (isset($field_state['items'])) {
95
    $items = $field_state['items'];
96
  }
97

    
98
  $field_settings = $instance['settings'];
99
  $widget_settings = $instance['widget']['settings'];
100

    
101
  // Essentially we use the media type, extended with some enhancements.
102
  $element_info = element_info('media');
103
  $multiselect = ($field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED);
104

    
105
  $element += array(
106
    '#type' => 'media',
107
    '#value_callback' => 'media_field_widget_value',
108
    '#process' => array_merge($element_info['#process'], array('media_field_widget_process')),
109
    '#media_options' => array(
110
      'global' => array(
111
        'types' => array_filter($widget_settings['allowed_types']),
112
        'enabledPlugins' => array_filter($instance['widget']['settings']['browser_plugins']),
113
        'schemes' => array_filter($widget_settings['allowed_schemes']),
114
        'file_directory' => isset($field_settings['file_directory']) ? $field_settings['file_directory'] : '',
115
        'file_extensions' => isset($field_settings['file_extensions']) ? $field_settings['file_extensions'] : variable_get('file_entity_default_allowed_extensions', 'jpg jpeg gif png txt doc docx xls xlsx pdf ppt pptx pps ppsx odt ods odp mp3 mov mp4 m4a m4v mpeg avi ogg oga ogv weba webp webm'),
116
        'max_filesize' => isset($field_settings['max_filesize']) ? $field_settings['max_filesize'] : 0,
117
        'uri_scheme' => !empty($field['settings']['uri_scheme']) ? $field['settings']['uri_scheme'] : file_default_scheme(),
118
        'multiselect' => $multiselect,
119
        'field' => $field['field_name'],
120
      ),
121
    ),
122
    // Allows this field to return an array instead of a single value.
123
    '#extended' => TRUE,
124
  );
125

    
126
  // If translation is enabled for the entity, store its form/source langcodes
127
  // on the elements for further usage in media_element_process().
128
  if (module_invoke('entity_translation', 'enabled', $element['#entity_type'], $element['#entity'])) {
129
    $translation_handler = entity_translation_get_handler($element['#entity_type'], $element['#entity']);
130
    $element['#media_parent_entity_form_langcode'] = $translation_handler->getActiveLanguage();
131
    if ($source_langcode = $translation_handler->getSourceLanguage()) {
132
      $element['#media_parent_entity_source_langcode'] = $source_langcode;
133
    }
134
  }
135
  elseif (module_exists('translation') && $element['#entity_type'] == 'node' && translation_supported_type($element['#entity']->type)) {
136
    $element['#media_parent_entity_form_langcode'] = $element['#entity']->language;
137
    $element['#media_parent_entity_source_langcode'] = $element['#entity']->language;
138
  } elseif ($element['#entity_type'] == 'field_collection_item' && !empty($form['#entity']) && property_exists($form['#entity'], 'language')) {
139
    $element['#media_parent_entity_form_langcode'] = $form['#entity']->language;
140
  }
141
  else if ($element['#entity_type'] == 'paragraphs_item' && !empty($form['#entity'])) {
142
    $host = $element['#entity']->hostEntity();
143
    $element['#media_parent_entity_form_langcode'] = $host->language;
144
    $element['#media_parent_entity_source_langcode'] = $host->language;
145
  }
146

    
147
  // Add image field specific validators.
148
  if ($field['type'] == 'image') {
149
    if ($field_settings['min_resolution'] || $field_settings['max_resolution']) {
150
      $element['#media_options']['global']['min_resolution'] = $field_settings['min_resolution'];
151
      $element['#media_options']['global']['max_resolution'] = $field_settings['max_resolution'];
152
    }
153
  }
154

    
155
  if ($field['cardinality'] == 1) {
156
    // Set the default value.
157
    $element['#default_value'] = !empty($items) ? $items[0] : $defaults;
158
    // If there's only one field, return it as delta 0.
159
    if (empty($element['#default_value']['fid'])) {
160
      $element['#description'] = theme('media_upload_help', array('description' => $element['#description']));
161
    }
162
    $elements = array($element);
163
  }
164
  else {
165
    // If there are multiple values, add an element for each existing one.
166
    foreach ($items as $item) {
167
      $elements[$delta] = $element;
168
      $elements[$delta]['#default_value'] = $item;
169
      $elements[$delta]['#weight'] = $delta;
170
      $delta++;
171
    }
172
    // And then add one more empty row for new uploads except when this is a
173
    // programmed form as it is not necessary.
174
    if (($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $field['cardinality']) && empty($form_state['programmed'])) {
175
      $elements[$delta] = $element;
176
      $elements[$delta]['#default_value'] = $defaults;
177
      $elements[$delta]['#weight'] = $delta;
178
      $elements[$delta]['#required'] = ($element['#required'] && $delta == 0);
179
    }
180
    // The group of elements all-together need some extra functionality
181
    // after building up the full list (like draggable table rows).
182
    $elements['#file_upload_delta'] = $delta;
183
    $elements['#theme'] = 'media_widget_multiple';
184
    $elements['#theme_wrappers'] = array('fieldset');
185
    $elements['#process'] = array('media_field_widget_process_multiple');
186
    $elements['#title'] = $element['#title'];
187
    $elements['#description'] = $element['#description'];
188
    $elements['#field_name'] = $element['#field_name'];
189
    $elements['#language'] = $element['#language'];
190
    $elements['#display_field'] = intval(!empty($field['settings']['display_field']));
191

    
192
    // Add some properties that will eventually be added to the media upload
193
    // field. These are added here so that they may be referenced easily through
194
    // a hook_form_alter().
195
    $elements['#file_upload_title'] = t('Attach media');
196
    $elements['#file_upload_description'] = theme('media_upload_help', array('description' => ''));
197
  }
198

    
199
  return $elements;
200
}
201

    
202
/**
203
 * The #value_callback for the media field element.
204
 */
205
function media_field_widget_value($element, $input = FALSE, $form_state) {
206
  if ($input) {
207
    // Checkboxes lose their value when empty.
208
    // If the display field is present make sure its unchecked value is saved.
209
    $field = field_widget_field($element, $form_state);
210
    if (empty($input['display'])) {
211
      $input['display'] = !empty($field['settings']['display_field']) ? 0 : 1;
212
    }
213
  }
214

    
215
  // We depend on the media element to handle uploads.
216
  $return = media_file_value($element, $input, $form_state);
217

    
218
  // Ensure that all the required properties are returned even if empty.
219
  $return += array(
220
    'fid' => 0,
221
    'display' => 1,
222
    'description' => '',
223
  );
224

    
225
  return $return;
226
}
227

    
228
/**
229
 * An element #process callback for the media field type.
230
 *
231
 * Expands the media type to include the description and display fields.
232
 */
233
function media_field_widget_process($element, &$form_state, $form) {
234
  $item = $element['#value'];
235
  $item['fid'] = $element['fid']['#value'];
236

    
237
  $field = field_widget_field($element, $form_state);
238
  $instance = field_widget_instance($element, $form_state);
239
  $settings = $instance['widget']['settings'];
240

    
241
  $element['#theme'] = 'media_widget';
242

    
243
  // Add the display field if enabled.
244
  if (!empty($field['settings']['display_field']) && $item['fid']) {
245
    $element['display'] = array(
246
      '#type' => empty($item['fid']) ? 'hidden' : 'checkbox',
247
      '#title' => t('Include file in display'),
248
      '#value' => isset($item['display']) ? $item['display'] : $field['settings']['display_default'],
249
      '#attributes' => array('class' => array('file-display')),
250
    );
251
  }
252
  else {
253
    $element['display'] = array(
254
      '#type' => 'hidden',
255
      '#value' => '1',
256
    );
257
  }
258

    
259
  // Add the description field if enabled.
260
  if (!empty($instance['settings']['description_field']) && $item['fid']) {
261
    $element['description'] = array(
262
      '#type' => variable_get('file_description_type', 'textfield'),
263
      '#title' => t('Description'),
264
      '#value' => isset($item['description']) ? $item['description'] : '',
265
      '#maxlength' => variable_get('file_description_length', 128),
266
      '#description' => t('The description may be used as the label of the link to the file.'),
267
    );
268
  }
269

    
270
  // Adjust the Ajax settings so that on upload and remove of any individual
271
  // file, the entire group of file fields is updated together.
272
  if ($field['cardinality'] != 1) {
273
    $parents = array_slice($element['#array_parents'], 0, -1);
274
    $new_path = 'media/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value'];
275
    $field_element = drupal_array_get_nested_value($form, $parents);
276
    $new_wrapper = $field_element['#id'] . '-ajax-wrapper';
277
    foreach (element_children($element) as $key) {
278
      if (isset($element[$key]['#ajax'])) {
279
        $element[$key]['#ajax']['path'] = $new_path;
280
        $element[$key]['#ajax']['wrapper'] = $new_wrapper;
281
      }
282
    }
283
    unset($element['#prefix'], $element['#suffix']);
284
  }
285

    
286
  // Add another submit handler to the upload and remove buttons, to implement
287
  // functionality needed by the field widget. This submit handler, along with
288
  // the rebuild logic in media_field_widget_form() requires the entire field,
289
  // not just the individual item, to be valid.
290
  foreach (array('attach_button', 'remove_button') as $key) {
291
    $element[$key]['#submit'][] = 'media_field_widget_submit';
292
    $element[$key]['#limit_validation_errors'] = array(array_slice($element['#parents'], 0, -1));
293
  }
294

    
295
  return $element;
296
}
297

    
298
/**
299
 * An element #process callback for a group of media fields.
300
 *
301
 * Adds the weight field to each row so it can be ordered and adds a new Ajax
302
 * wrapper around the entire group so it can be replaced all at once.
303
 */
304
function media_field_widget_process_multiple($element, &$form_state, $form) {
305
    // In order to support multiple selection, we need to reconstruct the _POST
306
  // data that is checked in media_attach_file(). We need to reconstruct the
307
  // field's _POST key name, for example: field_mediafield_und_0.
308
  $upload_name_prefix = implode('_', $element['#parents']) . '_';
309
  $upload_name = $upload_name_prefix . $element['#file_upload_delta'];
310
  if (!empty($_POST['media'][$upload_name])) {
311
    $files = explode(',', $_POST['media'][$upload_name]);
312
    $count = count($files);
313
    // Supposing #file_upload_delta is always the last delta this will work
314
    for ($i = 0; $i < $count; $i++) {
315
      // For each file selected, increment the field key to be processed.
316
      // field_mediafield_und_0 becomes field_mediafield_und_1, etc.
317
      $_POST['media'][$upload_name_prefix . ($element['#file_upload_delta'] + $i)] = $files[$i];
318

    
319
      // Copy the default file element to each newly selected file position.
320
      $default_element = $element[$element['#file_upload_delta']];
321
      $element[] = array_merge(
322
        $default_element,
323
        array('#weight' => ($element['#file_upload_delta'] + $i + 1))
324
      );
325
    }
326
  }
327

    
328
  $element_children = element_children($element, TRUE);
329
  $count = count($element_children);
330

    
331
  foreach ($element_children as $delta => $key) {
332
    if ($key != $element['#file_upload_delta']) {
333
      $description = _media_field_get_description_from_element($element[$key]);
334
      $element[$key]['_weight'] = array(
335
        '#type' => 'weight',
336
        '#title' => $description ? t('Weight for @title', array('@title' => $description)) : t('Weight for new file'),
337
        '#title_display' => 'invisible',
338
        '#delta' => $count,
339
        '#default_value' => $delta,
340
      );
341
    }
342
    else {
343
      // The title needs to be assigned to the attach field so that validation
344
      // errors include the correct widget label.
345
      $element[$key]['#title'] = $element['#title'];
346
      $element[$key]['_weight'] = array(
347
        '#type' => 'hidden',
348
        '#default_value' => $delta,
349
      );
350
    }
351
  }
352

    
353
  // Add a new wrapper around all the elements for Ajax replacement.
354
  $element['#prefix'] = '<div id="' . $element['#id'] . '-ajax-wrapper">';
355
  $element['#suffix'] = '</div>';
356

    
357
  return $element;
358
}
359

    
360
/**
361
 * Retrieves the file description from a media field element.
362
 *
363
 * This helper function is used by media_field_widget_process_multiple().
364
 *
365
 * @param $element
366
 *   The element being processed.
367
 *
368
 * @return
369
 *   A description of the file suitable for use in the administrative interface.
370
 */
371
function _media_field_get_description_from_element($element) {
372
  // Use the actual file description, if it's available.
373
  if (!empty($element['#default_value']['description'])) {
374
    return $element['#default_value']['description'];
375
  }
376
  // Otherwise, fall back to the filename.
377
  if (!empty($element['#default_value']['filename'])) {
378
    return $element['#default_value']['filename'];
379
  }
380
  // This is probably a newly uploaded file; no description is available.
381
  return FALSE;
382
}
383

    
384
/**
385
 * Form submission handler for attach/remove button of media_field_widget_form().
386
 *
387
 * This runs in addition to and after media_field_widget_submit().
388
 *
389
 * @see media_field_widget_submit()
390
 * @see media_field_widget_form()
391
 * @see media_field_widget_process()
392
 */
393
function media_field_widget_submit($form, &$form_state) {
394
  // During the form rebuild, media_field_widget_form() will create field item
395
  // widget elements using re-indexed deltas, so clear out $form_state['input']
396
  // to avoid a mismatch between old and new deltas. The rebuilt elements will
397
  // have #default_value set appropriately for the current state of the field,
398
  // so nothing is lost in doing this.
399
  $parents = array_slice($form_state['triggering_element']['#parents'], 0, -2);
400
  drupal_array_set_nested_value($form_state['input'], $parents, NULL);
401

    
402
  $button = $form_state['triggering_element'];
403

    
404
  // Go one level up in the form, to the widgets container.
405
  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
406
  $field_name = $element['#field_name'];
407
  $langcode = $element['#language'];
408
  $parents = $element['#field_parents'];
409

    
410
  $submitted_values = drupal_array_get_nested_value($form_state['values'], array_slice($button['#parents'], 0, -2));
411
  foreach ($submitted_values as $delta => $submitted_value) {
412
    if (!$submitted_value['fid']) {
413
      unset($submitted_values[$delta]);
414
    }
415
  }
416

    
417
  ksort($submitted_values);
418
  // Re-index deltas after removing empty items.
419
  $submitted_values = array_values($submitted_values);
420

    
421
  // Update form_state values.
422
  drupal_array_set_nested_value($form_state['values'], array_slice($button['#parents'], 0, -2), $submitted_values);
423

    
424
  // Update items.
425
  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
426
  $field_state['items'] = $submitted_values;
427
  field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
428
}
429

    
430
/**
431
 * Returns HTML for an individual media widget.
432
 *
433
 * @param $variables
434
 *   An associative array containing:
435
 *   - element: A render element representing the widget.
436
 *
437
 * @ingroup themeable
438
 */
439
function theme_media_widget($variables) {
440
  $element = $variables['element'];
441
  $output = '';
442

    
443
  // Merge provided attributes with existing ones.
444
  // The "form-media" class is required for proper Ajax functionality.
445
  $attributes = array(
446
    'class' => array("media-widget", "form-media", "clearfix"),
447
  );
448
  if (!empty($element['#attributes'])) {
449
    $attributes = array_merge_recursive($attributes, $element['#attributes']);
450
  }
451
  if (!empty($element['#id'])) {
452
    $attributes = array_merge_recursive($attributes, array('id' => $element['#id'] . '--widget'));
453
  }
454

    
455
  // Render attributes into div in one go.
456
  $output .= '<div ' . drupal_attributes($attributes) . '>';
457
  $output .= drupal_render_children($element);
458
  $output .= '</div>';
459

    
460
  return $output;
461
}
462

    
463
/**
464
 * Returns HTML for a group of media widgets.
465
 *
466
 * @param $variables
467
 *   An associative array containing:
468
 *   - element: A render element representing the widgets.
469
 *
470
 * @ingroup themeable
471
 */
472
function theme_media_widget_multiple($variables) {
473
  $element = $variables['element'];
474

    
475
  // Special ID and classes for draggable tables.
476
  $weight_class = $element['#id'] . '-weight';
477
  $table_id = $element['#id'] . '-table';
478

    
479
  // Build up a table of applicable fields.
480
  $headers = array();
481
  $headers[] = t('File information');
482
  if ($element['#display_field']) {
483
    $headers[] = array(
484
      'data' => t('Display'),
485
      'class' => array('checkbox'),
486
    );
487
  }
488
  $headers[] = t('Weight');
489
  $headers[] = t('Operations');
490

    
491
  // Get our list of widgets in order (needed when the form comes back after
492
  // preview or failed validation).
493
  $widgets = array();
494
  foreach (element_children($element) as $key) {
495
    $widgets[] = &$element[$key];
496
  }
497
  usort($widgets, '_field_sort_items_value_helper');
498

    
499
  $rows = array();
500
  foreach ($widgets as $key => &$widget) {
501
    // Save the uploading row for last.
502
    if ($widget['#file'] == FALSE) {
503
      $widget['#title'] = $element['#file_upload_title'];
504
      $widget['#description'] = $element['#file_upload_description'];
505
      continue;
506
    }
507

    
508
    // Delay rendering of the buttons, so that they can be rendered later in the
509
    // "operations" column.
510
    $operations_elements = array();
511
    foreach (element_children($widget) as $sub_key) {
512
      if (isset($widget[$sub_key]['#type']) && ($widget[$sub_key]['#type'] == 'submit' || $widget[$sub_key]['#type'] == 'link')) {
513
        hide($widget[$sub_key]);
514
        $operations_elements[] = &$widget[$sub_key];
515
      }
516
    }
517

    
518
    // Delay rendering of the "Display" option and the weight selector, so that
519
    // each can be rendered later in its own column.
520
    if ($element['#display_field']) {
521
      hide($widget['display']);
522
    }
523
    hide($widget['_weight']);
524

    
525
    // Render everything else together in a column, without the normal wrappers.
526
    $widget['#theme_wrappers'] = array();
527
    $information = drupal_render($widget);
528

    
529
    // Render the previously hidden elements, using render() instead of
530
    // drupal_render(), to undo the earlier hide().
531
    $operations = '';
532
    foreach ($operations_elements as $operation_element) {
533
      $operations .= render($operation_element);
534
    }
535
    $display = '';
536
    if ($element['#display_field']) {
537
      unset($widget['display']['#title']);
538
      $display = array(
539
        'data' => render($widget['display']),
540
        'class' => array('checkbox'),
541
      );
542
    }
543
    $widget['_weight']['#attributes']['class'] = array($weight_class);
544
    $weight = render($widget['_weight']);
545

    
546
    // Arrange the row with all of the rendered columns.
547
    $row = array();
548
    $row[] = $information;
549
    if ($element['#display_field']) {
550
      $row[] = $display;
551
    }
552
    $row[] = $weight;
553
    $row[] = $operations;
554
    $rows[] = array(
555
      'data' => $row,
556
      'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array('draggable')) : array('draggable'),
557
    );
558
  }
559

    
560
  $table = array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => $table_id));
561

    
562
  drupal_alter('media_widget_multiple', $table, $element);
563

    
564
  drupal_add_tabledrag($table_id, 'order', 'sibling', $weight_class);
565

    
566
  $output = '';
567
  $output = empty($rows) ? '' : theme('table', $table);
568
  $output .= drupal_render_children($element);
569
  return $output;
570
}
571

    
572
/**
573
 * Returns HTML for help text.
574
 *
575
 * @param $variables
576
 *   An associative array containing:
577
 *   - description: The normal description for this field, specified by the
578
 *     user.
579
 *
580
 * @ingroup themeable
581
 */
582
function theme_media_upload_help($variables) {
583
  $description = $variables['description'];
584

    
585
  $descriptions = array();
586

    
587
  if (strlen($description)) {
588
    $descriptions[] = $description;
589
  }
590

    
591
  return implode('<br />', $descriptions);
592
}
593

    
594
/**
595
 * Implements hook_field_formatter_info().
596
 *
597
 * Provides legacy support for the "Large filetype icon" file field formatter.
598
 * This was originally used when media entities contained file fields. The
599
 * current file entity architecture no longer needs this, but people may
600
 * have used this formatter for other file fields on their website.
601
 *
602
 * @todo Some day, remove this.
603
 */
604
function media_field_formatter_info() {
605
  $formatters = array(
606
    'media_large_icon' => array(
607
      'label' => t('Large filetype icon'),
608
      'field types' => array('file'),
609
      'settings' => array(
610
        'image_style' => '',
611
      ),
612
    ),
613
  );
614

    
615
  return $formatters;
616
}
617

    
618
/**
619
 * Implements hook_field_formatter_settings_form().
620
 *
621
 * Legacy support for the "Large filetype icon" file field formatter.
622
 * @see media_field_formatter_info()
623
 */
624
function media_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
625
  $display = $instance['display'][$view_mode];
626
  $settings = $display['settings'];
627

    
628
  $image_styles = image_style_options(FALSE, PASS_THROUGH);
629
  $element['image_style'] = array(
630
    '#title' => t('Image style'),
631
    '#type' => 'select',
632
    '#default_value' => $settings['image_style'],
633
    '#empty_option' => t('None (original image)'),
634
    '#options' => $image_styles,
635
  );
636

    
637
  return $element;
638
}
639

    
640
/**
641
 * Implements hook_field_formatter_settings_summary().
642
 *
643
 * Legacy support for the "Large filetype icon" file field formatter.
644
 * @see media_field_formatter_info()
645
 */
646
function media_field_formatter_settings_summary($field, $instance, $view_mode) {
647
  $display = $instance['display'][$view_mode];
648
  $settings = $display['settings'];
649

    
650
  $summary = array();
651

    
652
  $image_styles = image_style_options(FALSE, PASS_THROUGH);
653
  // Unset possible 'No defined styles' option.
654
  unset($image_styles['']);
655
  // Styles could be lost because of enabled/disabled modules that defines
656
  // their styles in code.
657
  if (isset($image_styles[$settings['image_style']])) {
658
    $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
659
  }
660
  else {
661
    $summary[] = t('Original image');
662
  }
663

    
664
  return implode('<br />', $summary);
665
}
666

    
667
/**
668
 * Implements hook_field_formatter_view().
669
 *
670
 * Legacy support for the "Large filetype icon" file field formatter.
671
 * @see media_field_formatter_info()
672
 */
673
function media_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
674
  $element = array();
675

    
676
  if ($display['type'] == 'media_large_icon') {
677
    foreach ($items as $delta => $item) {
678
      $element[$delta] = array(
679
        '#theme' => 'media_formatter_large_icon',
680
        '#file' => (object) $item,
681
        '#style_name' => $display['settings']['image_style'],
682
      );
683
    }
684
  }
685

    
686
  return $element;
687
}