X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=includes%2Fui%2Fsimple_crud_class.inc;h=f6375635ebaa6e3bcbac799342b099adbc50241b;hb=523b8c69689f9ceb978b422b3e65a7eb9c089b6f;hp=1720516b71df58f327eb678a4bb616a3a4693c26;hpb=d2a8ca44be9bac1e147ae2a9de0db693ce0fcb08;p=fa-stable.git diff --git a/includes/ui/simple_crud_class.inc b/includes/ui/simple_crud_class.inc index 1720516b..f6375635 100644 --- a/includes/ui/simple_crud_class.inc +++ b/includes/ui/simple_crud_class.inc @@ -15,101 +15,156 @@ class simple_crud { var $name; var $Mode; - var $selected_id = ''; - var $handlers; - var $selector; + var $selected_id; + var $_none = ''; // selector value when no item is selected + var $pre_handlers; // control buttons and related methods called before view display + var $views; + var $data = array(); + var $fields; + var $tool_buttons; + var $options; + var $dec; // // - function simple_crud($name, $options = array()) + function __construct($name, $fields = null) { $this->name = $name; - $this->handlers = array( + $this->pre_handlers = array( 'Edit' => '_edit', 'Delete' => '_delete', + 'NEW' => '_edit', 'ADD' => '_add', 'UPDATE' => '_update', 'RESET' => '_cancel', 'CLONE' => '_cloning' ); - // selector type: 'button' (default), or 'list' - $this->selector = @$options['selector']; // TODO - + $this->views = array( + '' => 'list_view', // default view + 'Edit' => 'editor_view', + 'Delete' => 'list_view', + 'NEW' => 'editor_view', + 'ADD' => 'editor_view', + 'UPDATE' => 'editor_view', + 'RESET' => 'list_view', + 'CLONE' => 'editor_view' + ); + $this->tool_buttons['Edit'] = + array(_('Edit'), _('Edit document line'), ICON_EDIT, ''); + $this->tool_buttons['Delete'] = + array(_('Delete'), _('Remove line from document'), ICON_DELETE, ''); + $this->tool_buttons['UPDATE'] = + array(_('Update'), _('Confirm changes'), ICON_UPDATE, ''); + $this->tool_buttons['RESET'] = + array(_('Cancel'), _('Cancel changes'), ICON_CANCEL, ''); + + $this->fields = $fields; + $this->selected_id = $this->_none; + } + /* + Input/output formatters - convert values between php/user domains. + */ + function _format_input($value, $fmt) + { + switch($fmt) { + case 'stock': + $this->dec = get_qty_dec($value); + return $value; + case 'price': + case 'qty': + case 'number': + return user_numeric($value); + case 'percent': + return user_numeric($value)/100; + case 'text': + case 'date': + default: + return $value; + } } - function _check_mode($numeric_id = true) + function _format_output($value, $fmt) + { + switch($fmt) { + case 'price': + return price_format($value); + case 'qty': + return number_format2($value, $this->dec); + case 'number': + return number_format2($value); + case 'percent': + return percent_format($value*100); + case 'stock': + $this->dec = get_qty_dec($value); // retrieve dec for use in later qty fields + case 'text': + case 'date': + default: + return $value; + } + } + + function _check_mode() { global $Ajax; - $sel_name = $this->name.'_id'; - - $this->Mode = 'Edit'; - foreach (array('Edit', 'Delete') as $m) { - foreach ($_POST as $p => $pvar) { - if (strpos($p, $this->name.$m) === 0) { - unset($_POST['_focus']); // focus on first form entry - $this->selected_id = quoted_printable_decode(substr($p, strlen($this->name.$m))); - $Ajax->activate($this->name.'_div'); -// $Ajax->activate('_page_body'); - $this->Mode = $m; - return; - } - } - } - $default = ''; //$numeric_id ? -1 : ''; - $this->selected_id = get_post($sel_name, $default); - if ($this->selected_id === $default) { -// $this->selected_id = @$_POST[$sel_name]; -// if (!isset($this->selected_id)) { - $this->Mode = ''; - return; - } - foreach (array('ADD', 'UPDATE', 'RESET', 'CLONE') as $m) { + // list controls lookup + foreach (array_keys($this->pre_handlers) as $m) { if (isset($_POST[$this->name.$m])) { + unset($_POST['_focus']); // focus on first form entry $Ajax->activate($this->name.'_div'); -// $Ajax->activate('_page_body'); -// if ($m == 'RESET' || $m == 'CLONE') -// $this->selected_id = $default; - unset($_POST['_focus']); - $this->Mode = $m; - return; + $val = is_array($_POST[$this->name.$m]) ? key($_POST[$this->name.$m]) : null; + $this->selected_id = $val!==null ? @quoted_printable_decode($val) : $this->_none; + return $m; } } + $mod = get_post($this->name.'Mode', ''); + if ($mod) { + $val = @key($mod); + $this->selected_id = $val!==null ? @quoted_printable_decode($val) : $this->_none; + return $mod[$val]; + } + return ''; } - + // // Set record for edition // - function _edit() + function _edit($mode) { - - if ($this->selected_id !== '0') { - $this->data = $this->db_read(); -/* foreach($this->data as $name => $value) { - if (!is_numeric($name)) { - $_POST[$name] = $value; - } + if ($this->Mode != $mode) { + if ($this->selected_id != $this->_none) { + $this->data = $this->db_read(); } -*/ } + $this->set_posts($this->data); + } + $this->Mode = $mode; } // // Update record after edition // - function _update() + function _update($mode) { - if ($this->insert_check()) { - if ($this->db_update()) - $this->selected_id = ''; + $this->get_posts(); + if ($this->update_check()) { + if ($this->db_update()) { + $this->selected_id = $this->_none; + $this->Mode = ''; + return; + } } + $this->Mode = $mode; } // // Add new record // - function _add() + function _add($mode) { + $this->get_posts(); if ($this->insert_check()) { $this->db_insert(); - $this->selected_id = ''; + $this->_cancel(); + return; } + $this->Mode = $mode; } // // Delete selected record @@ -118,28 +173,32 @@ class simple_crud { { if ($this->delete_check()) $this->db_delete(); - $this->selected_id = ''; + $this->_cancel(); } // // Return to listing view // function _cancel() { - $this->selected_id = ''; + $this->selected_id = $this->_none; + $this->db_cancel(); + $this->Mode = ''; } // // Clone record for new edition // function _cloning() { - $this->selected_id = '0'; + $this->Mode = ''; + $this->_edit('Edit'); + $this->selected_id = $this->_none; } /* Generate form controls */ function _bottom_controls() { - $clone = $this->selected_id == '0'; + $clone = $this->selected_id != $this->_none; $title=false; $async='both'; @@ -150,21 +209,22 @@ class simple_crud { if ($async === 'both') { $async = 'default'; $cancel = 'cancel'; } - else if ($async === 'default') + elseif ($async === 'default') $cancel = true; - else if ($async === 'cancel') + elseif ($async === 'cancel') $async = true; echo "
"; - if ($this->selected_id == '') - submit("{$base}Edit0", _("Add new"), true, $title, $async); + if ($this->Mode == '' || $this->Mode == 'RESET') + submit("{$base}NEW", _("Add new"), true, $title, $async); else { - if ($this->selected_id == '0') + if ($this->Mode == 'NEW' || $this->selected_id==$this->_none) + submit("{$base}ADD", _("Add"), true, $title, $async); else { - submit("{$base}UPDATE", _("Update"), true, _('Submit changes'), $async); + submit("{$base}UPDATE[{$this->selected_id}]", _("Update"), true, _('Submit changes'), $async); if ($clone) - submit("${base}CLONE", _("Clone"), true, _('Edit new record with current data'), $async); + submit("{$base}CLONE[{$this->selected_id}]", _("Clone"), true, _('Edit new record with current data'), $async); } submit("{$base}RESET", _("Cancel"), true, _('Cancel edition'), $cancel); } @@ -174,70 +234,143 @@ class simple_crud { // Public functions // + function tool_button($name, $selected_id=null, $params='') + { + $b = $this->tool_buttons[$name]; + + return "" + .button( "{$this->name}$name" + .($selected_id === null || $selected_id === $this->_none ? '': "[$selected_id]"), + $b[0], $b[1], $b[2], $b[3]).""; + } + + function set_posts() + { + foreach($this->fields as $name => $fmt) { + if (is_int($name)) { + $name = $fmt; + $fmt = array(); + } + $post = isset($fmt['post']) ? $fmt['post'] : $name; + $fld = isset($fmt['fld']) ? $fmt['fld'] : $name; + + $value = $this->selected_id == $this->_none ? (isset($fmt['dflt']) ? $fmt['dflt'] : null) : + (is_array($this->data) ? $this->data[$fld]: $this->data->$fld); + + $_POST[$post] = $this->_format_output($value, isset($fmt['fmt']) ? $fmt['fmt'] : null); + } + } + //-------------------------- + // + // Get editor POST variables. + // + function get_posts() { + foreach ($this->fields as $name => $fmt) { + if (is_int($name)) { + $name = $fmt; + $fmt = array(); + } + $post = isset($fmt['post']) ? $fmt['post'] : $name; + $fld = isset($fmt['fld']) ? $fmt['fld'] : $name; + + $value = $this->_format_input(@$_POST[$post], @$fmt['fmt']); + if (is_array($this->data)) + $this->data[$fld] = $value; + else + $this->data->$fld = $value; + } + } // Main function - display current CRUD editor content // function show() { - $this->_check_mode(true); + if (!isset($_POST[$this->name.'Mode'])) + $this->set_posts(); + + $Mode = $this->_check_mode(true); div_start($this->name.'_div'); - if (array_key_exists($this->Mode, $this->handlers)) { - $fun = $this->handlers[$this->Mode]; - $this->$fun(); + + if (array_key_exists($Mode, $this->pre_handlers)) { + $fun = $this->pre_handlers[$Mode]; + $this->$fun($Mode); } - if ($this->selected_id != '') - $this->editor(); + + if (isset($this->views[$this->Mode])) + $this->{$this->views[$this->Mode]}(); else - $this->listing(); + $this->{$this->views['']}(); // default view + $this->_bottom_controls(); - hidden($this->name.'_id', $this->selected_id); + // this is needed only when we use temporary crud object together with ajax screen updates + hidden($this->name.'Mode'.'['.$this->selected_id.']', $this->Mode); div_end(); } //=========================================================================== - // child class provided sql functions + // Database functions placeholders // // Read record from db for edition // function db_read() { - display_notification('read sql...'); + display_notification(__FUNCTION__. ' is not defined...'); + return array(); } // // Update record in db after edition // - function db_update() { - display_notification('update sql...'); + function db_update() + { + $this->db_insert(); } // // Delete record // function db_delete() { - display_notification('delete sql...'); + display_notification(__FUNCTION__. ' is not defined...'); + } + // + // Insert record + // + function db_insert() + { + display_notification(__FUNCTION__. ' is not defined...'); + } + // + // Cancel edition + // Optional things like focus set. + // + function db_cancel() + { } + function delete_check() { - display_notification('check delete ...'); + display_notification(__FUNCTION__. ' is not defined...'); return true; } - // - // Insert record - // - function db_insert() {} - function insert_check() { return true; } + function insert_check() { + return true; + } + + function update_check() + { + return $this->insert_check(); + } + // // Show database content in pager/table // - function listing() { - display_notification('listing ...'); + function list_view() { + display_notification(__FUNCTION__. ' is not defined...'); } // // Show record editor screen content // - function editor() { - display_notification('editor ...'); + function editor_view() { + display_notification(__FUNCTION__. ' is not defined...'); } }; -?> \ No newline at end of file