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 get a submit and cancel button 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 = '
';
$plugin_output[$key]['#markup'] .= $fake_buttons;
}
// I'm not sure if it is ever the case that a plugin form will ever have
// the correct cancel button so we add it here. Put it inline with the
// current submit button. This is a fairly broad assumption.
if (!empty($plugin_output[$key]['form']['actions']) && !isset($plugin_output[$key]['form']['actions']['cancel'])) {
$plugin_output[$key]['form']['actions']['cancel'] = array(
'#type' => 'link',
'#title' => t('Cancel'),
'#href' => '',
'#attributes' => array(
'class' => array(
'button',
'button-no',
'fake-cancel',
$key,
),
),
'#weight' => 100,
);
}
}
// 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' => '
\n",
);
}
drupal_add_js($settings, 'setting');
$output['title'] = array(
'#markup' => t('Select a file')
);
$output['tabset']['tabs'] = array(
'#theme' => 'menu_local_tasks',
'#attributes' => array('class' => array('tabs', 'primary')),
'#primary' => $tabs,
);
$output['tabset']['panes'] = $plugin_output;
return $output;
}
/**
* Provides a singleton of the params passed to the media browser.
*
* This is useful in situations like form alters because callers can pass
* id="wysiywg_form" or whatever they want, and a form alter could pick this up.
* We may want to change the hook_media_browser_plugin_view() implementations to
* use this function instead of being passed params for consistency.
*
* It also offers a chance for some meddler to meddle with them.
*
* @see media_browser()
*/
function media_set_browser_params() {
$params = &drupal_static(__FUNCTION__, array());
if (empty($params)) {
// Build out browser settings. Permissions- and security-related behaviors
// should not rely on these parameters, since they come from the HTTP query.
// @TODO make sure we treat parameters as user input.
$params = drupal_get_query_parameters() + array(
'types' => array(),
'multiselect' => FALSE,
);
// Transform text 'true' and 'false' to actual booleans.
foreach ($params as $k => $v) {
if ($v === 'true') {
$params[$k] = TRUE;
}
elseif ($v === 'false') {
$params[$k] = FALSE;
}
}
array_walk_recursive($params, 'media_recursive_check_plain');
// Allow modules to alter the parameters.
drupal_alter('media_browser_params', $params);
}
return $params;
}
/**
* For sanity in grammar.
*
* @see media_set_browser_params()
*/
function media_get_browser_params() {
return media_set_browser_params();
}
/**
* Attaches media browser javascript to an element.
*
* @param array $element
* The element array to attach to.
*/
function media_attach_browser_js(&$element) {
$javascript = media_browser_js();
foreach ($javascript as $key => $definitions) {
foreach ($definitions as $definition) {
$element['#attached'][$key][] = $definition;
}
}
}
/**
* Helper function to define browser javascript.
*/
function media_browser_js() {
$settings = array(
'browserUrl' => url('media/browser', array(
'query' => array('render' => 'media-popup'),
)
),
'styleSelectorUrl' => url('media/-media_id-/format-form', array(
'query' => array('render' => 'media-popup'),
)
),
);
$js = array(
'library' => array(
array('media', 'media_browser'),
),
'js' => array(
array(
'data' => array('media' => $settings),
'type' => 'setting',
),
),
);
return $js;
}
/**
* Menu callback for testing the media browser.
*/
function media_browser_testbed($form) {
media_attach_browser_js($form);
$form['test_element'] = array(
'#type' => 'media',
'#media_options' => array(
'global' => array(
'types' => array('video', 'audio'),
),
),
);
$launcher = ' Launch Media Browser';
$form['options'] = array(
'#type' => 'textarea',
'#title' => 'Options (JSON)',
'#rows' => 10,
);
$form['launcher'] = array(
'#markup' => $launcher,
);
$form['result'] = array(
'#type' => 'textarea',
'#title' => 'Result',
);
$js = <<').change(function() { jQuery('#edit-options').val(jQuery(this).val())});
jQuery('.form-item-options').append('