Projet

Général

Profil

Paste
Télécharger (7,99 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / media_ckeditor / media_ckeditor.module @ f2fc85df

1
<?php
2

    
3
/**
4
 * @file
5
 * Primarily Drupal hooks.
6
 */
7

    
8
/**
9
 * Implements hook_element_info_alter().
10
 */
11
function media_ckeditor_element_info_alter(&$types) {
12
  $types['text_format']['#pre_render'][] = 'media_ckeditor_pre_render_text_format';
13
  $types['media']['#pre_render'][] = 'media_ckeditor_pre_render_media';
14
}
15

    
16
/**
17
 * Adds CKEditor-specific JavaScript.
18
 */
19
function media_ckeditor_pre_render_text_format($element) {
20
  // filter_process_format() copies properties to the expanded 'value' child
21
  // element.
22
  if (!isset($element['format'])) {
23
    return $element;
24
  }
25

    
26
  $field = &$element['value'];
27
  $settings = array(
28
    'field' => $field['#id'],
29
  );
30

    
31
  if (!isset($field['#value'])) {
32
    return $element;
33
  }
34

    
35
  // Add CKEditor-specific JS.
36
  $element['#attached']['js'][] = array(
37
    'data' => drupal_get_path('module', 'media_ckeditor') . '/js/plugins/media/library.js',
38
    'type' => 'file',
39
    'scope' => 'footer',
40
    // It's important that this javascript fire after CKEditor.
41
    'weight' => 20,
42
  );
43

    
44
  // Communicate to javascript whether we will be displaying fully rendered
45
  // file entities in the WYSIWYG.
46
  $element['#attached']['js'][] = array(
47
    'data' => array(
48
      'media_ckeditor' => array(
49
        'fully_rendered_files' => _media_ckeditor_fully_rendered_files_in_wysiwyg(),
50
      ),
51
    ),
52
    'type' => 'setting',
53
  );
54

    
55
  return $element;
56
}
57

    
58
/**
59
 * Implements hook_form_ID_alter().
60
 */
61
function media_ckeditor_form_media_wysiwyg_format_form_alter(&$form, $form_state) {
62
  // Add our overrides to the media format form javascript.
63
  $form['#attached']['js'][] = drupal_get_path('module', 'media_ckeditor') . '/js/media_ckeditor.format_form.js';
64
}
65

    
66
/**
67
 * Implements hook_media_browser_params_alter().
68
 */
69
function media_ckeditor_media_browser_params_alter(&$stored_params) {
70
  // We add this custom param when the media dialog is invoked in library.js.
71
  if (isset($stored_params['id']) && $stored_params['id'] == 'media_wysiwyg') {
72
    // Set the default browser params from settings form if not already set.
73
    if (empty($stored_params['enabledPlugins'])) {
74
      $stored_params['enabledPlugins'] = variable_get('media_wysiwyg_wysiwyg_browser_plugins', array());
75
    }
76
    if (empty($stored_params['file_directory'])) {
77
      $stored_params['file_directory'] = variable_get('media_wysiwyg_wysiwyg_upload_directory', '');
78
    }
79
    if (empty($stored_params['types'])) {
80
      $stored_params['types'] = variable_get('media_wysiwyg_wysiwyg_allowed_types', array(
81
        'audio',
82
        'image',
83
        'video',
84
        'document',
85
      ));
86
    }
87
  }
88
}
89

    
90
/**
91
 * Implements hook_form_FORM_ID_alter().
92
 */
93
function media_ckeditor_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
94
  // Add a checkbox that marks this field as needing an "Insert" button.
95
  if (!empty($form['#instance']['widget']['module'])) {
96
    if ('media' === $form['#instance']['widget']['module']) {
97
      $form['instance']['settings']['wysiwyg_insert'] = array(
98
        '#type' => 'checkbox',
99
        '#title' => t('Show button for inserting files into WYSIWYG editor'),
100
        '#description' => t('If checked, then an "Insert" button will be available to put attached files into the active WYSIWYG editor.'),
101
        '#default_value' => isset($form['#instance']['settings']['wysiwyg_insert']) ? $form['#instance']['settings']['wysiwyg_insert'] : FALSE,
102
      );
103
    }
104
  }
105
}
106

    
107
/**
108
 * Pre-render callback for media elements.
109
 */
110
function media_ckeditor_pre_render_media($element) {
111
  // If the media widget has been configured to have an Insert button, we'll
112
  // communicate that information through javascript settings.
113
  if (!isset($element['#entity_type']) && !isset($element['#field_name']) && !isset($element['#bundle'])) {
114
    $instance = FALSE;
115
  }
116
  else {
117
    $instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
118
  }
119
  if (!empty($instance['settings']['wysiwyg_insert'])) {
120
    $element['#attached']['js'][] = array(
121
      'type' => 'setting',
122
      'data' => array(
123
        'media_ckeditor' => array(
124
          'wysiwyg_insert' => array(
125
            $element['#field_name'] => TRUE,
126
          ),
127
        ),
128
      ),
129
    );
130
  }
131
  return $element;
132
}
133

    
134

    
135
/**
136
 * Helper function to tell whether we should render full entities in WYSIWYGs.
137
 */
