Drag n Drop Single Level Menu Sorter , pilot code ready

dhruvahuja - April 15, 2008 - 23:36

Hi Guys

Is anybody interested in formalizing a Drag n Drop Menu Sorter for Drupal 5 ?

Check out my code. Its a hack of jQuery Interface Sortable Demo.

<?php

function tchmd_menu_sorter_menu($may_cache)
{
$items = array();

if ($may_cache)
{
$items[] = array(
'path' => 'admin/menusorter',
'title' => t('Menu Sorter'),
'callback' => 'drupal_get_form',
'callback arguments' => 'tchmd_menu_sorter',
);
}

return $items;
}

function tchmd_menu_sorter()
{
_interface_sortable_demos_css();

$menu_items = tchmd_menu_sorter_read_menu_db_table();

  $options = array(
      'fx' => 1100,
      'opacity' => 0.2,
      '#onchange' => <<<EOT
        function (obj) {
          serial = $.SortSerialize(obj[0].id);
          document.getElementById('edit-sorto').value = serial.hash;
         
        }
EOT
  );

  $form['sorto'] = array(
    '#type' => 'sortable',
    '#outer_tag' => 'ul',
    '#inner_tag' => 'li',
    '#options' => $options,
    '#items' => $menu_items,
    '#description' => t('Drag and drop the elements to set their order, if you please...'),
    '#title' => t('Sortable Form Element With Options'),
    '#default_value' => tchmd_menu_sorter_default_value_string(),
  );
 
  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
 
  return $form;
}

function tchmd_menu_sorter_submit($form_id, $edit)
{
$sorted = interface_get_sort($edit['sorto']);

tchmd_menu_new_order_commit_to_db($sorted);

drupal_set_message('Your changes have been saved.');
}

function tchmd_menu_sorter_default_value_string()
{
$b = tchmd_menu_sorter_read_menu_db_table();
$c = '';

$form_element_name = 'sorto';

$d = $form_element_name; unset($form_element_name);

$first_iteration = TRUE;
foreach ($b as $k => $v)
{
if(!($first_iteration))
{
$c .= '&';
}
$c .= $d.'[]='.$k;
$first_iteration = FALSE;
}

return $c;
}

function tchmd_menu_sorter_read_menu_db_table()
{
$sql = 'SELECT mid,title FROM menu WHERE pid=49 ORDER BY weight';
$result = db_query($sql);

$_menu_items = array();

while($data = db_fetch_object($result))
{
$_menu_items[$data->mid] = $data->title;
}

return $_menu_items;
}

function tchmd_menu_new_order_commit_to_db($new_order)
{
$minimum_weight = -50;

foreach ($new_order as $k => $v)
{
$f = $k + $minimum_weight;
$sql = 'UPDATE menu SET weight='.$f.' WHERE mid='.$v.' LIMIT 1';
db_query($sql);
}
// clear the menu cache
db_query('TRUNCATE TABLE cache_menu');
}

 
 

Drupal is a registered trademark of Dries Buytaert.