view dnd.module @ 4:c2eb995212bf

TONS of fixes in this commit.
author David Eads <eads@chicagotech.org>
date Thu, 19 Feb 2009 12:33:19 -0600
parents 5df0783706f7
children ea5d7834d0dc
line wrap: on
line source
<?php

// A suffix for auto generated IDs
define(DND_ID_SUFFIX, '-dnd-library');

/**
 * Implementation of hook_menu().
 */
function dnd_menu() {
  $items = array();
  $items['admin/settings/dnd'] = array(
    'title' => 'Drag and Drop Library',
    'page callback' => 'dnd_admin',
    'description' => 'Configure drag-and-drop enabled textareas.',
    'access arguments' => array('administer dnd'),
    'file' => 'dnd.admin.inc',
  );
  return $items;
}

/**
 * Implementation of hook_perm().
 */
function dnd_perm() {
  return array('administer dnd');
}

/**
 * Implementation of hook_theme().
 */
function dnd_theme() {
  return array(
    'dnd_library' => array('arguments' => array('element' => NULL, 'settings' => NULL), 'template' => 'dnd-library'),
  );
}


/**
 * Implementation of hook_elements().
 *
 * Overload textareas.
 */
function dnd_elements() {
  $type = array();
  $type['textarea'] = array(
    '#input' => TRUE, 
    '#cols' => 60, 
    '#rows' => 5, 
    '#resizable' => TRUE,
    '#dnd-enabled' => FALSE,
    '#dnd-settings' => NULL,
    '#process' => array('form_expand_ahah', 'dnd_process_textarea'),
  );
  return $type;
}

/**
 * Settings array:
 * What should it take, if anything?  Probably a source...
 * maybe editor specific configuration shit? 
 *
 * - source for library json/ajax shit
 * - target selector
 * - item selector
 *
 * perhaps like so:  
 *
 * global => 
 *   droppable targets
 *   library source for textarea
 * 
 * tinymce/othereditor =>
 *   target selector logic
 *   configuration options
 *   callback should be smart about attachment and detachment
 */
function dnd_process_textarea($element, $form_state) {
  if ($element['#dnd-enabled']) {

    drupal_add_js(drupal_get_path('module', 'dnd') .'/js/dnd.js', 'footer');
    drupal_add_js(drupal_get_path('module', 'dnd') .'/js/dnd-library.js', 'footer');

    $settings = array();

    // We take a string or an 
    if (is_string($element['#dnd-settings'])) {
      // @TODO load settings
    } 
    else if (is_object($element['#dnd-settings'])) {
      $settings = (array) $element['#dnd-settings'];
    }
    else if (is_array($element['#dnd-settings'])) {
      $settings = $element['#dnd-settings'];
    }

    // Set some important defaults
    $settings = array('library_id' => $element['#id'] . DND_ID_SUFFIX) + $settings;

    // Add enabled libraries to settings for tracking
    drupal_add_js(array(
      'dndEnabledLibraries' => array($element['#id'] => $settings),
    ), 'setting');

    $element['#prefix'] = theme('dnd_library', $element, $settings);
  }
  return $element;
}

function template_preprocess_dnd_library(&$variables) {
  global $base_url;
  list($element, $settings) = array($variables['element'], $variables['settings']);

  // Get library via a backdoor HTTP request.  This is plenty fast for this
  // application and keeps things nice and consistent.
  if (!($url = parse_url($settings['url']))) {
    return t('This library is not available');
  }

  // Handle both relative and absolute urls
  if (!isset($url['scheme'])) {
    $settings['url'] = $base_url .'/'. $settings['url'];
  }

  $request = drupal_http_request($settings['url']);

  // We must remove some Drupal escaping
  $json = json_decode(str_replace(array('\x3c', '\x3e', '\x26'), array("<", ">", "&"), $request->data), TRUE);

  // Generate an array of editor representations to add
  foreach ($json['editor_representations'] as $editor_id=>$editor_item) {
    $editor_representations[$editor_id] = filter_xss_admin($editor_item);
  }

  // Store editor representations in Drupal setting
  drupal_add_js(array('dndEditorRepresentations' => $editor_representations,), 'setting');

  $variables['library_id'] = $settings['library_id'];
  $variables['header']     = filter_xss_admin($json['header']);
  $variables['library']    = filter_xss_admin($json['library']);
  $variables['footer']     = filter_xss_admin($json['footer']);
}