Projet

Général

Profil

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

root / drupal7 / sites / all / modules / media / modules / media_wysiwyg / includes / media_wysiwyg.pages.inc @ 3115e37e

1
<?php
2

    
3
/**
4
 * @file
5
 * Common pages for the Media WYSIWYG module.
6
 */
7

    
8
/**
9
 * Form callback used when embedding media.
10
 *
11
 * Allows the user to pick a format for their media file.
12
 * Can also have additional params depending on the media type.
13
 */
14
function media_wysiwyg_format_form($form, &$form_state, $file) {
15
  $form_state['file'] = $file;
16

    
17
  // Allow for overrides to the fields.
18
  $query_fields = isset($_GET['fields']) ? drupal_json_decode($_GET['fields']) : array();
19
  $fields = media_wysiwyg_filter_field_parser(array('fields' => $query_fields), $file);
20

    
21
  $options = media_wysiwyg_get_file_view_mode_options($file);
22

    
23
  if (!count($options)) {
24
    throw new Exception('Unable to continue, no available formats for displaying media.');
25
  }
26

    
27
  // Generate all the previews.
28
  if (!isset($form_state['storage']['view_mode_previews'])) {
29
    $form_state['storage']['view_mode_previews'] = array();
30
    foreach ($options as $view_mode => $view_mode_label) {
31
      $view_mode_preview = media_wysiwyg_get_file_without_label($file, $view_mode, array('wysiwyg' => TRUE));
32
      $form_state['storage']['view_mode_previews'][$view_mode] = drupal_render($view_mode_preview);
33
    }
34
  }
35

    
36
  // Add the previews back into the form array so they can be altered.
37
  $form['#formats'] = &$form_state['storage']['view_mode_previews'];
38

    
39
  // Allow for overrides to the display format.
40
  $default_view_mode = is_array($query_fields) && isset($query_fields['format']) ? $query_fields['format'] : variable_get('media_wysiwyg_wysiwyg_default_view_mode', 'full');
41
  if (!isset($options[$default_view_mode])) {
42
    reset($options);
43
    $default_view_mode = key($options);
44
  }
45

    
46
  // Add the previews by reference so that they can easily be altered by
47
  // changing $form['#formats'].
48
  $settings['media']['formatFormFormats'] = &$form_state['storage']['view_mode_previews'];
49
  $form['#attached']['js'][] = array('data' => $settings, 'type' => 'setting');
50

    
51
  // Add the required libraries, JavaScript and CSS for the form.
52
  $form['#attached']['library'][] = array('media', 'media_base');
53
  $form['#attached']['library'][] = array('system', 'form');
54
  $form['#attached']['css'][] = drupal_get_path('module', 'media_wysiwyg') . '/css/media_wysiwyg.css';
55
  $form['#attached']['js'][] = drupal_get_path('module', 'media_wysiwyg') . '/js/media_wysiwyg.format_form.js';
56

    
57
  $form['title'] = array(
58
    '#markup' => t('Embedding %filename', array('%filename' => $file->filename)),
59
  );
60

    
61
  $preview = media_get_thumbnail_preview($file);
62

    
63
  $form['preview'] = array(
64
    '#type' => 'markup',
65
    '#markup' => drupal_render($preview),
66
  );
67

    
68
  // These will get passed on to WYSIWYG.
69
  $form['options'] = array(
70
    '#type' => 'fieldset',
71
    '#title' => t('options'),
72
  );
73

    
74
  // @TODO: Display more verbose information about which formatter and what it
75
  // does.
76
  $form['options']['format'] = array(
77
    '#type' => 'select',
78
    '#title' => t('Display as'),
79
    '#options' => $options,
80
    '#default_value' => $default_view_mode,
81
    '#description' => t('Choose the type of display you would like for this
82
      file. Please be aware that files may display differently than they do when
83
      they are inserted into an editor.'),
84
  );
85

    
86
  // If necessary, display the alignment widget.
87
  if (variable_get('media_wysiwyg_alignment', FALSE)) {
88
    $align_default = empty($query_fields['alignment']) ? '' : $query_fields['alignment'];
89
    $align_options = array(
90
      '' => t('None'),
91
      'left' => t('Left'),
92
      'right' => t('Right'),
93
      'center' => t('Center'),
94
    );
95
    if (!isset($align_options[$align_default])) {
96
      // Safety code for a malformed token.
97
      $align_default = '';
98
    }
99
    $form['options']['alignment'] = array(
100
      '#type' => 'select',
101
      '#title' => t('Alignment'),
102
      '#options' => $align_options,
103
      '#description' => t('Choose how you would like the media to be aligned with surrounding content.'),
104
      '#default_value' => $align_default,
105
    );
106
  }
107
  // Add fields from the file, so that we can override them if necessary.
108
  $form['options']['fields'] = array();
109
  foreach ($fields as $field_name => $field_value) {
110
    $file->{$field_name} = $field_value;
111
  }
112
  // Get the external url from the fid array.
113
  $external_url = empty($query_fields['external_url']) ? NULL : $query_fields['external_url'];
114
  // Field to attach external url's to files for linking.
115
  if (variable_get('media_wysiwyg_external_link', FALSE)) {
116
    if ($file->type == 'image') {
117
      $form['options']['external_url'] = array(
118
        '#type' => 'textfield',
119
        '#title' => t('Link Image'),
120
        '#description' => t('Enter a URL to turn the image into a link.'),
121
        '#default_value' => $external_url,
122
      );
123
    }
124
  }
125
  field_attach_form('file', $file, $form['options']['fields'], $form_state);
126
  $instance = field_info_instances('file', $file->type);
127
  foreach ($instance as $field_name => $field_value) {
128
    $info = field_info_field($field_name);
129
    $allow = !empty($instance[$field_name]['settings']['wysiwyg_override']);
130
    // Only single valued fields can be overridden normally, unless Media is
131
    // configured otherwise with "media_wysiwyg_wysiwyg_override_multivalue".
132
    if ($allow && $info['cardinality'] != 1) {
133
      $allow = variable_get('media_wysiwyg_wysiwyg_override_multivalue', FALSE);
134
    }
135
    $form['options']['fields'][$field_name]['#access'] = $allow;
136
  }
137

    
138
  // Add view mode preview.
139
  media_wysiwyg_format_form_view_mode($form, $form_state, $file);
140

    
141
  // Similar to a form_alter, but we want this to run first so that
142
  // media.types.inc can add the fields specific to a given type (like alt tags
143
  // on media). If implemented as an alter, this might not happen, making other
144
  // alters not be able to work on those fields.
145
  // @todo: We need to pass in existing values for those attributes.
146
  drupal_alter('media_wysiwyg_format_form_prepare', $form, $form_state, $file);
147

    
148
  if (!element_children($form['options'])) {
149
    $form['options']['#attributes'] = array('style' => 'display:none');
150
  }
151

    
152
  return $form;
153
}
154

    
155
/**
156
 * Add ajax preview when selecting view mode in wysiwyg editor.
157
 */
158
function media_wysiwyg_format_form_view_mode(&$form, $form_state, $file) {
159
  // Check to see if a view mode ("format") has already been specified for
160
  // this media item. First, check for a standard form-submitted value.
161
  if (!empty($form_state['values']['format'])) {
162
    $view_mode = $form_state['values']['format'];
163
  }
164
  // Second, check the request for a JSON-encoded value.
165
  elseif (isset($_GET['fields'])) {
166
    $query_fields = drupal_json_decode($_GET['fields']);
167
    if (isset($query_fields['format'])) {
168
      $view_mode = $query_fields['format'];
169
    }
170
  }
171
  // If we were unable to determine a view mode, or we found a view mode
172
  // that does not exist in the list of format options presented on this
173
  // form, use the default view mode.
174
  if (!isset($view_mode) || !array_key_exists($view_mode, $form['options']['format']['#options'])) {
175
    $view_mode = variable_get('media_wysiwyg_wysiwyg_default_view_mode', 'full');
176
  }
177

    
178
  $link_options = array(
179
    'attributes' => array(
180
      'class' => 'button',
181
      'title' => t('Use for replace fox or edit file fields.'),
182
    ),
183
    'query' => drupal_get_destination(),
184
  );
185
  if (!empty($_GET['render'])) {
186
    $link_options['query']['render'] = $_GET['render'];
187
  }
188

    
189
  $form['preview'] = array();
190
  $form['preview']['#prefix'] = '<div class="media-preview-group"><div class="media-item"><div class="media-thumbnail">';
191
  $form['preview']['#suffix'] = '</div><div class="label-wrapper"><label class="media-filename">' . check_plain($file->filename) . '</label></div></div><div class="edit-file-link">' . l(t('Edit file'), 'file/' . $file->fid . '/edit', $link_options) . '</div></div>';
192
  $form['preview']['thumbnail'] = file_view_file($file, $view_mode);
193
  $form['preview']['thumbnail']['#prefix'] = '<div id="media-preview">';
194
  $form['preview']['thumbnail']['#suffix'] = '</div>';
195

    
196
  if (!isset($form['options']['format']['#default_value'])) {
197
    $form['options']['format']['#default_value'] = $view_mode;
198
  }
199
  $form['options']['format']['#ajax'] = array(
200
    'callback' => 'media_wysiwyg_format_form_preview',
201
    'wrapper' => 'media-preview',
202
  );
203

    
204
  $wysiwyg_view_mode = db_query('SELECT view_mode FROM {media_view_mode_wysiwyg} WHERE type = :type', array(':type' => $file->type))->fetchField();
205
  $view_modes = media_wysiwyg_get_wysiwyg_allowed_view_modes($file);
206
  $formats = $options = array();
207

    
208
  foreach ($view_modes as $view_mode => $view_mode_info) {
209
    $options[$view_mode] = $view_mode_info['label'];
210

    
211
    if (!empty($wysiwyg_view_mode)) {
212
      $element = media_wysiwyg_get_file_without_label($file, $wysiwyg_view_mode, array('wysiwyg' => TRUE));
213
    }
214
    else {
215
      $element = media_wysiwyg_get_file_without_label($file, $view_mode, array('wysiwyg' => TRUE));
216
    }
217

    
218
    $formats[$view_mode] = drupal_render($element);
219
  }
220

    
221
  $form['#formats'] = $formats;
222
  $form['options']['format']['#options'] = $options;
223
}
224

    
225
/**
226
 * AJAX callback to select portion of format form to be updated with a preview.
227
 *
228
 * @param array $form
229
 *   An associative array containing the structure of the form.
230
 * @param array $form_state
231
 *   An associative array containing the current state of the form.
232
 *
233
 * @return array
234
 *   The preview form item.
235
 */
236
function media_wysiwyg_format_form_preview($form, $form_state) {
237
  return $form['preview']['thumbnail'];
238
}