. Implement save, insert and delete for records
authorJoey Schulze <joey@infodrom.org>
Thu, 25 Feb 2010 20:15:01 +0000 (21:15 +0100)
committerJoey Schulze <joey@infodrom.org>
Thu, 25 Feb 2010 20:15:01 +0000 (21:15 +0100)
 . Update grid after operation
 . Make copy-on-deletion optional

ajax/ajax.php
config.php.template
lib/functions.js
lib/mask.php

index 57f35a3..9b8a008 100644 (file)
@@ -46,6 +46,111 @@ function details($mask)
   return $row;
 }
 
   return $row;
 }
 
+function save($mask)
+{
+  if (empty($_POST['id']))
+    return array('error' => 'Missing ID');
+
+  $update = array(sprintf("sys_user = '%s'", pg_escape_string($_SESSION['sys']['login'])),
+                 "sys_edit = now()");
+
+  foreach ($mask['edit'] as $field => $info)
+    if ($info['type'] == 'boolean') {
+      $update[] = sprintf("%s=%d", $field, $_POST[$field] == 'on'?1:0);
+    } elseif ($info['type'] == 'number') {
+      $update[] = sprintf("%s=%d", $field, $_POST[$field]);
+    } else {
+      $update[] = sprintf("%s='%s'", $field, pg_escape_string($_POST[$field]));
+    }
+
+  $sql = 'UPDATE ' . $mask['table'] . ' SET ';
+  $sql .= implode(', ', $update);
+  $sql .= ' WHERE id = ' . intval($_POST['id']);
+
+  $sth = pg_query($sql);
+
+  if ($sth === false) {
+    error_log($sql . ': ' . pg_last_error());
+    return array('error' => pg_last_error(),
+                 'sql' => $sql);
+  }
+
+  return array('status' => true);
+}
+
+function insert($mask)
+{
+  $fields = array('sys_user','sys_edit');
+  $values = array("'".pg_escape_string($_SESSION['sys']['login'])."'", 'now()');
+
+  foreach ($mask['edit'] as $field => $info)
+    if ($info['type'] == 'boolean') {
+      $fields[] = $field;
+      $values[] = $_POST[$field] == 'on'?1:0;
+    } elseif ($info['type'] == 'number') {
+      $fields[] = $field;
+      $values[] = intval($_POST[$field]);
+    } else {
+      $fields[] = $field;
+      $values[] = sprintf("'%s'", pg_escape_string($_POST[$field]));
+    }
+
+  $sql = 'INSERT INTO ' . $mask['table'] . ' (' . implode(',', $fields) . ') ';
+  $sql .= 'VALUES (' . implode(',', $values) . ')';
+
+  $sth = pg_query($sql);
+
+  if ($sth === false) {
+    error_log($sql . ': ' . pg_last_error());
+    return array('error' => pg_last_error(),
+                 'sql' => $sql);
+  }
+
+  return array('status' => true);
+}
+
+function delete_or_copy($mask)
+{
+  if (empty($_POST['id']))
+    return array('error' => 'Missing ID');
+
+  if (DELETE_COPY === true) {
+    $sql = sprintf("INSERT INTO %s_deleted SELECT * FROM %s WHERE id = %d",
+                  $mask['table'], $mask['table'], $_POST['id']);
+
+    $sth = pg_query($sql);
+
+    if ($sth === false) {
+      error_log($sql . ': ' . pg_last_error());
+      return array('error' => pg_last_error(),
+                  'sql' => $sql);
+    }
+
+    $sql = sprintf("UPDATE %s_deleted SET sys_user='%s',sys_edit=now() WHERE id = %d",
+                  $mask['table'], $_SESSION['sys']['login'], $_POST['id']);
+
+    $sth = pg_query($sql);
+
+    if ($sth === false) {
+      error_log($sql . ': ' . pg_last_error());
+      return array('error' => pg_last_error(),
+                  'sql' => $sql);
+    }
+  }
+
+  $sql = sprintf("DELETE FROM %s WHERE id = %d", $mask['table'], $_POST['id']);
+
+  $sth = pg_query($sql);
+
+  if ($sth === false) {
+    error_log($sql . ': ' . pg_last_error());
+    return array('error' => pg_last_error(),
+                 'sql' => $sql);
+  }
+
+  return array('status' => true);
+}
+
 function format_ajax($data)
 {
   header('Content-type: application/json; charset=UTF-8');
 function format_ajax($data)
 {
   header('Content-type: application/json; charset=UTF-8');
@@ -69,7 +174,11 @@ if ($_POST['func'] == 'fetch') {
 } elseif ($_POST['func'] == 'details') {
   $data = details($mask);
 } elseif ($_POST['func'] == 'save') {
 } elseif ($_POST['func'] == 'details') {
   $data = details($mask);
 } elseif ($_POST['func'] == 'save') {
-  error_log('save');
+  $data = save($mask);
+} elseif ($_POST['func'] == 'insert') {
+  $data = insert($mask);
+} elseif ($_POST['func'] == 'delete') {
+  $data = delete_or_copy($mask);
 }
 
 format_ajax($data);
 }
 
 format_ajax($data);
index 8c90b4f..3d6f45d 100644 (file)
@@ -5,6 +5,8 @@ define('DBNAME', 'infodrom');
 define('DBUSER', 'username');
 define('DBPASS', 'password');
 
 define('DBUSER', 'username');
 define('DBPASS', 'password');
 
+define('DELETE_COPY', true);
+
 define('DEBUG', false);
 
 ?>
 define('DEBUG', false);
 
 ?>
index 64bc2db..5a6d42f 100644 (file)
@@ -72,8 +72,39 @@ function set_value(id, value)
 /*
  * Form functions
  */
 /*
  * Form functions
  */
+function save_callback(data)
+{
+    info('Datensatz gespeichert');
+    grid_update(grid);
+}
+
+function delete_callback(data)
+{
+    info('Datensatz gelöscht');
+    grid_update(grid);
+}
+
 function form_save(obj)
 {
 function form_save(obj)
 {
+    info('');
+    ajax_request('save', Form.serialize(obj.form), save_callback);
+    return false;
+}
+
+function form_insert(obj)
+{
+    info('');
+    ajax_request('insert', Form.serialize(obj.form), save_callback);
+    return false;
+}
+
+function form_delete(obj)
+{
+    var id = document.getElementById('edit_id');
+    var source = document.getElementById('edit_source');
+    info('');
+    var params = 'id='+id.value + '&source='+source.value;
+    ajax_request('delete', params, delete_callback);
     return false;
 }
 
     return false;
 }
 
@@ -116,3 +147,28 @@ function gridDrillDown(e)
        ajax_request('fetch', params, fetch_callback);
     }
 }
        ajax_request('fetch', params, fetch_callback);
     }
 }
