325 lines
10 KiB
Plaintext
325 lines
10 KiB
Plaintext
<?php
|
|
|
|
include_once('debut_media.features.inc');
|
|
|
|
/**
|
|
* Implements hook_init().
|
|
*
|
|
* Add javascript and css required for the media browser link.
|
|
*/
|
|
function debut_media_init() {
|
|
if (arg(0) == 'file' && is_null(arg(1))) {
|
|
$path = drupal_get_path('module', 'media');
|
|
$element['#attached'] = array(
|
|
'js' => array($path . '/js/media.admin.js'),
|
|
'css' => array($path . '/css/media.css'),
|
|
);
|
|
module_load_include('inc', 'media', 'includes/media.browser');
|
|
media_attach_browser_js($element);
|
|
// Render an empty element to add the js and css.
|
|
drupal_render($element);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements hook_menu_alter().
|
|
*
|
|
* Add a local action link to the media page.
|
|
*/
|
|
function debut_media_menu_alter(&$items) {
|
|
if (isset($items['media/browser'])) {
|
|
$items['media/add'] = $items['media/browser'];
|
|
$items['media/add']['type'] = MENU_LOCAL_ACTION;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements hook_entity_info_alter().
|
|
*
|
|
* Enable custom settings for the 'full' file view mode.
|
|
* See http://drupal.org/node/1291428.
|
|
*/
|
|
function debut_media_entity_info_alter(&$entity_info) {
|
|
$entity_info['file']['view modes']['full']['custom settings'] = TRUE;
|
|
}
|
|
|
|
/**
|
|
* Implements hook_module_implements_alter().
|
|
*
|
|
* Extends the core file entity to be fieldable. Modules can define file types
|
|
* via hook_file_type_info(). For each defined type, create a bundle, so that
|
|
* fields can be configured per file type.
|
|
*/
|
|
function debut_media_module_implements_alter(&$implementations, $hook) {
|
|
if ($hook == 'entity_info_alter') {
|
|
// Move debut_media_entity_info_alter() to the end of the list.
|
|
// module_implements() iterates through $implementations with a foreach
|
|
// loop which PHP iterates in the order that the items were added, so to
|
|
// move an item to the end of the array, we remove it and then add it.
|
|
$group = $implementations['debut_media'];
|
|
unset($implementations['debut_media']);
|
|
$implementations['debut_media'] = $group;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implements hook_views_data_alter().
|
|
*
|
|
* Use the media_title field for the file fid argument's name field.
|
|
*
|
|
* @todo: determine why this doesn't appear to work with views contextual
|
|
* filters;
|
|
*/
|
|
function debut_media_views_data_alter(&$data) {
|
|
$data['file_managed']['fid']['argument']['name field'] = 'media_title';
|
|
$data['file_managed']['fid']['argument']['name table'] = 'field_data_media_title';
|
|
}
|
|
|
|
/**
|
|
* Implements hook_page_alter().
|
|
*
|
|
* Set the page title for media items to the title of the item.
|
|
*/
|
|
function debut_media_page_alter(&$variables) {
|
|
if (arg(0) == 'file' && $file = menu_get_object('file')) {
|
|
if (!empty($file->media_title['und'][0]['safe_value'])) {
|
|
drupal_set_title($file->media_title['und'][0]['safe_value']);
|
|
}
|
|
}
|
|
// Add late in the page generation process to override the jcarousel css.
|
|
drupal_add_css(drupal_get_path('module', 'debut_media') . '/debut_media.css');
|
|
}
|
|
|
|
/**
|
|
* Implementation of Styles module hook_styles_default_styles().
|
|
*/
|
|
function debut_media_styles_default_styles() {
|
|
return array(
|
|
'file' => array(
|
|
'styles' => array(
|
|
'medium_large' => array(
|
|
'label' => 'Medium large',
|
|
'description' => 'A medium large format of the media.',
|
|
),
|
|
'small_square_thumbnail' => array(
|
|
'label' => 'Small square thumbnail',
|
|
'description' => 'A small, square format of the media.',
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Implementation of Styles module hook_styles_default_presets_alter().
|
|
*/
|
|
function debut_media_styles_default_presets_alter(&$presets) {
|
|
foreach (array_keys(debut_media_image_default_styles()) as $image_style) {
|
|
// Cover the containers defined by file_styles and media_youtube.
|
|
foreach (array('application', 'image', 'audio', 'video', 'default', 'media_youtube', 'media_vimeo') as $type) {
|
|
// Ensure another module hasn't removed the container.
|
|
if (isset($presets['file']['containers'][$type])) {
|
|
$presets['file']['containers'][$type]['styles'][$image_style] = array(
|
|
'default preset' => 'medium_large',
|
|
);
|
|
$presets['file']['containers'][$type]['presets'][$image_style] = array(
|
|
array(
|
|
'name' => 'image_style',
|
|
'settings' => array(
|
|
'image_style' => $image_style,
|
|
),
|
|
),
|
|
array(
|
|
'name' => 'thumbnail',
|
|
'settings' => array(),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implementation of hook_field_default_fields_alter().
|
|
*
|
|
* Selectively add media fields to content types provided by features. To
|
|
* receive a media_field instance, the feature should include the following in
|
|
* its .info file:
|
|
* debut[media][node_types][my_content_type] = my_content_type
|
|
* where my_content_type is the name of a feature-provided content type.
|
|
*
|
|
* The media field status of a feature's content type can be altered by using
|
|
* hook_system_info_alter(). Example:
|
|
* %code
|
|
* function example_system_info_alter(&$info, $module, $type) {
|
|
* if ($type == $module && $module->name == 'debut_article') {
|
|
* unset($info['debut']['media']['article']);
|
|
* }
|
|
* }
|
|
* %endcode
|
|
*/
|
|
function debut_media_field_default_fields_alter(&$items) {
|
|
// Get features modules and determine which if claim media.
|
|
$features = features_get_features();
|
|
$node_types = array();
|
|
foreach ($features as $feature) {
|
|
$info = $feature->info;
|
|
if (isset($info['debut']) && isset($info['debut']['media']) && isset($info['debut']['media']['node_types'])) {
|
|
// Key the array by node type to match the format of the 'service_links_node_types' variable.
|
|
$node_types = array_merge($node_types, array_combine($info['debut']['media']['node_types'], $info['debut']['media']['node_types']));
|
|
}
|
|
}
|
|
// Add media fields to the designated node types.
|
|
if (!empty($node_types)) {
|
|
$field = debut_media_media_field();
|
|
foreach ($node_types as $type) {
|
|
// Don't override an existing field. This allows features to provide
|
|
// their own version of the field.
|
|
if (!isset($items["node-$type-field_media"])) {
|
|
$field['field_instance']['bundle'] = $type;
|
|
$items["node-$type-field_media"] = $field;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the structure of the media field.
|
|
*
|
|
* The instance bundle is marked as 'placeholder'. It should be converted to
|
|
* the appropriate node type before being used.
|
|
*/
|
|
function debut_media_media_field() {
|
|
$field = array(
|
|
'field_config' => array(
|
|
'active' => '1',
|
|
'cardinality' => '-1',
|
|
'deleted' => '0',
|
|
'entity_types' => array(),
|
|
'field_name' => 'field_media',
|
|
'foreign keys' => array(
|
|
'fid' => array(
|
|
'columns' => array(
|
|
'fid' => 'fid',
|
|
),
|
|
'table' => 'file_managed',
|
|
),
|
|
),
|
|
'indexes' => array(
|
|
'fid' => array(
|
|
0 => 'fid',
|
|
),
|
|
),
|
|
'module' => 'file',
|
|
'settings' => array(
|
|
'display_default' => 0,
|
|
'display_field' => 0,
|
|
'uri_scheme' => 'public',
|
|
),
|
|
'translatable' => '0',
|
|
'type' => 'file',
|
|
),
|
|
'field_instance' => array(
|
|
'bundle' => 'placeholder',
|
|
'deleted' => '0',
|
|
'description' => '',
|
|
'display' => array(
|
|
'default' => array(
|
|
'label' => 'hidden',
|
|
'module' => 'file_entity',
|
|
'settings' => array(
|
|
'file_view_mode' => 'media_large',
|
|
),
|
|
'type' => 'file_rendered',
|
|
'weight' => '4',
|
|
),
|
|
'teaser' => array(
|
|
'label' => 'above',
|
|
'settings' => array(),
|
|
'type' => 'hidden',
|
|
'weight' => 0,
|
|
),
|
|
),
|
|
'entity_type' => 'node',
|
|
'field_name' => 'field_media',
|
|
'label' => 'Media',
|
|
'required' => 0,
|
|
'settings' => array(
|
|
'description_field' => 0,
|
|
'file_directory' => '',
|
|
'file_extensions' => 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp',
|
|
'max_filesize' => '',
|
|
'user_register_form' => FALSE,
|
|
),
|
|
'widget' => array(
|
|
'active' => 1,
|
|
'module' => 'media',
|
|
'settings' => array(
|
|
'allowed_schemes' => array(
|
|
'public' => 'public',
|
|
'vimeo' => 'vimeo',
|
|
'youtube' => 'youtube',
|
|
),
|
|
'allowed_types' => array(
|
|
'audio' => 0,
|
|
'default' => 'default',
|
|
'image' => 'image',
|
|
'video' => 'video',
|
|
),
|
|
'browser_plugins' => array(
|
|
'library' => 0,
|
|
'media_default--media_browser_1' => 0,
|
|
'media_internet' => 0,
|
|
'upload' => 0,
|
|
),
|
|
'progress_indicator' => 'throbber',
|
|
),
|
|
'type' => 'media_generic',
|
|
'weight' => '10',
|
|
),
|
|
),
|
|
);
|
|
|
|
return $field;
|
|
}
|
|
|
|
/**
|
|
* Implements hook_file_default_displays_alter().
|
|
*
|
|
* Clone settings for 'media_large' to new 'full' view mode. Add a generic file
|
|
* fallback for each view mode + file type combo.
|
|
*
|
|
* @todo: remove 'media_large' to 'full' cloning once media provider modules
|
|
* catch up. See http://drupal.org/node/1291428.
|
|
*/
|
|
function debut_media_file_default_displays_alter(&$items) {
|
|
$info = entity_get_info('file');
|
|
$bundles = array_keys($info['bundles']);
|
|
$view_modes = array_keys($info['view modes']);
|
|
|
|
foreach ($items as $key => $data) {
|
|
list($file_type, $view_mode, $formatter_name) = explode('__', $key);
|
|
if ($view_mode == 'media_large') {
|
|
$display_name = implode('__', array($file_type, 'full', $formatter_name));
|
|
if (!isset($items[$display_name])) {
|
|
$items[$display_name] = clone($data);
|
|
$items[$display_name]->name = $display_name;
|
|
}
|
|
}
|
|
}
|
|
foreach ($bundles as $file_type) {
|
|
foreach ($view_modes as $view_mode) {
|
|
$display_name = implode('__', array($file_type, $view_mode, 'file_field_file_default'));
|
|
if (!isset($items[$display_name])) {
|
|
$items[$display_name] = (object) array(
|
|
'api_version' => 1,
|
|
'name' => $display_name,
|
|
'status' => 1,
|
|
'weight' => 35,
|
|
'settings' => array(),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|