? patch.txt Index: includes/tables.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/tablemanager/includes/tables.inc,v retrieving revision 1.1.2.4 diff -u -p -r1.1.2.4 tables.inc --- includes/tables.inc 10 Feb 2010 07:08:44 -0000 1.1.2.4 +++ includes/tables.inc 12 Feb 2010 22:08:02 -0000 @@ -301,7 +301,10 @@ function tablemanager_table_edit($form_s drupal_add_css(drupal_get_path('module', 'tablemanager') .'/misc/tablemanager_admin.css'); if (isset($form_state['storage']) && element_children($form_state['storage']['column'])) { foreach (element_children($form_state['storage']['column']) as $storage) { - $headers[] = $form_state['storage']['column'][$storage]; + if(array_key_exists("data",$form_state['storage']['column'][$storage])) // skip the "Add" row + { + $headers[] = $form_state['storage']['column'][$storage]; + } } } elseif (isset($form_state['storage'])) { @@ -311,11 +314,19 @@ function tablemanager_table_edit($form_s // this is the first time this form has been called so build it from scratch $table = db_fetch_object(db_query('SELECT * FROM {tablemanager} WHERE tid = %d', $tid)); $headers = unserialize($table->header); + foreach ($headers as $key => $data) + { + $headers[$key]['originalorder']=$key; + } } $form['tid'] = array( '#type' => 'hidden', '#value' => $tid, ); + $form['orderchanged'] = array( + '#type' => 'hidden', + '#value' => isset($header['orderchanged']) ? $header['orderchanged'] : FALSE, + ); $form['name'] = array( '#type' => 'textfield', '#title' => t('Table Name'), @@ -334,22 +345,29 @@ function tablemanager_table_edit($form_s ); // set some variables for building the rows $form['column']['#tree'] = TRUE; - unset($sort); + $lastposition=0; + $sort=-1; $direction = 'asc'; // set 'asc' for default direction for sorting + $maxweight = max(2 * count($headers), 10); // more room for sorting if we have lots of columns // build rows foreach ($headers as $position => $header) { if (preg_match("/^(asc|desc)/i", $header['sort'], $match)) { $sort = $position; // there's a match for default sort column, so set $sort to show which column it's on $direction = $match[0]; // direction is set so change the default to reflect this } - $form['column'][$position]['weight'] = array('#type' => 'weight', '#value' => $position); + if (array_key_exists('originalorder',$header)) { + $form['column'][$position]['originalorder'] = array('#type' => 'hidden', '#value' => $header['originalorder']); + } + $form['column'][$position]['weight'] = array('#type' => 'weight', '#delta' => $maxweight, '#default_value' => isset($header['weight']) ? $header['weight'] : $position); $form['column'][$position]['data'] = array('#type' => 'textfield', '#default_value' => $header['data'], '#size' => 60, '#maxlength' => 255); - $form['column'][$position]['type'] = array('#type' => 'select', '#options' => tablemanager_fetch_types(FALSE), '#default_value' => $header['type'], '#attributes' => array('DISABLED' => 'TRUE')); + $form['column'][$position]['type'] = array('#type' => 'select', '#options' => tablemanager_fetch_types(FALSE), '#default_value' => $header['type']); $form['column'][$position]['required'] = array('#type' => 'checkbox', '#return_value' => TRUE, '#default_value' => isset($header['required']) ? $header['required'] : FALSE); $form['column'][$position]['field'] = array('#type' => 'checkbox', '#return_value' => TRUE, '#default_value' => isset($header['field']) ? $header['field'] : FALSE); - $form[$position]['default'] = array('#type' => 'radio', '#return_value' => $position, '#value' => $position === $sort ? "$position" : FALSE); + $form[$position]['default'] = array('#type' => 'radio', '#return_value' => $position, '#value' => ($position == $sort) ? "$position" : ""); $form['column'][$position]['delete'] = array('#type' => 'submit', '#name' => "delete_$position", '#value' => t('Delete')); + $lastposition = $position + 1; } + $form['column'][$lastposition]['delete'] = array('#type' => 'submit', '#name' => "add_$lastposition", '#value' => t('Add')); $form['order'] = array( '#type' => 'select', '#title' => t('Which order to sort for default?'), @@ -357,11 +375,11 @@ function tablemanager_table_edit($form_s '#description' => t('In which order the default column to be sorted will be in.'), '#default_value' => $direction, ); - $form['default'] = array( + $form[$lastposition]['default'] = array( '#type' => 'radio', - '#title' => t('No default column for sorting'), - '#return_value' => "NULL", - '#value' => is_null($sort) ? TRUE : FALSE, // sort wasn't set so reflect that here + '#title' => t('No sorting'), + '#return_value' => -1, + '#value' => ($sort==-1) ? -1 : "", // sort wasn't set so reflect that here ); $form['#attributes'] = array('class' => 'confirmation'); $form['description'] = array('#value' => t('Changes are not permanent until after you click save.')); @@ -373,34 +391,74 @@ function tablemanager_table_edit($form_s return $form; } // tablemanager_table_edit +function tablemanager_table_edit_submit_usort($a, $b) +{ + if ($a['weight'] == $b['weight']) { + return 0; + } + return ($a['weight'] < $b['weight']) ? -1 : 1; +} // tablemanager_table_edit_submit_usort + function tablemanager_table_edit_submit($form, &$form_state) { $form_state['storage'] = $form_state['values']; - // organise default sort radio button -// if ($form_state['clicked_button']['#post']['default'] >= 0) { -// print_r($form_state['clicked_button']['#post']); -// } if (preg_match("/^delete_(\d+)$/i", $form_state['clicked_button']['#name'], $match)) { unset($form_state['storage']['column'][$match[1]]); + $form_state['orderchanged']=true; // check to see if all columns are to be deleted if (count(element_children($form_state['storage']['column'])) == 0) { // redirect to table delete drupal_goto('admin/content/tablemanager/table_delete/table-'. $form_state['values']['tid']); } } + if (preg_match("/^add_(\d+)$/i", $form_state['clicked_button']['#name'], $match)) { + $form_state['storage']['column'][$match[1]]['data']=""; + $form_state['orderchanged']=true; + } if ($form_state['clicked_button']['#name'] == 'op') { $post = $form_state['clicked_button']['#post']; + $tid = $post['tid']; $name = $post['name']; $desc = $post['desc']; $header = $post['column']; foreach ($header as $key => $data) { - if ($header[$key]['field']) { - $header[$key]['field'] = $key + 1; - } if ($post['default'] == $key) { $header[$key]['sort'] = $post['order']; } } - $tid = $post['tid']; + usort($header,"tablemanager_table_edit_submit_usort"); + $orderchanged=$form_state['orderchanged']; + if (! $orderchanged) { + foreach ($header as $key => $data) + { + if ($header[$key]['originalorder'] != $key) { + $orderchanged=true; + } + } + } + if ($orderchanged) { // fix tabledata to new order and add or delete the new or removed columns + $results = db_query("SELECT * FROM {tablemanager_data} WHERE `tid` = %d",$tid); + while ($object = db_fetch_object($results)) { + $oldrowdata=unserialize($object->data); + $newrowdata=array(); + foreach($header as $key => $data) + { + if (array_key_exists('originalorder',$data)) { + $newrowdata[]=$oldrowdata[$data['originalorder']]; + } else { + $newrowdata[]=""; + } + } + db_query("UPDATE {tablemanager_data} SET data='%s' WHERE id = %d AND tid = %d", serialize($newrowdata), $object->id,$tid); + } + } + foreach($header as $key => $data) + { + if ($header[$key]['field']) { + $header[$key]['field'] = $key + 1; + } + unset($header[$key]['weight']); + unset($header[$key]['originalorder']); + } db_query("UPDATE {tablemanager} SET name='%s', description='%s', header='%s' WHERE tid = %d", $name, $desc, serialize($header), $tid); // redirect to table edit to show updates drupal_goto('admin/content/tablemanager/table_edit/table-'. $form_state['values']['tid']); @@ -413,7 +471,6 @@ function theme_tablemanager_table_edit($ $output = drupal_render($form['name']); $output .= drupal_render($form['desc']); $output .= drupal_render($form['order']); - $output .= drupal_render($form['default']); foreach (element_children($form['column']) as $position) { unset($cols); $form['column'][$position]['weight']['#attributes']['class'] = 'header-weight'; @@ -431,3 +488,4 @@ function theme_tablemanager_table_edit($ $output .= drupal_render($form); return $output; } // theme_tablemanager_table_edit +