+
+/* Update an existing grid
+ *
+ * grid is a live grid
+ * filter is the array index of the $table_filters array in mskdef
+ * value is the value applied to the filter
+ */
+function grid_update(grid, filter, value)
+{
+    if (grid === undefined)
+       return;
+
+    if (filter !== undefined && filter !== false)
+               grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
+    grid.buffer.clear();
+    grid.buffer.setTotalRows(0);
+    grid.buffer.foundRowCount = false;
+    grid.cancelMenu();
+    grid.ClearSelection();
+    grid.setImages();
+    if (grid.bookmark) grid.bookmark.innerHTML="&nbsp;";
+    grid.clearRows();
+    grid.buffer.fetch(-1);
+}
+
index e85e313..8d90654 100644 (file)
@@ -44,7 +44,13 @@ function build_form($name, $fields)
     }
   }
 
     }
   }
 
-  $ret[] = '<div align="center"><button onclick="return form_save(this);">Speichern</button></div>';
+  $ret[] = '<div class="buttons">';
+  $ret[] = '<button id="button_save" onclick="return form_save(this);">Speichern</button>';
+  $ret[] = '<span></span>';
+  $ret[] = '<button id="button_insert" onclick="return form_insert(this);">Hinzufügen</button>';
+  $ret[] = '<span></span>';
+  $ret[] = '<button id="button_delete" onclick="return form_delete(this);">Löschen</button>';
+  $ret[] = '</div>';
 
   $ret[] = '</form>';
   $ret[] = '</div>';
 
   $ret[] = '</form>';
   $ret[] = '</div>';