Projet

Général

Profil

Paste
Télécharger (8,58 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / media / includes / media.admin.inc @ 74f6bef0

1 85ad3d82 Assos Assos
<?php
2
3
/**
4
 * @file
5
 * This file contains the admin functions for the Media module.
6
 */
7
8
/**
9
 * Include media.pages.inc since it has some form definitions we will use.
10
 */
11
require_once dirname(__FILE__) . '/media.pages.inc';
12
13
/**
14
 * Form callback for mass import.
15
 */
16
function media_import($form, &$form_state) {
17
  if (!isset($form_state['storage']['files'])) {
18
    $form_state['storage']['step'] = 'choose';
19
    $form_state['storage']['next_step'] = 'preview';
20
    $form['directory'] = array(
21
      '#type' => 'textfield',
22
      '#title' => t('Directory'),
23
      '#description' => t('Enter the absolute directory on the web server to look for files. Subdirectories inside this directory will not be scanned.'),
24
      '#required' => TRUE,
25
    );
26
27
    $form['pattern'] = array(
28
      '#type' => 'textarea',
29
      '#title' => t('Pattern'),
30
      '#description' => t("Only files matching these patterns will be imported. Enter one pattern per line. The '*' character is a wildcard. Example patterns are %png_example to import all PNG files.", array('%png_example' => '*.png')),
31
      '#default_value' => '*',
32
      '#required' => TRUE,
33
    );
34
35
    $form['actions'] = array('#type' => 'actions');
36
    $form['actions']['submit'] = array(
37
      '#type' => 'submit',
38
      '#value' => t('Preview'),
39
    );
40
    $form['actions']['cancel'] = array(
41
      '#type' => 'link',
42
      '#title' => t('Cancel'),
43
      '#href' => isset($_GET['destination']) ? $_GET['destination'] : 'admin/content/file',
44
    );
45
  }
46
  else {
47
    $form['preview'] = array(
48
      '#markup' => theme('item_list', array('items' => $form_state['storage']['files'])),
49
    );
50
51
    $form = confirm_form($form, t('Import these files?'), 'admin/content/file/import');
52
  }
53
  return $form;
54
55
}
56
57
/**
58
 * Validate handler for media_import().
59
 */
60
function media_import_validate($form, &$form_state) {
61
  if ($form_state['values']['op'] != t('Confirm')) {
62
    $directory = $form_state['values']['directory'];
63
    $pattern = $form_state['values']['pattern'];
64
    if (!is_dir($directory)) {
65
      form_set_error('directory', t('The provided directory does not exist.'));
66
    }
67
    if (!is_readable($directory)) {
68
      form_set_error('directory', t('The provided directory is not readable.'));
69
    }
70
71
    $pattern_quoted = preg_quote($pattern, '/');
72
    $pattern_quoted = preg_replace('/(\r\n?|\n)/', '|', $pattern_quoted);
73
    $pattern_quoted = strtr($pattern_quoted, array(
74
      '\\|' => '|',
75
      '\\*' => '.*',
76
      '\\?' => '.?',
77
    ));
78
    $files = file_scan_directory($directory, '/^(' . $pattern_quoted . ')$/', array('recurse' => FALSE));
79
    $files = array_keys($files);
80
    if (empty($files)) {
81
      form_set_error('pattern', t('No files were found in %directory matching the regular expression %pattern', array('%directory' => $directory, '%pattern' => $pattern_quoted)));
82
    }
83
    $form_state['storage']['files'] = $files;
84
  }
85
}
86
87
/**
88
 * Submit handler for media_import().
89
 */
90
function media_import_submit($form, &$form_state) {
91
  if ($form_state['values']['op'] == t('Confirm')) {
92
    $files = $form_state['storage']['files'];
93
    $batch = array(
94
      'title' => t('Importing'),
95
      'operations' => array(
96
        array('media_import_batch_import_files', array($files)),
97
      ),
98
      'finished' => 'media_import_batch_import_complete',
99
      'file' => drupal_get_path('module', 'media') . '/includes/media.admin.inc',
100
    );
101
    batch_set($batch);
102
    return;
103
104
  }
105
  $form_state['rebuild'] = TRUE;
106
}
107
108
/**
109
 * BatchAPI callback op for media import.
110
 */
111
function media_import_batch_import_files($files, &$context) {
112
  if (!isset($context['sandbox']['files'])) {
113
    // This runs the first time the batch runs.
114
    // This is stupid, but otherwise, I don't think it will work...
115
    $context['results'] = array('success' => array(), 'errors' => array());
116
    $context['sandbox']['max'] = count($files);
117
    $context['sandbox']['files'] = $files;
118
  }
119
  $files =& $context['sandbox']['files'];
120
121
  // Take a cut of files.  Let's do 10 at a time.
122
  $import_batch_size = variable_get('media__import_batch_size', 20);
123
  $length = (count($files) > $import_batch_size) ? $import_batch_size : count($files);
124
  $to_process = array_splice($files, 0, $length);
125
  $image_in_message = '';
126
127
  foreach ($to_process as $file) {
128
    try {
129
      $file_obj = media_parse_to_file($file);
130
      $context['results']['success'][] = $file;
131
      if (!$image_in_message) {
132
        // @todo Is this load step really necessary? When there's time, test
133
        //   this, and either remove it, or comment why it's needed.
134
        $loaded_file = file_load($file_obj->fid);
135
        $image_in_message = file_view_file($loaded_file, 'preview');
136
      }
137
    }
138
    catch (Exception $e) {
139
      $context['results']['errors'][] = $file . " Reason: " . $e->getMessage();
140
    }
141
  }
142
143
  $context['message'] = "Importing " . theme('item_list', array('items' => $to_process));
144
  // Show the image that is being imported.
145
  $context['message'] .= drupal_render($image_in_message);
146
147
  $context['finished'] = ($context['sandbox']['max'] - count($files)) / $context['sandbox']['max'];
148
}
149
150
/**
151
 * BatchAPI complete callback for media import.
152
 */
153
function media_import_batch_import_complete($success, $results, $operations) {
154
  if ($results['errors']) {
155
    drupal_set_message(theme('item_list', array('items' => $results['errors'])), 'error');
156
  }
157
  if ($results['success']) {
158
    drupal_set_message(theme('item_list', array('items' => $results['success'])));
159
  }
160
}
161
162
/**
163
 * Admin configruation form for media browser settings.
164
 */
165
function media_admin_config_browser($form, &$form_state) {
166
  $theme_options = array();
167
  $theme_options[NULL] = 'Default administration theme';
168
  foreach (list_themes() as $key => $theme) {
169
    if ($theme->status) {
170
      $theme_options[$key] = $theme->info['name'];
171
    }
172
  }
173
174
  $form['media__dialog_theme'] = array(
175
    '#type' => 'select',
176
    '#title' => t('Media browser theme'),
177
    '#options' => $theme_options,
178
    '#description' => t("This theme will be used for all media related dialogs.
179
      It can be different from your site's theme because many site themes do not
180
      work well in the small windows which media uses."),
181
    '#default_value' => variable_get('media__dialog_theme', ''),
182
  );
183
184
  // Additional configuration if the WYSIWYG module is enabled.
185
  $form['wysiwyg'] = array(
186
    '#type' => 'fieldset',
187
    '#title' => t('WYSIWYG configuration'),
188
    '#collapsible' => TRUE,
189
    '#collapsed' => FALSE,
190
    '#access' => module_exists('wysiwyg'),
191
  );
192
  $plugins = media_get_browser_plugin_info();
193
  $form['wysiwyg']['media__wysiwyg_browser_plugins'] = array(
194
    '#type' => 'checkboxes',
195
    '#title' => t('Enabled browser plugins'),
196
    '#options' => array(),
197
    '#required' => FALSE,
198
    '#default_value' => variable_get('media__wysiwyg_browser_plugins', array()),
199
    '#description' => t('If no plugins are selected, they will all be available.'),
200
  );
201
  foreach ($plugins as $key => $plugin) {
202
    $form['wysiwyg']['media__wysiwyg_browser_plugins']['#options'][$key] = !empty($plugin['title']) ? $plugin['title'] : $key;
203
  }
204
  $form['wysiwyg']['media__wysiwyg_upload_directory'] = array(
205
    '#type' => 'textfield',
206
    '#title' => t("File directory for uploaded media"),
207
    '#default_value' => variable_get('media__wysiwyg_upload_directory', ''),
208
    '#description' => t('Optional subdirectory within the upload destination where files will be stored. Do not include preceding or trailing slashes.'),
209
  );
210
211
  if (module_exists('token')) {
212
    $form['wysiwyg']['media__wysiwyg_upload_directory']['#description'] .= t('This field supports tokens.');
213
    $form['wysiwyg']['tokens'] = array(
214
      '#theme' => 'token_tree',
215
      '#dialog' => TRUE,
216
    );
217
  }
218
219
  $form['wysiwyg']['media__wysiwyg_allowed_types'] = array(
220
    '#type' => 'checkboxes',
221
    '#title' => t('Allowed types in WYSIWYG'),
222
    '#options' => file_entity_type_get_names(),
223
    '#default_value' => variable_get('media__wysiwyg_allowed_types', array('audio', 'image', 'video', 'document')),
224
  );
225
  $form['array_filter'] = array('#type' => 'value', '#value' => TRUE);
226
227
  $form['#submit'][] = 'media_admin_config_browser_pre_submit';
228
  return system_settings_form($form);
229
}
230
231
/**
232
 * Manipulate values before form is submitted.
233
 */
234
function media_admin_config_browser_pre_submit(&$form, &$form_state) {
235
  if (!$form_state['values']['media__dialog_theme']) {
236
    variable_del('media__dialog_theme');
237
    unset($form_state['values']['media__dialog_theme']);
238
  }
239
  $wysiwyg_browser_plugins = array_unique(array_values($form_state['values']['media__wysiwyg_browser_plugins']));
240
  if (empty($wysiwyg_browser_plugins[0])) {
241
    variable_del('media__wysiwyg_browser_plugins');
242
    unset($form_state['values']['media__wysiwyg_browser_plugins']);
243
  }
244
}