From: slothman Date: Sat, 23 Feb 2008 22:43:09 +0000 (+0000) Subject: Added "sequence" type for admin plugins and template options X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=7a3eb76a8c8a89a53a7334e038ab324f8b6d2ac8;p=s9y.git Added "sequence" type for admin plugins and template options --- diff --git a/include/functions_plugins_admin.inc.php b/include/functions_plugins_admin.inc.php index c3ae1fb..ecc3c2a 100644 --- a/include/functions_plugins_admin.inc.php +++ b/include/functions_plugins_admin.inc.php @@ -640,6 +640,207 @@ EOS; EOS; break; + case 'sequence': + // For the drag-n-drop to work, the list must be included in + // a container (probably an
    ) that JavaScript can access + // (easiest by ID), with
  1. children that have unique IDs, + // and handles with ids of 'g'.$li_id. + // I can't get it to work unless there's a class of + // pluginmanager_container on the ol, either. + // The drag-n-drop returns the list of IDs in order. + $sequencejs_output = $serendipity['sequencejs_output']; + if (!$sequencejs_output) { + echo ''; + $serendipity['sequencejs_output'] = true; + } + + // I want this generic sequence widget to hide the ID, but + // display a name or description with an optional picture. + // (This would allow users to identify choices by thumbnail.) + // Therefore, I need an array with keys 'id', 'display', and + // 'imgurl' (or similar) to generate each list item. + + // Get the data we need to display the list + if (!$value) { + $value = $eventData['default']; + } + $cname = $cbag->get('name'); + $cdesc = $cbag->get('description'); + /** Unordered array of values */ + $items = $cbag->get('values'); + if (!is_array($items)) { $items = null; } + /** Array specifying order to use values in $items */ + $order = null; + if ($value) { + $order = explode(',', $value); + } + $uparrow_img = serendipity_getTemplateFile('admin/img/uparrow.png'); + $downarrow_img = serendipity_getTemplateFile('admin/img/downarrow.png'); + + // $items is the list of things to sequence. It's not in + // order, and reordering PHP arrays is problematic. So + // we keep it unordered, and access its values according + // to another array (appropriately named $order). + if (is_array($items)) { + // Allow simple value for any sequence item + foreach ($items as $key => $item) { + if (!is_array($item)) { + // Replace this item with an empty array + unset($items[$key]); + $items[$item] = array(); + } + } + + // Make sure all the items are in the order list; new items + // go on the end (new items could have been added without + // this config item being updated) + // Also fill out thumbnails and display names + foreach ($items as $id => $junk) { + if ($order == null) { + $order = array($id); + } else if (!in_array($id, $order)) { + $order[] = $id; + } + // If there's no defined display name, default to the ID + if (!isset($items[$id]['display'])) { + $items[$id]['display'] = $id; + } + // If there's no image, we just won't display anything. + } + + // Make sure all the items to be ordered exist! Otherwise + // we could try to sequence nothing. + $filtered = array(); + foreach ($order as $id) { + if (array_key_exists($id, $items)) { + $filtered[] = $id; + } + } + $order = $filtered; + } else { + // If there's nothing to sequence, make the order in + // which to use them valid, but empty + $order = array(); + } + + // Start the row, add one cell for the name and description + print << + + $cname +
    $cdesc + + +EOS; + // Now add one cell for the list + print << + +EOS; + // Print the list + print << + +
      + +EOS; + $sort_idx == 0; + $last = count($order) - 1; + foreach ($order as $id) { + // Create the variables required to print this item + if ($sort_idx > 0) { + $swapping = $order; + $temp = $swapping[(int)$sort_idx]; + $swapping[(int)$sort_idx] = $swapping[(int)($sort_idx - 1)]; + $swapping[(int)($sort_idx - 1)] = $temp; + $oneup = implode(',' , $swapping); + } + if ($sort_idx < $last) { + $swapping = $order; + $temp = $swapping[(int)$sort_idx]; + $swapping[(int)$sort_idx] = $swapping[(int)($sort_idx + 1)]; + $swapping[(int)($sort_idx + 1)] = $temp; + $onedown = implode(',' , $swapping); + } + + + // Print the HTML + // + // Set the item and its ID + print '
    1. ' . "\n"; + // Make a handle with ID 'g$id' + print '
      ' . "\n"; + // Add the item contents + print ' '.$items[$id]['display'].'' . "\n"; + if (isset($items[$id]['img'])) { + print ' ' . "\n"; + } + // Luddite submit buttons (please, think of the scriptless!) + print "\n"; + // Close the item + print '
    2. '."\n"; + // Next, please + $sort_idx++; + } + if (!is_array($items) or empty($order)) { + // Print the empty message + print(NONE); + } + // Print the Javascript to drag-n-drop the list + print << + function init_${config_item}_Sequence() + { + var lst = document.getElementById("${config_item}"); + DragDrop.makeListContainer(lst, '${config_item}_group'); + lst.onDragOut = function() { + //var seq = DragDrop.serData('${config_item}_group', null); + var seq = DragDrop.serData(null, '${config_item}'); + var start = seq.indexOf("("); + var end = seq.indexOf(")"); + seq = seq.slice((start + 1), end); + var order = document.getElementById("${config_item}_value"); + order.value = seq; + }; + } + addLoadEvent(init_${config_item}_Sequence); + + +EOS; + // Finish the row + print << + +EOS; + break; + + default: // Unknown configuration key. Let the plugin handle it. $addData = func_get_args();