123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- <?php
- /**
- * @file
- * Implement a video field.
- */
- /**
- * Implements of hook_field_info().
- */
- function video_embed_field_field_info() {
- return array(
- 'video_embed_field' => array(
- 'label' => 'Video Embed',
- 'description' => 'Embed videos from youtube or vimeo',
- 'settings' => array(),
- 'instance_settings' => array(
- 'description_field' => 0,
- ),
- 'default_widget' => 'video_embed_field_video',
- 'default_formatter' => 'video_embed_field',
- )
- );
- }
- /**
- * Implements hook_field_instance_settings_form().
- */
- function video_embed_field_field_instance_settings_form($field, $instance) {
- $settings = $instance['settings'];
-
- $form['description_field'] = array(
- '#type' => 'checkbox',
- '#title' => t('Enable <em>Description</em> field'),
- '#default_value' => isset($settings['description_field']) ? $settings['description_field'] : '',
- '#description' => t('The description field allows users to enter a description about the video.'),
- '#parents' => array('instance', 'settings', 'description_field'),
- '#weight' => 11,
- );
-
- return $form;
- }
- /**
- * Implements hook_field_widget_info().
- */
- function video_embed_field_field_widget_info() {
- return array(
- 'video_embed_field_video' => array(
- 'label' => 'Video',
- 'description' => 'Provides a video embed field',
- 'field types' => array('video_embed_field'),
- 'settings' => array(),
- 'behaviors' => array(
- 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
- 'default value' => FIELD_BEHAVIOR_DEFAULT
- ),
- ),
- );
- }
- /**
- * Implements hook_field_widget_form().
- */
- function video_embed_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
- // Don't need to check the type right now because we're only defining one
- $element += array(
- '#type' => 'fieldset'
- );
-
- $element['video_url'] = array(
- '#type' => 'textfield',
- '#title' => t('Video URL'),
- '#attributes' => array('class' => array('video_embed_url')),
- '#attached' => array(
- 'css' => array(
- drupal_get_path('module', 'video_embed_field') .'/video_embed_field.form.css'
- )
- ),
- '#default_value' => isset($items[$delta]['video_url'])?$items[$delta]['video_url']:'',
- '#required' => $element['#required']
- );
-
- // Add the description field if enabled.
- if (!empty($instance['settings']['description_field'])) {
- $element['description'] = array(
- '#type' => 'textfield',
- '#title' => t('Description'),
- '#default_value' => isset($items[$delta]['description']) ? $items[$delta]['description'] : '',
- '#description' => t('The description which may be used as a label.'),
- );
- }
- return $element;
- }
- /**
- * Validates video URL.
- */
- function video_embed_field_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
- foreach ($items as $delta => $item) {
- if (!empty($item['video_url'])) {
- $item['video_url'] = trim($item['video_url']);
- if (stristr($item['video_url'], '.') && !stristr($item['video_url'], 'http://') && !stristr($item['video_url'], 'https://')) {
- $item['video_url'] = 'http://' . $item['video_url'];
- }
-
- $parts = parse_url($item['video_url']);
- if (!$parts || !isset($parts['host'])) {
- $errors[$field['field_name']][$langcode][$delta][] = array(
- 'error' => t('Invalid Url'),
- 'message' => t('Video: Invalid Video URL.', array('%name' => $instance['label'])),
- );
- }
- else {
- $host = $parts['host'];
- if (stripos($host, 'www.') > -1) {
- $host = substr($host, 4);
- }
- $domains = _video_embed_field_get_provider_domains();
- if (!array_key_exists($host, $domains)) {
- $errors[$field['field_name']][$langcode][$delta][] = array(
- 'error' => t('Unsupported Video Provider'),
- 'message' => t('%name: This video provider is not currently supported.', array('%name' => $instance['label'])),
- );
- }
- }
- }
- }
- }
- /**
- * Implementation of hook_field_prepare_view().
- *
- * Download and save the thumbnail if it hasn't already been stored.
- * Get video data.
- */
- function video_embed_field_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
- foreach($items as $delta => $item){
- // Try to load thumbnail URL
- $info = video_embed_field_thumbnail_url($item['video_url']);
- if (isset($info['url']) && $info['url']) {
- $thumb_url = $info['url'];
- $local_path = 'public://video_embed_field_thumbnails/' . $info['handler'] . '/' . $info['id'] . '.jpg';
- $dirname = drupal_dirname($local_path);
- file_prepare_directory($dirname, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
- $response = drupal_http_request($thumb_url);
- if (!isset($response->error)) {
- file_save_data($response->data, $local_path, TRUE);
- }
- else{
- @copy($thumb_url, $local_path);
- }
-
- $items[$delta]['thumbnail_path'] = $local_path;
- } //couldn't get the thumbnail for whatever reason
- else {
- $items[$delta]['thumbnail_path'] = '';
- }
- // Try to load video data
- $data = video_embed_field_get_video_data($item['video_url']);
- if (is_array($data) && !empty($data)) {
- $items[$delta]['video_data'] = serialize($data);
- }
- else {
- $items[$delta]['video_data'] = NULL;
- }
- }
- }
- /**
- * Implements of hook_field_is_empty().
- */
- function video_embed_field_field_is_empty($item, $field){
- return empty($item) || empty($item['video_url']) || $item['video_url'] === '';
- }
- /**
- * Implements hook_field_formatter_info().
- */
- function video_embed_field_field_formatter_info() {
- $info = array(
- 'video_embed_field' => array(
- 'label' => t('Video Player'),
- 'field types' => array('video_embed_field'),
- 'settings' => array('video_style' => 'normal', 'description' => 1),
- ),
- 'video_embed_field_thumbnail' => array(
- 'label' => t('Thumbnail Preview'),
- 'field types' => array('video_embed_field'),
- 'settings' => array(
- 'image_style' => 'none',
- 'description' => 1,
- 'image_link' => 'none',
- ),
- ),
- );
- if( module_exists('colorbox') ) {
- $info['video_embed_field_thumbnail_colorbox'] = array(
- 'label' => t('Thumbnail Preview w/Colorbox'),
- 'field types' => array('video_embed_field'),
- 'settings' => array('video_style' => 'normal', 'image_style' => 'none', 'description' => 1),
- );
- }
- return $info;
- }
- /**
- * Implements hook_field_formatter_settings_form().
- */
- function video_embed_field_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
- $display = $instance['display'][$view_mode];
- $settings = $display['settings'];
- $element = array();
-
- if ($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox') {
- $video_styles = video_embed_field_video_style_options(FALSE);
- $element['video_style'] = array(
- '#title' => t('Video style'),
- '#type' => 'select',
- '#default_value' => $settings['video_style'],
- '#options' => $video_styles,
- );
- }
- if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') {
- $element['image_style'] = array(
- '#title' => t('Image style'),
- '#type' => 'select',
- '#options' => image_style_options(FALSE),
- '#default_value' => $settings['image_style'],
- '#empty_option' => t('None (original image)'),
- );
- }
-
- if($display['type'] == 'video_embed_field_thumbnail'){
- $link_types = array(
- 'node' => t('Node'),
- 'source' => t('Video Source'),
- );
- $element['image_link'] = array(
- '#title' => t('Link thumbnail to'),
- '#type' => 'select',
- '#default_value' => $settings['image_link'],
- '#empty_option' => t('Nothing'),
- '#options' => $link_types,
- );
- }
-
- if ($instance['settings']['description_field']) {
- $element['description'] = array(
- '#title' => t('Show description'),
- '#type' => 'checkbox',
- '#default_value' => $settings['description'],
- );
- }
- return $element;
- }
- /**
- * Implements hook_field_formatter_settings_summary().
- */
- function video_embed_field_field_formatter_settings_summary($field, $instance, $view_mode) {
- $display = $instance['display'][$view_mode];
- $settings = $display['settings'];
- $summary = array();
- if($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox'){
- $video_styles = video_embed_field_video_style_options(FALSE);
- // Styles could be lost because of enabled/disabled modules that defines
- // their styles in code.
- if (isset($video_styles[$settings['video_style']])) {
- $summary[] = t('Video style: @style', array('@style' => $video_styles[$settings['video_style']]));
- }
- }
- if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') {
- $image_styles = image_style_options(FALSE);
- if (isset($image_styles[$settings['image_style']])) {
- $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
- } //No Image style (original image)
- else {
- $summary[] = t('Original Image.');
- }
- if(isset($settings['image_link'])){
- $summary[] = t('Image link: ' . $settings['image_link']);
- }
- else{
- $summary[] = t('Image link: none');
- }
- }
- if ($settings['description'] && $instance['settings']['description_field']) {
- $summary[] = t('Show description');
- }
- else if ($instance['settings']['description_field']) {
- $summary[] = t('Hide description');
- }
-
- return implode('<br />', $summary);
- }
- /**
- * Implements hook_field_formatter_view().
- */
- function video_embed_field_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display){
- $element = array();
-
- foreach ($items as $delta => $item) {
- //create the render array for the description
- if (isset($item['description']) && $item['description'] && $display['settings']['description'] && $instance['settings']['description_field']) {
- $description = array(
- '#prefix' => '<div class="video-embed-description">',
- '#markup' => $item['description'],
- '#suffix' => '</div>',
- );
- }
- else {
- $description = array();
- }
- //Render the field
- if ($display['type'] == 'video_embed_field') {
- $element[$delta] = array(
- array(
- '#theme' => 'video_embed_field_embed_code',
- '#url' => $item['video_url'],
- '#style' => $display['settings']['video_style'],
- '#video_data' => !empty($item['video_data']) ? unserialize($item['video_data']) : array(),
- ),
- );
- }
- else if ($display['type'] == 'video_embed_field_thumbnail') {
- if (isset($item['thumbnail_path'])) {
- if(empty($display['settings']['image_style']) || $display['settings']['image_style'] == 'none'){
- $element[$delta] = array(
- array(
- '#theme' => 'image',
- '#path' => $item['thumbnail_path'],
- ),
- );
- }
- else {
- $element[$delta] = array(
- array(
- '#theme' => 'image_style',
- '#path' => $item['thumbnail_path'],
- '#style_name' => $display['settings']['image_style'],
- ),
- );
- }
- if($display['settings']['image_link'] == 'source'){
- $link = explode('|||', l('|||', $item['video_url']));
- $element[$delta]['#prefix'] = $link[0];
- $element[$delta]['#suffix'] = $link[1];
- }
- else if($display['settings']['image_link'] == 'node'){
- $nid = $entity->nid;
- $link = explode('|||', l('|||', 'node/'. $nid));
- $element[$delta]['#prefix'] = $link[0];
- $element[$delta]['#suffix'] = $link[1];
- }
- } //incase no thumbnail was downloaded / provider doesn't support thumbnails
- else {
- $element[$delta] = array(
- );
- }
- }
- else if ($display['type'] == 'video_embed_field_thumbnail_colorbox') {
- if (isset($item['thumbnail_path'])) {
- $element[$delta] = array(
- array(
- '#theme' => 'video_embed_field_colorbox_code',
- '#image_url' => $item['thumbnail_path'],
- '#image_style' => $display['settings']['image_style'],
- '#video_url' => $item['video_url'],
- '#video_style' => $display['settings']['video_style'],
- '#video_data' => unserialize($item['video_data']),
- ),
- );
- }//incase no thumbnail was downloaded / provider doesn't support thumbnails
- else {
- $element[$delta] = array(
- );
- }
- }
- //Get the HTML instead of the array, because we append it to the suffix.
- //This way, the thumbnail link wrapper doesn't make the description a link as well.
- $description_html = drupal_render($description);
-
- //No need to check to add, as we set it to blank above if it's set to not display.
- //The if/else is so that it doesn't show an error in case there's no suffix.
- if(isset($element[$delta]['#suffix'])){
- $element[$delta]['#suffix'] .= $description_html;
- }
- else{
- $element[$delta]['#suffix'] = $description_html;
- }
- }
-
-
- return $element;
- }
|