138
function _media_ckeditor_fully_rendered_files_in_wysiwyg() {
139
  if (variable_get('media_ckeditor_fully_rendered_files', FALSE) &&
140
      user_access('view overridden file entities in wysiwyg')) {
141
    return TRUE;
142
  }
143
  return FALSE;
144
}
145

    
146
/**
147
 * Implements hook_menu().
148
 */
149
function media_ckeditor_menu() {
150
  $items = array();
151

    
152
  // Add our AJAX-friendly route for rendering the file entities for use in
153
  // the WYSIWYG editor.
154
  $items['media/rendered-in-wysiwyg'] = array(
155
    'page callback' => 'media_ckeditor_rendered_file_in_wysiwyg',
156
    'access callback' => '_media_ckeditor_fully_rendered_files_in_wysiwyg',
157
    'file' => 'includes/media_ckeditor.pages.inc',
158
    'theme callback' => 'ajax_base_page_theme',
159
    'type' => MENU_CALLBACK,
160
  );
161

    
162
  return $items;
163
}
164

    
165
/**
166
 * A permission to allow users to view overridden files in the WYSIWYG.
167
 */
168
function media_ckeditor_permission() {
169
  return array(
170
    'view overridden file entities in wysiwyg' => array(
171
      'title' => t('View overridden file entities in wysiwyg'),
172
      'description' => t('When users are embedding files in WYSIWYGs, the file entities will be displayed with whatever overrides the user may have specified in the Media popup.'),
173
    ),
174
  );
175
}
176

    
177
/**
178
 * Implements hook_form_FORM_ID_alter().
179
 */
180
function media_ckeditor_form_media_admin_config_browser_alter(&$form, &$form_state) {
181

    
182
  // Add our optional settings to the Media Browser admin form.
183
  $form['media_ckeditor'] = array(
184
    '#type' => 'fieldset',
185
    '#title' => t('Ckeditor WYSIWYG configuration'),
186
    '#collapsible' => TRUE,
187
    '#collapsed' => FALSE,
188
    '#weight' => 50,
189
  );
190
  $form['media_ckeditor']['media_ckeditor_fully_rendered_files'] = array(
191
    '#type' => 'checkbox',
192
    '#title' => t('Display fully rendered files in WYSIWYG'),
193
    '#description' => t('Check this box to render files in the WYSIWYG dynamically, to reflect any field overrides the user may have specified. Note that this requires the user has the corresponding permission: "View overridden file entities in wysiwyg"'),
194
    '#default_value' => variable_get('media_ckeditor_fully_rendered_files', FALSE),
195
  );
196
}
197

    
198
/**
199
 * Implements hook_media_wysiwyg_token_to_markup_alter().
200
 */
201
function media_ckeditor_media_wysiwyg_token_to_markup_alter(&$element, $tag_info, $settings) {
202

    
203
  // Check to see if files embedded in WYSIWYG should be fully rendered. If so,
204
  // replace the simpler Media placeholder with a fully rendered file entity.
205
  if (!empty($settings['wysiwyg']) &&
206
      _media_ckeditor_fully_rendered_files_in_wysiwyg()) {
207
    $file = $tag_info['file'];
208
    $file->override['wysiwyg'] = TRUE;
209
    $view_mode = $tag_info['view_mode'];
210
    $fields = (!empty($settings['fields'])) ? $settings['fields'] : array();
211
    $element = media_ckeditor_render_file_with_overrides($file, $view_mode, $fields);
212
  }
213
}
214

    
215
/**
216
 * Helper function to get a fully rendered file entity with optional overrides.
217
 */
218
function media_ckeditor_render_file_with_overrides($file, $view_mode, $fields = array()) {
219

    
220
  foreach ($fields as $field_name => $value) {
221
    if (isset($file->{$field_name})) {
222
      $file->{$field_name} = $value;
223
    }
224
  }
225

    
226
  $file_array = array($file->fid => $file);
227
  $build = file_entity_metadata_view_file($file_array, $view_mode);
228

    
229
  // Manually remove contextual links.
230
  if (!empty($build['file'][$file->fid]['#contextual_links'])) {
231
    unset($build['file'][$file->fid]['#contextual_links']);
232
  }
233

    
234
  return $build;
235
}
236

    
237
/**
238
 * Implements hook_preprocess_file_entity().
239
 */
240
function media_ckeditor_preprocess_file_entity(&$vars) {
241

    
242
  // If we are rendering this as a fully rendered file entity in a WYSIWYG,
243
  // set $page to TRUE so that the title doesn't display.
244
  // @see file_entity/file_entity.tpl.php.
245
  if (!empty($vars['override']['wysiwyg']) &&
246
      _media_ckeditor_fully_rendered_files_in_wysiwyg()) {
247
    $vars['page'] = TRUE;
248
  }
249
}