2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
13 // Template for simple table editors
19 var $_none = ''; // selector value when no item is selected
20 var $pre_handlers; // control buttons and related methods called before view display
29 function simple_crud($name, $fields = null)
32 $this->pre_handlers = array(
34 'Delete' => '_delete',
37 'UPDATE' => '_update',
42 '' => 'list_view', // default view
43 'Edit' => 'editor_view',
44 'Delete' => 'list_view',
45 'NEW' => 'editor_view',
46 'ADD' => 'editor_view',
47 'UPDATE' => 'editor_view',
48 'RESET' => 'list_view',
49 'CLONE' => 'editor_view'
51 $this->tool_buttons['Edit'] =
52 array(_('Edit'), _('Edit document line'), ICON_EDIT, '');
53 $this->tool_buttons['Delete'] =
54 array(_('Delete'), _('Remove line from document'), ICON_DELETE, '');
55 $this->tool_buttons['UPDATE'] =
56 array(_('Update'), _('Confirm changes'), ICON_UPDATE, '');
57 $this->tool_buttons['RESET'] =
58 array(_('Cancel'), _('Cancel changes'), ICON_CANCEL, '');
60 $this->fields = $fields;
61 $this->selected_id = $this->_none;
64 Input/output formatters - convert values between php/user domains.
66 function _format_input($value, $fmt)
70 $this->dec = get_qty_dec($value);
75 return user_numeric($value);
77 return user_numeric($value)/100;
85 function _format_output($value, $fmt)
89 return price_format($value);
91 return number_format2($value, $this->dec);
93 return number_format2($value);
95 return percent_format($value*100);
97 $this->dec = get_qty_dec($value); // retrieve dec for use in later qty fields
105 function _check_mode()
109 $sel_name = $this->name.'_id';
111 // list controls lookup
112 foreach (array_keys($this->pre_handlers) as $m) {
113 if (isset($_POST[$this->name.$m])) {
114 unset($_POST['_focus']); // focus on first form entry
115 $Ajax->activate($this->name.'_div');
116 $val = @key($_POST[$this->name.$m]);
117 $this->selected_id = $val!==null ? @quoted_printable_decode($val) : $this->_none;
121 return get_post($this->name.'Mode', '');
125 // Set record for edition
127 function _edit($mode)
129 if ($this->Mode != $mode) {
130 if ($this->selected_id != $this->_none) {
131 $this->data = $this->db_read();
133 $this->set_posts($this->data);
138 // Update record after edition
143 if ($this->update_check()) {
144 if ($this->db_update())
145 $this->selected_id = $this->_none;
155 if ($this->insert_check()) {
161 // Delete selected record
165 if ($this->delete_check())
170 // Return to listing view
174 $this->selected_id = $this->_none;
179 // Clone record for new edition
184 $this->_edit('Edit');
185 $this->selected_id = $this->_none;
188 Generate form controls
190 function _bottom_controls()
192 $clone = $this->selected_id != $this->_none;
200 if ($async === 'both') {
201 $async = 'default'; $cancel = 'cancel';
203 else if ($async === 'default')
205 else if ($async === 'cancel')
209 if ($this->Mode == '' || $this->Mode == 'RESET')
210 submit("{$base}NEW", _("Add new"), true, $title, $async);
212 if ($this->Mode == 'NEW' || $this->selected_id==$this->_none)
214 submit("{$base}ADD", _("Add"), true, $title, $async);
216 submit("{$base}UPDATE[{$this->selected_id}]", _("Update"), true, _('Submit changes'), $async);
218 submit("{$base}CLONE[{$this->selected_id}]", _("Clone"), true, _('Edit new record with current data'), $async);
220 submit("{$base}RESET", _("Cancel"), true, _('Cancel edition'), $cancel);
224 //===========================================================================
228 function tool_button($name, $selected_id=null, $params='')
230 $b = $this->tool_buttons[$name];
232 return "<td align='center' $params>"
233 .button( "{$this->name}$name"
234 .($selected_id === null || $selected_id === $this->_none ? '': "[$selected_id]"),
235 $b[0], $b[1], $b[2], $b[3])."</td>";
240 foreach($this->fields as $name => $fmt) {
245 $post = isset($fmt['post']) ? $fmt['post'] : $name;
246 $fld = isset($fmt['fld']) ? $fmt['fld'] : $name;
248 $value = $this->selected_id == $this->_none ? @$fmt['dflt'] :
249 (is_array($this->data) ? $this->data[$fld]: $this->data->$fld);
251 $_POST[$post] = $this->_format_output($value, @$fmt['fmt']);
254 //--------------------------
256 // Get editor POST variables.
258 function get_posts() {
259 foreach ($this->fields as $name => $fmt) {
264 $post = isset($fmt['post']) ? $fmt['post'] : $name;
265 $fld = isset($fmt['fld']) ? $fmt['fld'] : $name;
267 $value = $this->_format_input($_POST[$post], @$fmt['fmt']);
269 if (is_array($this->data))
270 $this->data[$fld] = $value;
272 $this->data->$fld = $value;
275 // Main function - display current CRUD editor content
279 if (!isset($_POST[$this->name.'Mode']))
282 $Mode = $this->_check_mode(true);
283 div_start($this->name.'_div');
285 if (array_key_exists($Mode, $this->pre_handlers)) {
286 $fun = $this->pre_handlers[$Mode];
290 if (isset($this->views[$this->Mode]))
291 $this->{$this->views[$this->Mode]}();
293 $this->{$this->views['']}(); // default view
295 $this->_bottom_controls();
296 hidden($this->name.'Mode', $this->Mode.'['.$this->selected_id.']');
300 //===========================================================================
301 // Database functions placeholders
304 // Read record from db for edition
307 display_notification(__FUNCTION__. ' is not defined...');
311 // Update record in db after edition
320 function db_delete() {
321 display_notification(__FUNCTION__. ' is not defined...');
328 display_notification(__FUNCTION__. ' is not defined...');
332 // Optional things like focus set.
339 function delete_check() {
340 display_notification(__FUNCTION__. ' is not defined...');
344 function insert_check() {
348 function update_check()
350 return $this->insert_check();
354 // Show database content in pager/table
356 function list_view() {
357 display_notification(__FUNCTION__. ' is not defined...');
361 // Show record editor screen content
363 function editor_view() {
364 display_notification(__FUNCTION__. ' is not defined...');