comparison dnd.module @ 2:5a44c430b7ac

Added dnd_test module, tons and tons of fixes and changes.
author David Eads <eads@chicagotech.org>
date Tue, 17 Feb 2009 15:34:56 -0600
parents cee053085755
children 5df0783706f7
comparison
equal deleted inserted replaced
1:cee053085755 2:5a44c430b7ac
1 <?php 1 <?php
2
3 // A suffix for auto generated IDs
4 define(DND_ID_SUFFIX, '-dnd-library');
2 5
3 /** 6 /**
4 * Implementation of hook_menu(). 7 * Implementation of hook_menu().
5 */ 8 */
6 function dnd_menu() { 9 function dnd_menu() {
19 * Implementation of hook_perm(). 22 * Implementation of hook_perm().
20 */ 23 */
21 function dnd_perm() { 24 function dnd_perm() {
22 return array('administer dnd'); 25 return array('administer dnd');
23 } 26 }
27
28 /**
29 * Implementation of hook_theme().
30 */
31 function dnd_theme() {
32 return array(
33 'dnd_library' => array('arguments' => array('element' => NULL, 'settings' => NULL), 'template' => 'dnd-library'),
34 );
35 }
36
37
38 /**
39 * Implementation of hook_elements().
40 *
41 * Overload textareas.
42 */
43 function dnd_elements() {
44 $type = array();
45 $type['textarea'] = array(
46 '#input' => TRUE,
47 '#cols' => 60,
48 '#rows' => 5,
49 '#resizable' => TRUE,
50 '#dnd-enabled' => FALSE,
51 '#dnd-settings' => NULL,
52 '#process' => array('form_expand_ahah', 'dnd_process_textarea'),
53 );
54 return $type;
55 }
56
57 /**
58 * Settings array:
59 * What should it take, if anything? Probably a source...
60 * maybe editor specific configuration shit?
61 *
62 * - source for library json/ajax shit
63 * - target selector
64 * - item selector
65 *
66 * perhaps like so:
67 *
68 * global =>
69 * droppable targets
70 * library source for textarea
71 *
72 * tinymce/othereditor =>
73 * target selector logic
74 * configuration options
75 * callback should be smart about attachment and detachment
76 */
77 function dnd_process_textarea($element, $form_state) {
78 if ($element['#dnd-enabled']) {
79
80 drupal_add_js(drupal_get_path('module', 'dnd') .'/dnd/dnd.js');
81 drupal_add_js(drupal_get_path('module', 'dnd') .'/js/dnd-library.js', 'footer');
82
83 $settings = array();
84
85 // We take a string or an
86 if (is_string($element['#dnd-settings'])) {
87 // @TODO load settings
88 }
89 else if (is_object($element['#dnd-settings'])) {
90 $settings = (array) $element['#dnd-settings'];
91 }
92 else if (is_array($element['#dnd-settings'])) {
93 $settings = $element['#dnd-settings'];
94 }
95
96 // Set some important defaults
97 $settings = array('library_id' => $element['#id'] . DND_ID_SUFFIX) + $settings;
98
99 // Add enabled libraries to settings for tracking
100 drupal_add_js(array(
101 'dndEnabledLibraries' => array($element['#id'] => $settings),
102 ), 'setting');
103
104 $element['#prefix'] = theme('dnd_library', $element, $settings);
105 }
106 return $element;
107 }
108
109 function template_preprocess_dnd_library(&$variables) {
110 global $base_url;
111 list($element, $settings) = array($variables['element'], $variables['settings']);
112
113 // Get library via a backdoor HTTP request. This is plenty fast for this
114 // application and keeps things nice and consistent.
115 if (!($url = parse_url($settings['url']))) {
116 return t('This library is not available');
117 }
118
119 // Handle both relative and absolute urls
120 if (!isset($url['scheme'])) {
121 $settings['url'] = $base_url .'/'. $settings['url'];
122 }
123
124 $request = drupal_http_request($settings['url']);
125
126 // We must remove some Drupal escaping
127 $json = json_decode(str_replace(array('\x3c', '\x3e', '\x26'), array("<", ">", "&"), $request->data), TRUE);
128
129 foreach ($json['library'] as $id=>$item) {
130 $editor_representations[$id] = filter_xss_admin($item['editor']);
131 $library_representations[$id] = filter_xss_admin($item['library']);
132 }
133
134 $variables['library_id'] = $settings['library_id'];
135 $variables['header'] = filter_xss_admin($json['header']);
136 $variables['items'] = $library_representations;
137 $variables['footer'] = filter_xss_admin($json['footer']);
138
139 // Store editor representations in Drupal setting
140 drupal_add_js(array(
141 'dndEditorRepresentations' => $editor_representations,
142 ), 'setting');
143 }