'YouTube settings',
'description' => 'Configure sitewide settings for embedded YouTube video fields.',
'page callback' => 'drupal_get_form',
'page arguments' => array('youtube_settings_form'),
'access arguments' => array('administer youtube'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
/**
* Implements hook_permission().
*/
function youtube_permission() {
return array(
'administer youtube' => array(
'title' => t('Administer YouTube field'),
'description' => t('Set default configurations for YouTube field settings.'),
),
);
}
/**
* Settings form for YouTube field module.
*/
function youtube_settings_form($form) {
$form = array();
$form['text'] = array(
'#type' => 'markup',
'#markup' => '
' . t('The following settings will be used as default values
on all YouTube video fields. More settings can be altered in the display
settings of individual fields.') . '
',
);
$form['youtube_global'] = array(
'#type' => 'fieldset',
'#title' => t('Video parameters'),
);
$form['youtube_global']['youtube_suggest'] = array(
'#type' => 'checkbox',
'#title' => t('Show suggested videos when the video finishes (rel).'),
'#default_value' => variable_get('youtube_suggest', TRUE),
);
$form['youtube_global']['youtube_modestbranding'] = array(
'#type' => 'checkbox',
'#title' => t('Do not show YouTube logo on video player (modestbranding).'),
'#default_value' => variable_get('youtube_modestbranding', FALSE),
);
$form['youtube_global']['youtube_theme'] = array(
'#type' => 'checkbox',
'#title' => t('Use a light colored control bar for video player controls (theme).'),
'#default_value' => variable_get('youtube_theme', FALSE),
);
$form['youtube_global']['youtube_color'] = array(
'#type' => 'checkbox',
'#title' => t('Use a white colored video progress bar (color).'),
'#default_value' => variable_get('youtube_color', FALSE),
'#description' => 'Note: the modestbranding parameter will be ignored when this is in use.',
);
$form['youtube_global']['youtube_enablejsapi'] = array(
'#type' => 'checkbox',
'#title' => t('Enable use of the JavaScript API (enablejsapi, origin).'),
'#default_value' => variable_get('youtube_enablejsapi', FALSE),
'#description' => 'For more information on the Javascript API and how to use it, see the JavaScript API documentation.',
);
$form['youtube_global']['youtube_wmode'] = array(
'#type' => 'checkbox',
'#title' => t('Fix overlay problem in IE (wmode).'),
'#default_value' => variable_get('youtube_wmode', TRUE),
'#description' => t('Checking this will fix the issue of a YouTube video showing above elements with fixed or absolute positioning (including Drupal\'s Overlay and Toolbar).'),
);
$form['youtube_thumbs'] = array(
'#type' => 'fieldset',
'#title' => t('Thumbnails'),
);
$form['youtube_thumbs']['youtube_thumb_dir'] = array(
'#type' => 'textfield',
'#title' => t('YouTube thumbnail directory'),
'#field_prefix' => variable_get('file_public_path', conf_path() . '/files') . '/',
'#field_suffix' => '/thumbnail.png',
'#description' => t('Location, within the files directory, where you would like the YouTube thumbnails stored.'),
'#default_value' => variable_get('youtube_thumb_dir', 'youtube'),
);
$form['youtube_thumbs']['youtube_thumb_hires'] = array(
'#type' => 'checkbox',
'#title' => t('Save higher resolution thumbnail images'),
'#description' => t('This will save thumbnails larger than the default size, 480x360, to the thumbnails directory specified above.'),
'#default_value' => variable_get('youtube_thumb_hires', FALSE),
);
$form['youtube_thumbs']['youtube_thumb_delete_all'] = array(
'#type' => 'submit',
'#value' => t('Refresh existing thumbnail image files'),
'#submit' => array('youtube_thumb_delete_all'),
);
$form['youtube_privacy'] = array(
'#type' => 'checkbox',
'#title' => t('Enable privacy-enhanced mode.'),
'#default_value' => variable_get('youtube_privacy', FALSE),
'#description' => t('Checking this box will prevent YouTube from setting cookies in your site visitors browser.'),
);
$form['youtube_player_class'] = array(
'#type' => 'textfield',
'#title' => t('YouTube player class'),
'#default_value' => variable_get('youtube_player_class', 'youtube-field-player'),
'#description' => t('The iframe of every player will be given this class. They will also be given IDs based off of this value.'),
);
return system_settings_form($form);
}
/**
* Implements hook_field_info().
*/
function youtube_field_info() {
return array(
// We name our field as the associative name of the array.
'youtube' => array(
'label' => t('YouTube video'),
'description' => t('A video hosted on YouTube.'),
'default_widget' => 'youtube',
'default_formatter' => 'youtube_video',
'property_type' => 'youtube',
'property_callbacks' => array('youtube_property_info_callback'),
),
);
}
/**
* Callback to alter the property info of youtube fields.
*
* @see hook_field_info().
*/
function youtube_property_info_callback(&$info, $entity_type, $field, $instance, $field_type) {
$name = $field['field_name'];
$property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];
$property['type'] = ($field['cardinality'] != 1) ? 'list' : 'youtube';
$property['getter callback'] = 'entity_metadata_field_verbatim_get';
$property['setter callback'] = 'entity_metadata_field_verbatim_set';
$property['property info'] = youtube_field_data_property_info();
unset($property['query callback']);
}
/**
* Defines info for the properties of youtube field data.
*/
function youtube_field_data_property_info($name = NULL) {
return array(
'input' => array(
'label' => t('YouTube URL'),
'description' => t('The absolute URL for the YouTube video.'),
'type' => 'text',
'getter callback' => 'entity_property_verbatim_get',
'setter callback' => 'entity_property_verbatim_set',
),
'video_id' => array(
'label' => t('YouTube Video ID'),
'description' => t('The ID assigned to the YouTube video'),
'type' => 'text',
'getter callback' => 'entity_property_verbatim_get',
'setter callback' => 'entity_property_verbatim_set',
),
);
}
/**
* Implements hook_field_validate().
*/
function youtube_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
foreach ($items as $delta => $item) {
if (!empty($item['input'])) {
$video_id = youtube_get_video_id($item['input']);
if (!$video_id || strlen($video_id) > 15) {
$errors[$field['field_name']][$langcode][$delta][] = array(
'error' => 'youtube_invalid',
'message' => t('Please provide a valid YouTube URL.'),
);
}
}
}
}
/**
* Implements hook_field_is_empty().
*/
function youtube_field_is_empty($item, $field) {
return empty($item['input']);
}
/**
* Implements hook_field_formatter_info().
*/
function youtube_field_formatter_info() {
$formatters = array(
// This formatter displays your youtube video.
'youtube_video' => array(
'label' => t('YouTube video'),
'field types' => array('youtube'),
'settings' => array(
'youtube_size' => '420x315',
'youtube_width' => NULL,
'youtube_height' => NULL,
'youtube_autoplay' => FALSE,
'youtube_showinfo' => FALSE,
'youtube_controls' => FALSE,
'youtube_autohide' => FALSE,
'youtube_iv_load_policy' => FALSE,
),
),
// This formatter just displays a thumbnail for your video.
'youtube_thumbnail' => array(
'label' => t('YouTube thumbnail'),
'field types' => array('youtube'),
'settings' => array(
'image_style' => 'thumbnail',
'image_link' => '',
),
),
);
return $formatters;
}
/**
* Implements hook_field_formatter_settings_form().
*/
function youtube_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
if ($display['type'] == 'youtube_video') {
$element['youtube_size'] = array(
'#type' => 'select',
'#title' => t('YouTube video size'),
'#options' => youtube_size_options(),
'#default_value' => $settings['youtube_size'],
);
$element['youtube_width'] = array(
'#type' => 'textfield',
'#title' => t('Width'),
'#size' => 10,
'#default_value' => $settings['youtube_width'],
'#states' => array(
'visible' => array(
':input[name="fields[' . $field['field_name'] . '][settings_edit_form][settings][youtube_size]"]' => array('value' => 'custom'),
),
),
);
$element['youtube_height'] = array(
'#type' => 'textfield',
'#title' => t('Height'),
'#size' => 10,
'#default_value' => $settings['youtube_height'],
'#states' => array(
'visible' => array(
':input[name="fields[' . $field['field_name'] . '][settings_edit_form][settings][youtube_size]"]' => array('value' => 'custom'),
),
),
);
$element['youtube_autoplay'] = array(
'#type' => 'checkbox',
'#title' => t('Play video automatically when loaded (autoplay).'),
'#default_value' => $settings['youtube_autoplay'],
);
$element['youtube_showinfo'] = array(
'#type' => 'checkbox',
'#title' => t('Hide video title and uploader info (showinfo).'),
'#default_value' => $settings['youtube_showinfo'],
);
$element['youtube_controls'] = array(
'#type' => 'checkbox',
'#title' => t('Always hide video controls (controls).'),
'#default_value' => $settings['youtube_controls'],
);
$element['youtube_autohide'] = array(
'#type' => 'checkbox',
'#title' => t('Hide video controls after play begins (autohide).'),
'#default_value' => $settings['youtube_autohide'],
);
$element['youtube_iv_load_policy'] = array(
'#type' => 'checkbox',
'#title' => t('Hide video annotations by default (iv_load_policy).'),
'#default_value' => $settings['youtube_iv_load_policy'],
);
}
if ($display['type'] == 'youtube_thumbnail') {
$element['image_style'] = array(
'#type' => 'select',
'#title' => t('Image style'),
'#options' => image_style_options(FALSE),
'#default_value' => $settings['image_style'],
'#empty_option' => t('None (original image)'),
);
// Option to link the thumbnail to its original node, the YouTube video, or
// (if the youtube_colorbox is enabled) a Colorbox modal window.
$element['image_link'] = array(
'#title' => t('Link image to'),
'#type' => 'select',
'#default_value' => $settings['image_link'],
'#empty_option' => t('Nothing'),
'#options' => youtube_thumbnail_link_types(),
);
if (module_exists('youtube_colorbox')) {
// Add Colorbox settings to this form.
youtube_colorbox_thumbnail_field_formatter_settings($element, $instance, $settings, $field['field_name']);
}
}
return $element;
}
/**
* Implements hook_field_formatter_settings_summary().
*/
function youtube_field_formatter_settings_summary($field, $instance, $view_mode) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
// Summary for the video style.
if ($display['type'] == 'youtube_video') {
$video_sizes = youtube_size_options();
if (isset($video_sizes[$settings['youtube_size']])) {
$summary = t('YouTube video: @size', array('@size' => $video_sizes[$settings['youtube_size']]));
}
else {
$summary = t('YouTube video: 450px by 315px');
}
$parameters = array(
$settings['youtube_autoplay'],
$settings['youtube_showinfo'],
$settings['youtube_controls'],
$settings['youtube_autohide'],
$settings['youtube_iv_load_policy'],
);
foreach ($parameters as $parameter) {
if ($parameter) {
$summary .= t(', custom parameters');
break;
}
}
return $summary;
}
// Summary for the thumbnail style.
if ($display['type'] == 'youtube_thumbnail') {
$image_styles = image_style_options(FALSE);
// Unset possible 'No defined styles' option.
unset($image_styles['']);
if (isset($image_styles[$settings['image_style']])) {
$summary = t('Image style: @style.', array('@style' => $image_styles[$settings['image_style']]));
}
else {
$summary = t('Original image.');
}
// Display this setting only if image is linked.
$link_types = youtube_thumbnail_link_types();
if (isset($settings['image_link']) && isset($link_types[$settings['image_link']])) {
$summary .= '
' . t('Linked to: ') . $link_types[$settings['image_link']] . '.';
}
return $summary;
}
}
/**
* Implements hook_field_formatter_view().
*/
function youtube_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
switch ($display['type']) {
// This formatter outputs the youtube embed code.
case 'youtube_video':
foreach ($items as $delta => $item) {
$element[$delta] = array(
'#theme' => 'youtube_video',
'#video_id' => $item['video_id'],
'#entity_title' => $entity->title,
'#size' => array_key_exists('youtube_size', $display['settings']) ? $display['settings']['youtube_size']: NULL,
'#width' => array_key_exists('youtube_width', $display['settings']) ? $display['settings']['youtube_width'] : NULL,
'#height' => array_key_exists('youtube_height', $display['settings']) ? $display['settings']['youtube_height'] : NULL,
'#autoplay' => array_key_exists('youtube_autoplay', $display['settings']) ? $display['settings']['youtube_autoplay'] : FALSE,
'#showinfo' => array_key_exists('youtube_showinfo', $display['settings']) ? $display['settings']['youtube_showinfo'] : FALSE,
'#controls' => array_key_exists('youtube_controls', $display['settings']) ? $display['settings']['youtube_controls'] : FALSE,
'#autohide' => array_key_exists('youtube_autohide', $display['settings']) ? $display['settings']['youtube_autohide'] : FALSE,
'#iv_load_policy' => array_key_exists('youtube_iv_load_policy', $display['settings']) ? $display['settings']['youtube_iv_load_policy'] : FALSE,
);
}
break;
// This formatter uses an imagecache preset to generate a thumbnail.
case 'youtube_thumbnail':
// Check if the formatter involves a link.
if (isset($display['settings']['image_link'])) {
switch ($display['settings']['image_link']) {
case 'content':
$uri = entity_uri($entity_type, $entity);
$uri['options']['html'] = TRUE;
break;
case 'youtube':
$link_youtube = TRUE;
break;
case 'colorbox':
$link_colorbox = TRUE;
break;
}
}
foreach ($items as $delta => $item) {
// If the thumbnail is linked to it's youtube page, take the original url.
if (!empty($link_youtube)) {
$uri = array(
'path' => $item['input'],
'options' => array('html' => TRUE),
);
}
// Add support for the colorbox module.
if (module_exists('youtube_colorbox') && !empty($link_colorbox)) {
// Always open in an iframe for proper origin access.
if (!empty($display['settings']['colorbox']['parameters'])) {
$display['settings']['colorbox']['parameters']['iframe'] = TRUE;
}
$uri = youtube_colorbox_field_item_uri($item, $display['settings']);
}
$element[$delta] = array(
'#theme' => 'youtube_thumbnail',
'#video_id' => $item['video_id'],
'#entity_title' => $entity->title,
'#image_style' => $display['settings']['image_style'],
'#image_link' => isset($uri) ? $uri : '',
);
}
break;
}
return $element;
}
/**
* Implements hook_field_widget_info().
*/
function youtube_field_widget_info() {
return array(
'youtube' => array(
'label' => t('YouTube'),
'field types' => array('youtube'),
),
);
}
/**
* Implements hook_field_widget_form().
*/
function youtube_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$value = isset($items[$delta]['input']) ? $items[$delta]['input'] : '';
$element['input'] = $element + array(
'#type' => 'textfield',
'#default_value' => $value,
'#size' => 60,
'#maxlength' => 1024,
'#element_validate' => array('youtube_input_validate'),
);
// Add our own description if one is not provided by the UI.
if ($element['#description'] == '') {
$element['input']['#description'] = t('Enter the YouTube URL. Valid URL
formats include: http://www.youtube.com/watch?v=1SqBdS0XkV4 and
http://youtu.be/1SqBdS0XkV4');
}
if (isset($items[$delta]['video_id'])) {
$element['video_id'] = array(
'#prefix' => '',
'#markup' => t('YouTube video ID: !video_id', array('!video_id' => $items[$delta]['video_id'])),
'#suffix' => '
',
'#weight' => 1,
);
}
return $element;
}
/**
* Validation for the youtube field itself.
*/
function youtube_input_validate($element, &$form_state, $form) {
$input = $element['#value'];
$video_id = youtube_get_video_id($input);
if ($video_id) {
$video_id_element = array(
'#parents' => $element['#parents'],
);
array_pop($video_id_element['#parents']);
$video_id_element['#parents'][] = 'video_id';
form_set_value($video_id_element, $video_id, $form_state);
}
}
/**
* Implements hook_field_widget_error().
*/
function youtube_field_widget_error($element, $error, $form, &$form_state) {
switch ($error['error']) {
case 'youtube_invalid':
form_error($element, $error['message']);
break;
}
}
/**
* Implements of hook_theme().
*/
function youtube_theme($existing, $type, $theme, $path) {
return array(
'youtube_thumbnail' => array(
'variables' => array(
'video_id' => NULL,
'entity_title' => NULL,
'image_style' => NULL,
'image_link' => NULL
),
'file' => 'youtube.theme.inc',
),
'youtube_video' => array(
'variables' => array(
'video_id' => NULL,
'entity_title' => NULL,
'size' => NULL,
'width' => NULL,
'height' => NULL,
'autoplay' => FALSE,
'showinfo' => FALSE,
'controls' => FALSE,
'autohide' => FALSE,
'iv_load_policy' => FALSE,
),
'file' => 'youtube.theme.inc',
),
);
}