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');
}