diff -up ./interface_sortable_demos.css ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.css --- ./interface_sortable_demos.css 2007-05-09 23:43:34.000000000 +0200 +++ ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.css 2008-02-20 15:50:20.125463408 +0100 @@ -14,3 +14,14 @@ div.sortable-item { background: yellow; width: 300px !important; } +.sortable-item .form-item { + display: inline; +} + +.sortable-handle { + color: #a020f0; + font-size: 16px; + font-weight: bolder; + cursor: move; + margin-right: 5px; +} diff -up ./interface_sortable_demos.module ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.module --- ./interface_sortable_demos.module 2007-05-09 23:43:34.000000000 +0200 +++ ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.module 2008-02-27 19:50:18.406619500 +0100 @@ -26,6 +26,15 @@ function interface_sortable_demos_menu($ 'type' => MENU_NORMAL_ITEM ); $items[] = array( + 'path' => 'demos/interface/sortable_advanced', + 'title' => t('Interface Sortable Advanced Demo'), + 'description' => t('Demonstrates advanced usage of sortable form elements.'), + 'callback' => 'drupal_get_form', + 'callback arguments' => 'interface_sortable_demos_sortable_advanced', + 'access' => user_access('access content'), + 'type' => MENU_NORMAL_ITEM + ); + $items[] = array( 'path' => 'demos/interface/sortable_form_element_with_options', 'title' => t('Interface Sortable Form Element Demo With Options'), 'description' => t('Demonstrates a sortable form element with options.'), @@ -100,6 +109,89 @@ function interface_sortable_demos_sortab drupal_set_message('submitted: ['. implode(',', $sorted) .']'); } +function interface_sortable_demos_sortable_advanced() { + _interface_sortable_demos_css(); + $handle = '×'; + $items = array( + 18 => 'eighteen', + 17 => 'seventeen', + 16 => 'sixteen', + 'cat' => 'meow', + 15 => 'fifteen', + 14 => 'fourteen', + 13 => 'thirteen', + 12 => 'twelve', + 'custom' => array( + '#type' => 'markup', + '#value' => 'Enter a custom number:', + '#prefix' => $handle, + 'inputfield' => array( + '#type' => 'textfield', + '#size' => 4, + '#default_value' => 20, + ) + ) + ); + foreach ($items as $key => $value) { + if (is_array($value)) continue; + $items[$key] = array('#type' => 'markup', '#value' => $value, '#prefix' => $handle); + } + + $options = array(); + $options['accept'] = 'sortable-item'; + $options['helperclass'] = 'sortable-helper'; + $options['activeclass'] = 'sortable-active'; + $options['hoverclass'] = 'sortable-hover'; + $options['fx'] = 300; + $options['axis'] = 'vertically'; + $options['opacity'] = 0.6; + $options['handle'] = 'span.sortable-handle'; + $options['#onchange'] = << 'fieldset', + '#collapsible' => FALSE, + '#title' => t('Even numbers'), + '#description' => 'Drag the values using the ' . $handle + ); + $form['odd'] = array( + '#type' => 'fieldset', + '#collapsible' => FALSE, + '#title' => t('Odd numbers') + ); + $form['even']['sortee1'] = array( + '#type' => 'sortable', + '#items' => $items, + '#options' => $options, + '#inner_id' => 'sortee', + ); + $form['odd']['sortee2'] = array( + '#type' => 'sortable', + '#items' => array(), + '#options' => $options, + '#inner_id' => 'sortee', + ); + + $form['submit'] = array('#type' => 'submit', '#value' => t('Submit')); + + return $form; +} + +function interface_sortable_demos_sortable_advanced_submit($form_id, $edit) { + $sorted1 = interface_get_sort($edit['sortee1'], 'sortee'); + $sorted2 = interface_get_sort($edit['sortee2'], 'sortee'); + drupal_set_message('Even: ['. implode(',', $sorted1) .']'); + drupal_set_message('Odd: ['. implode(',', $sorted2) .']'); + drupal_set_message(t('Custom number: !value', array('!value' => $_POST['inputfield']))); +} + function interface_sortable_demos_sortable_form_element_with_options() { _interface_sortable_demos_css(); diff -up ./interface_sortable.module ../5.7/sites/all/modules/interface_sortable/interface_sortable.module --- ./interface_sortable.module 2007-05-09 23:43:34.000000000 +0200 +++ ../5.7/sites/all/modules/interface_sortable/interface_sortable.module 2008-02-27 15:53:12.595936692 +0100 @@ -64,13 +64,14 @@ function interface_sortable_process($ele } $outerid = $element['#parents'][0]; + $innerid = array_key_exists('#inner_id', $element) ? $element['#inner_id'] : $outerid; $sortables['#prefix'] = "<$outertag id='$outerid-wrapper' class='$outer_class'>\n"; $sortables['#suffix'] = "\n"; // if there's a #value, eval it and resort if ($element['#value']) { - $keyorder = interface_get_sort($element['#value']); + $keyorder = interface_get_sort($element['#value'], $innerid); $items = $element['#items']; foreach ($keyorder as $key) { $newitems[$key] = $items[$key]; @@ -80,13 +81,29 @@ function interface_sortable_process($ele } foreach ($element['#items'] as $k => $v) { - $sortables[$k] = array( + $prefix = "<$innertag id='{$innerid}_{$k}' class='$inner_class'>"; + $suffix = "\n"; + if (is_array($v)) { + $sortables[$k] = $v; + $sortables[$k]['#prefix'] = $prefix . (isset($v['#prefix']) ? $v['#prefix'] : ''); + $sortables[$k]['#suffix'] = (isset($v['#suffix']) ? $v['#suffix'] : '') . $suffix; + } + else { + $sortables[$k] = array( + '#type' => 'markup', + '#value' => $v, + '#prefix' => $prefix, + '#suffix' => $suffix + ); + } + $order[] = $k; + } + if (empty($element['#items'])) { + $order = array(); + $sortables = array( '#type' => 'markup', - '#value' => $v, - '#prefix' => "<$innertag id='{$outerid}_{$k}' class='$inner_class'>", - '#suffix' => "\n" + '#value' => $sortables['#prefix'] . $sortables['#suffix'] ); - $order[] = $k; } // If the user hasn't sent in an onchange handler, create a default @@ -111,6 +128,7 @@ EOT; '#theme' => 'interface_sortable_hidden', '#value' => $value ); + unset($element['#options']); return $element; } @@ -142,15 +160,16 @@ function theme_interface_sortable_hidden * @param string $sort * @return array */ -function interface_get_sort($sort) { +function interface_get_sort($sort, $subst = '') { $return = array(); parse_str($sort, $result); $prefixes = array_keys($result); if (!empty($prefixes)) { $prefix = $prefixes[0]; + if (empty($subst)) $subst = $prefix; foreach ($result[$prefix] as $val) { - if (strpos($val, $prefix .'_') === 0) { - $val = substr($val, strlen($prefix) + 1); + if (strpos($val, $subst .'_') === 0) { + $val = substr($val, strlen($subst) + 1); } $return[] = $val; }