diff options
Diffstat (limited to 'sites/all/modules/media/includes/media.browser.inc')
-rw-r--r-- | sites/all/modules/media/includes/media.browser.inc | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/sites/all/modules/media/includes/media.browser.inc b/sites/all/modules/media/includes/media.browser.inc new file mode 100644 index 000000000..d5285f0a4 --- /dev/null +++ b/sites/all/modules/media/includes/media.browser.inc @@ -0,0 +1,244 @@ +<?php + +/** + * @file + * Summon plugins and render the media browser. + */ + +/** + * Media browser page callback. + */ +function media_browser($selected = NULL) { + $output = array(); + $output['#attached']['library'][] = array('media', 'media_browser_page'); + + $params = media_get_browser_params(); + + // If one or more files have been selected, the browser interaction is now + // complete. Return empty page content to the dialog which now needs to close, + // but populate Drupal.settings with information about the selected files. + if (isset($params['fid'])) { + $fids = is_array($params['fid']) ? $params['fid'] : array($params['fid']); + if (!is_numeric($fids[0])) { + throw new Exception('Error selecting media, fid param is not an fid or an array of fids'); + } + $files = file_load_multiple($fids); + foreach ($files as $file) { + $view_mode = isset($params['view_mode']) ? $params['view_mode'] : 'preview'; + media_browser_build_media_item($file, $view_mode); + } + $setting = array('media' => array('selectedMedia' => array_values($files))); + drupal_add_js($setting, 'setting'); + return $output; + } + + $plugins = media_get_browser_plugin_info(); + + // Allow parameters to provide a list of enabled or disabled media browser + // plugins. + if (!empty($params['enabledPlugins'])) { + $plugins = array_intersect_key($plugins, array_fill_keys($params['enabledPlugins'], 1)); + } + elseif (!empty($params['disabledPlugins'])) { + $plugins = array_diff_key($plugins, array_fill_keys($params['disabledPlugins'], 1)); + } + + // Render plugins. + $plugin_output = array(); + foreach ($plugins as $key => $plugin_info) { + // Support the old CTools style handler definition. + if (!isset($plugin_info['class']) && !empty($plugin_info['handler'])) { + if (is_string($plugin_info['handler'])) { + $plugin_info['class'] = $plugin_info['handler']; + } + elseif (isset($plugin_info['handler']['class'])) { + $plugin_info['class'] = $plugin_info['handler']['class']; + } + } + + if (empty($plugin_info['class']) || !class_exists($plugin_info['class'])) { + continue; + } + + $plugin = new $plugin_info['class']($plugin_info, $params); + if ($plugin->access()) { + $plugin_output[$key] = $plugin->view(); + if (!empty($plugin_output[$key]) && is_array($plugin_output[$key])) { + $plugin_output[$key] += array( + '#title' => $plugin_info['title'], + '#weight' => isset($plugin_info['weight']) ? $plugin_info['weight'] : 0, + ); + } + else { + unset($plugin_output[$key]); + continue; + } + } + else { + continue; + } + + // We need to ensure that a submit button is available on each tab. If the + // plugin is not returning a form element we need to add a submit button. + // This is a fairly broad assumption. + if (empty($plugin_output[$key]['#form']) && !empty($plugin_output[$key]['#markup'])) { + $fake_buttons = '<div class="form-actions form-wrapper">'; + $fake_buttons .= l(t('Submit'), '', array( + 'attributes' => array( + 'class' => array('button', 'button-yes', 'fake-submit', $key), + ), + )); + $fake_buttons .= '</div>'; + $plugin_output[$key]['#markup'] .= $fake_buttons; + } + } + + // Allow modules to change the tab names or whatever else they want to change + // before we render. Perhaps this should be an alter on the theming function + // that we should write to be making the tabs. + drupal_alter('media_browser_plugins', $plugin_output); + + $tabs = array(); + $settings = array('media' => array('browser' => array())); + + foreach (element_children($plugin_output, TRUE) as $key) { + // Add any JavaScript settings from the browser tab. + if (!empty($plugin_output[$key]['#settings'])) { + $settings['media']['browser'][$key] = $plugin_output[$key]['#settings']; + } + + // If this is a "ajax" style tab, add the href, otherwise an id. jQuery UI + // will use an href value to load content from that url + $tabid = 'media-tab-' . check_plain($key); + if (!empty($plugin_output[$key]['#callback'])) { + $href = $plugin_output[$key]['#callback']; + } + else { + $attributes = array( + 'class' => array('media-browser-tab'), + 'id' => $tabid, + 'data-tabid' => $key, + ); + // Create a div for each tab's content. + $plugin_output[$key] += array( + '#prefix' => '<div '. drupal_attributes($attributes) . ">\n", + '#suffix' => "</div>\n", + ); + } + + $attributes = array( + 'href' => '#' . $tabid, + 'data-tabid' => $key, + 'title' => $plugin_output[$key]['#title'], + ); + $tabs[]['element'] = array( + '#markup' => '<li><a' . drupal_attributes($attributes) . '>' . check_plain($plugin_output[$key]['#title']) . "</a></li>\n", + ); + } + + drupal_add_js($settings, 'setting'); + + $output['tabset']['tabs'] = array( + '#theme' => 'menu_local_tasks', + '#attributes' => array('class' => array('tabs', 'primary')), + '#primary' => $tabs, + ); + + $output['tabset']['panes'] = $plugin_output; + + return $output; +} + +/** + * Menu callback for testing the media browser. + */ +function media_browser_testbed($form) { + $form['#attached']['library'][] = array('media', 'media_browser'); + $form['#attached']['library'][] = array('media', 'media_browser_settings'); + + $form['test_element'] = array( + '#type' => 'media', + '#media_options' => array( + 'global' => array( + 'types' => array('video', 'audio'), + ), + ), + ); + + $launcher = '<a href="#" id="launcher"> Launch Media Browser</a>'; + + $form['options'] = array( + '#type' => 'textarea', + '#title' => 'Options (JSON)', + '#rows' => 10, + ); + + $form['launcher'] = array( + '#markup' => $launcher, + ); + + $form['result'] = array( + '#type' => 'textarea', + '#title' => 'Result', + ); + + $js = <<<EOF + Drupal.behaviors.mediaTest = { + attach: function(context, settings) { + var delim = "---"; + var recentOptions = []; + var recentOptionsCookie = jQuery.cookie("recentOptions"); + if (recentOptionsCookie) { + recentOptions = recentOptionsCookie.split("---"); + } + + var recentSelectBox = jQuery('<select id="recent_options" style="width:100%"></select>').change(function() { jQuery('#edit-options').val(jQuery(this).val())}); + + jQuery('.form-item-options').append('<label for="recent_options">Recent</a>'); + jQuery('.form-item-options').append(recentSelectBox); + jQuery('.form-item-options').append(jQuery('<a href="#">Reset</a>').click(function() {alert('reset'); jQuery.cookie("recentOptions", null); window.location.reload(); })); + + jQuery.each(recentOptions, function (idx, val) { + recentSelectBox.append(jQuery('<option></option>').val(val).html(val)); + }); + + + jQuery('#launcher').click(function () { + jQuery('#edit-result').val(''); + var options = {}; + var optionsTxt = jQuery('#edit-options').val(); + if (optionsTxt) { + // Store it in the recent box + recentOptionsCookie += "---" + optionsTxt + jQuery.cookie("recentOptions", recentOptionsCookie, { expires: 7 }); + recentSelectBox.append(jQuery('<option></option>').val(optionsTxt).html(optionsTxt)); + options = eval('(' + optionsTxt + ')'); + } + Drupal.media.popups.mediaBrowser(Drupal.behaviors.mediaTest.mediaSelected, options); + return false; + }); + }, + + mediaSelected: function(selectedMedia) { + var result = JSON.stringify(selectedMedia); + jQuery('#edit-result').val(result); + } + } + +EOF; + + drupal_add_js($js, array('type' => 'inline')); + return $form; +} + +/** + * Adds additional properties to a file which are needed by the browser JS code. + * + * @param object $file + * A Drupal file object. + */ +function media_browser_build_media_item($file, $view_mode = 'preview') { + $preview = media_get_thumbnail_preview($file, NULL, $view_mode); + $file->preview = drupal_render($preview); + $file->url = file_create_url($file->uri); +} |