diff options
Diffstat (limited to 'types/videoftp/videoftp.module')
-rw-r--r-- | types/videoftp/videoftp.module | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/types/videoftp/videoftp.module b/types/videoftp/videoftp.module new file mode 100644 index 0000000..078d81c --- /dev/null +++ b/types/videoftp/videoftp.module @@ -0,0 +1,207 @@ +<?php +// $Id$ + +/** + * @file + * video ftp core hooks and menu callbacks. + */ + +module_load_include('inc', 'videoftp', 'videoftp_widget'); + +/* + * Implementation of hook_menu(). + */ +function videoftp_menu() { + $items = array(); + $items['videoftp/ahah/%/%/%'] = array( + 'page callback' => 'videoftp_js', + 'page arguments' => array(2, 3, 4), + //'access callback' => 'videoftp_edit_access', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['videoftp/progress'] = array( + 'page callback' => 'videoftp_progress', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + return $items; +} + +/** + * Implementation of hook_theme(). + */ +function videoftp_theme() { + $theme = array(); + $theme['videoftp_widget'] = array( + 'arguments' => array('element' => NULL), + 'file' => 'videoftp.theme.inc', + ); + $theme['videoftp_widget_item'] = array( + 'arguments' => array('element' => NULL), + 'file' => 'videoftp.theme.inc', + ); + $theme['videoftp_widget_file'] = array( + 'arguments' => array('element' => NULL), + 'file' => 'videoftp.theme.inc', + ); + return $theme; +} + +/** + * Implementation of CCK's hook_widget_info(). + */ +function videoftp_widget_info() { + return array( + 'videoftp_widget' => array( + 'label' => t('Video FTP'), + 'field types' => array('filefield'), + 'multiple values' => CONTENT_HANDLE_CORE, + 'callbacks' => array('default value' => CONTENT_CALLBACK_CUSTOM), + 'description' => t('Widget allows you to select video files uploaded through FTP to be attached to the node.'), + ), + ); +} + +/** + * Implementation of hook_elements(). + */ +function videoftp_elements() { + return array( + 'videoftp_widget' => array( + '#input' => TRUE, + '#columns' => array('fid', 'list', 'data', 'filepath'), + '#process' => array('videoftp_widget_process'), + '#value_callback' => 'videoftp_widget_value', + ), + ); +} + +/** + * Implementation of CCK's hook_widget_settings(). + */ +function videoftp_widget_settings($op, $widget) { + //load up our include file for the widget + module_load_include('inc', 'videoftp', 'videoftp_widget'); + switch ($op) { + case 'form': + return videoftp_widget_settings_form($widget); + case 'validate': + return videoftp_widget_settings_validate($widget); + case 'save': + return videoftp_widget_settings_save($widget); + } +} + +/** + * Implementation of hook_widget(). + */ +function videoftp_widget(&$form, &$form_state, $field, $items, $delta = NULL) { + $item = array('fid' => 0, 'list' => $field['list_default'], 'data' => array('description' => '', 'video_thumb' => '')); + if (isset($items[$delta])) { + $item = array_merge($item, $items[$delta]); + } + $element = array( + '#title' => $field['widget']['label'], + '#type' => $field['widget']['type'], + '#default_value' => $item, + ); + return $element; +} + +/** + * Menu callback; Shared AHAH callback for ftp file attachment and deletions. + * + * This rebuilds the form element for a particular field item. As long as the + * form processing is properly encapsulated in the widget element the form + * should rebuild correctly using FAPI without the need for additional callbacks + * or processing. + */ +function videoftp_js($type_name, $field_name, $delta) { + module_load_include('inc', 'videoftp', 'videoftp_widget'); + $field = content_fields($field_name, $type_name); + + if (empty($field) || empty($_POST['form_build_id'])) { + // Invalid request. + drupal_set_message(t('An unrecoverable error occurred.'), 'error'); + print drupal_to_js(array('data' => theme('status_messages'))); + exit; + } + + // Build the new form. + $form_state = array('submitted' => FALSE); + $form_build_id = $_POST['form_build_id']; + $form = form_get_cache($form_build_id, $form_state); + + if (!$form) { + // Invalid form_build_id. + drupal_set_message(t('An unrecoverable error occurred. This form was missing from the server cache. Try reloading the page and submitting again.'), 'error'); + print drupal_to_js(array('data' => theme('status_messages'))); + exit; + } + + // Build the form. This calls the file field's #value_callback function and + // saves the uploaded file. Since this form is already marked as cached + // (the #cache property is TRUE), the cache is updated automatically and we + // don't need to call form_set_cache(). + $args = $form['#parameters']; + $form_id = array_shift($args); + $form['#post'] = $_POST; + $form = form_builder($form_id, $form, $form_state); + + // Update the cached form with the new element at the right place in the form. + if (module_exists('fieldgroup') && ($group_name = _fieldgroup_field_get_group($type_name, $field_name))) { + if (isset($form['#multigroups']) && isset($form['#multigroups'][$group_name][$field_name])) { + $form_element = $form[$group_name][$delta][$field_name]; + } + else { + $form_element = $form[$group_name][$field_name][$delta]; + } + } + else { + $form_element = $form[$field_name][$delta]; + } + + if (isset($form_element['_weight'])) { + unset($form_element['_weight']); + } + $output = drupal_render($form_element); + // AHAH is not being nice to us and doesn't know the "other" button (that is, + // either "Attach" or "Delete") yet. Which in turn causes it not to attach + // AHAH behaviours after replacing the element. So we need to tell it first. + + // Loop through the JS settings and find the settings needed for our buttons. + $javascript = drupal_add_js(NULL, NULL); + $videoftp_ahah_settings = array(); + if (isset($javascript['setting'])) { + foreach ($javascript['setting'] as $settings) { + if (isset($settings['ahah'])) { + foreach ($settings['ahah'] as $id => $ahah_settings) { + if (strpos($id, 'videoftp-attach') || strpos($id, 'videoftp-remove')) { + $videoftp_ahah_settings[$id] = $ahah_settings; + } + } + } + } + } + + // Add the AHAH settings needed for our new buttons. + if (!empty($videoftp_ahah_settings)) { + $output .= '<script type="text/javascript">jQuery.extend(Drupal.settings.ahah, '. drupal_to_js($videoftp_ahah_settings) .');</script>'; + } + + $output = theme('status_messages') . $output; + + // For some reason, file uploads don't like drupal_json() with its manual + // setting of the text/javascript HTTP header. So use this one instead. + $GLOBALS['devel_shutdown'] = FALSE; + print drupal_to_js(array('status' => TRUE, 'data' => $output)); + exit; +} + +/** + * filefield source support + */ +function videoftp_filefield_sources_widgets() { + return array('videoftp_widget'); +}
\ No newline at end of file |